From 108de45bc4fa1fb9347db3de31c09b2da6380254 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 05:34:18 -0400 Subject: [PATCH 01/19] =?UTF-8?q?=F0=9F=9A=A7=20Surround=20one=20expansion?= =?UTF-8?q?=20with=20its=20canonical=20observation=20(#881=20PR=202,=20lay?= =?UTF-8?q?er=201a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Core issues a branded request before an element is resolved, the public `Component.expand` chain composes around it, and exactly one delegation of that exact request runs the work. The terminal keeps the canonical outcome in private state, so a handler that catches what canonical expansion raised does not rescue it, and one that returns without delegating refuses the work. Phases are published to each subscriber as its latest observation plus ordered changes, so a late reader is told where the element is rather than walked through a history it missed, and a slow or absent reader delays nothing. The invocation boundary now tells an observer when the body's own work ended, before its ordered teardown runs, which is the EXIT a reader watching a destructor needs. Work in progress: ACTIVE publication and the structural paths follow. --- packages/core/src/component-api.ts | 99 ++- packages/core/src/component-expansion.ts | 291 +++++++ packages/core/src/expand.ts | 981 ++++++++++++----------- packages/core/src/invocation.ts | 34 +- 4 files changed, 947 insertions(+), 458 deletions(-) create mode 100644 packages/core/src/component-expansion.ts diff --git a/packages/core/src/component-api.ts b/packages/core/src/component-api.ts index f65dd7f95..87fbcb4de 100644 --- a/packages/core/src/component-api.ts +++ b/packages/core/src/component-api.ts @@ -14,10 +14,11 @@ */ import { type Api, createApi, type Operations } from "@effectionx/context-api"; -import type { Operation } from "effection"; +import type { Operation, Result, Stream } from "effection"; import type { EvalScope } from "@effectionx/scope-eval"; import { settle } from "./errors.ts"; import type { BoundExecRequest } from "./bound-exec.ts"; +import type { Expansion } from "./expansion.ts"; import type { CodeBlockContext, CodeBlockResult, @@ -32,7 +33,64 @@ import type { SourcePosition, } from "./types.ts"; +/** + * Where one executable element has reached, as its observers are told. + * + * `enter` before anything is resolved, `active` where accepted work starts, + * `exit` where that work ends and its owned cleanup begins, and exactly one + * terminal observation — `complete` once canonical acceptance has reconciled + * the outcome, or `cancelled` where the element unwound cleanly instead. + * + * `complete` carries `Result` and nothing else: what the element + * produced, what it bound and which error identity canonical execution is + * holding stay private, so an observation says what happened and decides + * nothing about it. + */ +export type ComponentExpansionPhase = + | { readonly phase: "enter" } + | { readonly phase: "active" } + | { readonly phase: "exit"; readonly reason: "returned" | "failed" | "cancelled" } + | { readonly phase: "complete"; readonly result: Result } + | { readonly phase: "cancelled" }; + +/** + * One executable element's complete expansion, offered to whoever is watching. + * + * Issued by canonical execution before resolution, props validation or any + * body runs. It is an offer to surround the work, not a way to do it: the + * request is branded, it delegates once, and nothing on it reaches what the + * element produced. + */ +export interface ComponentExpansionRequest { + /** + * Core's detached description of the element this surrounds. + * + * Presentation information only. It names a logical source element, not a + * process call or a capability, and grants nothing. + */ + readonly expansion: Expansion; + /** + * The latest phase, then each change in order, per subscription. + * + * Independent and scope-owned: every subscriber gets its own, ending after + * the one terminal observation. Reading or cancelling a subscription neither + * starts nor cancels the element, and a reader that is slow or absent delays + * nothing. + */ + readonly phases: Stream; +} + export interface ComponentApi { + /** + * Surround one executable element's complete expansion (spec §5.7). + * + * Core issues the request before resolution or validation; delegate the + * exact request once with `next(request)`. Whatever a handler returns is + * ignored, catching a canonical failure does not rescue it, and completion + * includes owned teardown and final result acceptance. A handler may refuse + * the work by throwing or by returning without delegating. + */ + expand(request: ComponentExpansionRequest): Operation; /** * `"__root__"` imports the root document. * @@ -255,6 +313,21 @@ export function isMissingImportProvider(error: unknown, asked: string): boolean * process, and the lint rule that says so is right. */ const COMPONENT_DEFAULTS: Omit = { + /** + * Nothing issued this, so there is nothing to surround. + * + * The public descriptor's own terminal is reached only by a caller that + * built a request itself or kept one from an expansion that has gone. Either + * way no canonical work is behind it, and running a body for it is the one + * thing this seam must never do. + */ + // deno-lint-ignore require-yield + *expand(_request: ComponentExpansionRequest): Operation { + throw new Error( + "Component.expand() has no canonical expansion to surround: only core issues a request, " + + "and only the expansion that issued one can run it.", + ); + }, // deno-lint-ignore require-yield *importComponent( name: string, @@ -381,6 +454,30 @@ export function importThroughTerminal( return owned.operations.importComponent(name, position); } +/** + * Surround one expansion through a descriptor whose terminal belongs to it. + * + * The same correlation `importThroughTerminal` makes, for the same reason: the + * name shares every installed handler, and the default each `createApi()` + * instance owns is this one element's continuation. Two elements expanding at + * once have two descriptors and two terminals, and a counterfeit descriptor + * built with the same name changes only the calls made through it. + */ +export function expandThroughTerminal( + request: ComponentExpansionRequest, + terminal: (delegated: ComponentExpansionRequest) => Operation, +): Operation { + const owned = createApi("Component", { + ...COMPONENT_DEFAULTS, + registry: new Map(), + *expand(delegated: ComponentExpansionRequest): Operation { + yield* terminal(delegated); + }, + }); + return owned.operations.expand(request); +} + +export const expand: Operations["expand"] = Component.operations.expand; export const importComponent: Operations["importComponent"] = Component.operations.importComponent; export const applyModifiers: Operations["applyModifiers"] = diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts new file mode 100644 index 000000000..40bc9ec26 --- /dev/null +++ b/packages/core/src/component-expansion.ts @@ -0,0 +1,291 @@ +/** + * Canonical expansion observation (spec §5.7). + * + * One executable element, surrounded from before its resolution through its + * owned cleanup and the acceptance of what it produced. Core issues a request, + * the public `Component.expand` chain composes around it, and exactly one + * delegation of that exact request runs the work. + * + * Observation only. What middleware returns is ignored, what it catches it does + * not rescue, and the outgoing result stays private until canonical acceptance + * has reconciled it — so an observer learns what happened and decides nothing + * about it. The authority is the same one `bound-exec.ts` keeps: a private + * brand nothing outside can forge, a claim that can be spent once, and a + * settlement readable whether or not the chain returned normally. + */ + +import { createQueue, ensure } from "effection"; +import type { Operation, Queue, Stream } from "effection"; +import type { ComponentExpansionPhase, ComponentExpansionRequest } from "./component-api.ts"; +import type { Expansion } from "./expansion.ts"; + +/** What an observer did that canonical expansion cannot act on. */ +export class ComponentExpansionProtocolError extends Error { + override name = "ComponentExpansionProtocolError"; + constructor(problem: string) { + super( + `Component.expand middleware ${problem}. A handler may observe, refuse or delegate an ` + + "expansion; only canonical execution runs one.", + ); + } +} + +/** + * The latest phase, then what happens next, per subscriber. + * + * Latest rather than every earlier phase: an observer that arrives while an + * element is already active wants to know that it is active, not to be walked + * through a history it missed. One queue per subscription, filled + * synchronously, so a reader that is slow or never reads at all delays nothing — + * execution never waits for an observer, and cancelling a subscription neither + * starts nor stops the work it was watching. + */ +interface PhasePublication { + readonly phases: Stream; + /** Publish one non-terminal phase. */ + publish(phase: ComponentExpansionPhase): void; + /** Publish the one terminal phase and close every subscription with void. */ + finish(phase: ComponentExpansionPhase): void; +} + +function createPhasePublication(): PhasePublication { + const subscribers = new Set>(); + let latest: ComponentExpansionPhase | undefined; + let closed = false; + + const deliver = (phase: ComponentExpansionPhase): void => { + latest = phase; + for (const queue of subscribers) { + queue.add(phase); + } + }; + + return { + phases: { + *[Symbol.iterator]() { + const queue = createQueue(); + // Registered with its latest observation in one step, so nothing can + // land between reading the latest phase and being told the next one. + if (latest !== undefined) { + queue.add(latest); + } + if (closed) { + queue.close(); + return queue; + } + subscribers.add(queue); + yield* ensure(() => { + subscribers.delete(queue); + }); + return queue; + }, + }, + publish(phase: ComponentExpansionPhase): void { + if (!closed) { + deliver(phase); + } + }, + finish(phase: ComponentExpansionPhase): void { + if (closed) { + return; + } + deliver(phase); + closed = true; + for (const queue of subscribers) { + queue.close(); + } + subscribers.clear(); + }, + }; +} + +/** What canonical expansion kept about one element while it ran. */ +interface ExpansionWork { + consumed: boolean; + /** The canonical failure, kept whether or not a handler caught it. */ + failure?: { readonly raised: unknown }; + /** Whether the delegated work ran to its own completion. */ + ran: boolean; +} + +/** + * One element's request, branded so nothing outside this module can build one. + * + * The brand is what makes delegation exact: a copy carrying the same members is + * not this request, and a handler holding one from a sibling expansion cannot + * spend it here. + */ +class CanonicalExpansionRequest implements ComponentExpansionRequest { + readonly #work: ExpansionWork; + readonly expansion: Expansion; + readonly phases: Stream; + + constructor(work: ExpansionWork, expansion: Expansion, publication: PhasePublication) { + this.#work = work; + this.expansion = expansion; + this.phases = publication.phases; + Object.freeze(this); + } + + /** The work `request` speaks for, once, or the refusal saying why it speaks for none. */ + static claim(request: unknown): ExpansionWork { + if (!CanonicalExpansionRequest.own(request)) { + throw new ComponentExpansionProtocolError( + "delegated a request canonical execution did not issue", + ); + } + const work = request.#work; + if (work.consumed) { + throw new ComponentExpansionProtocolError("delegated one expansion more than once"); + } + work.consumed = true; + return work; + } + + /** Whether this class built `value`, answered without trusting it. */ + static own(value: unknown): value is CanonicalExpansionRequest { + if (typeof value !== "object" || value === null) { + return false; + } + try { + return #work in value; + } catch { + return false; + } + } +} + +/** What canonical expansion produced for one element. */ +export type ExpansionSettlement = + /** The delegated work ran and settled on its own terms. */ + | { readonly status: "ran" } + /** Canonical expansion raised this exact failure. Not middleware's to rescue. */ + | { readonly status: "raised"; readonly raised: unknown } + /** The terminal was never reached, so no work ran. */ + | { readonly status: "absent"; readonly refusal: ComponentExpansionProtocolError }; + +/** One element's issued request, and what canonical core reads back from it. */ +export interface IssuedExpansion { + readonly request: ComponentExpansionRequest; + /** Publish `enter`, `active` and `exit` as the work reaches them. */ + publish(phase: ComponentExpansionPhase): void; + /** + * Publish the one terminal phase and close every subscription. + * + * Called after the whole dispatch has unwound and canonical acceptance is + * reconciled, which is why it is not the terminal's own business: middleware + * cleanup runs outside the terminal, and a completion published before it + * would say the element had finished while its observers were still running. + */ + finish(phase: ComponentExpansionPhase): void; + /** + * What canonical expansion settled to. + * + * Readable whether or not the public chain returned normally, so a handler + * that catches what canonical expansion raised cannot turn it into silence. + */ + settlement(): ExpansionSettlement; +} + +/** Issue one element's expansion, retaining what canonical core reads back. */ +export function issueComponentExpansion(expansion: Expansion): IssuedExpansion { + const work: ExpansionWork = { consumed: false, ran: false }; + const publication = createPhasePublication(); + return { + request: new CanonicalExpansionRequest(work, expansion, publication), + publish(phase: ComponentExpansionPhase): void { + publication.publish(phase); + }, + finish(phase: ComponentExpansionPhase): void { + publication.finish(phase); + }, + settlement(): ExpansionSettlement { + const failure = work.failure; + if (failure !== undefined) { + return { status: "raised", raised: failure.raised }; + } + if (!work.consumed) { + return { + status: "absent", + refusal: new ComponentExpansionProtocolError("returned without delegating the expansion"), + }; + } + if (!work.ran) { + return { + status: "raised", + raised: new ComponentExpansionProtocolError("returned before the expansion settled"), + }; + } + return { status: "ran" }; + }, + }; +} + +/** + * Run the canonical work for one issued request, once. + * + * Canonical core's terminal calls this with whatever middleware delegated, so a + * rewritten, copied or fabricated request runs nothing rather than running + * something else. `run` is canonical core's own continuation: it is reached only + * from here, so a handler that does not delegate never reaches it. + */ +export function* claimComponentExpansion( + request: unknown, + run: () => Operation, +): Operation { + const work = CanonicalExpansionRequest.claim(request); + try { + yield* run(); + } catch (error) { + // Kept whether or not a handler catches what propagates: a failure + // canonical expansion raised is not middleware's to rescue. + work.failure = { raised: error }; + throw error; + } + work.ran = true; +} + +/** + * One failure as an observation: what it is called and what it said, detached. + * + * A new Error every time, never the one canonical execution is holding. An + * observer learns the selected name and message, and the explanatory Errors + * behind them, and reaches no canonical identity, no resource an error happens + * to carry and nothing `instanceof` would recognize — so catching an + * observation cannot be mistaken for catching the failure, and a reporter that + * serializes one carries away no live object. + * + * Depth is bounded because a cause chain is somebody else's data structure and + * may be cyclic. + */ +export function reported(raised: unknown, depth = 0): Error { + if (!(raised instanceof Error)) { + return Object.freeze(new Error(String(raised))); + } + const explained = depth >= REPORTED_DEPTH ? undefined : explanatory(raised, depth); + const detached = + raised instanceof AggregateError + ? new AggregateError(explained?.members ?? [], raised.message) + : new Error(raised.message); + detached.name = raised.name; + if (explained?.cause !== undefined) { + detached.cause = explained.cause; + } + return Object.freeze(detached); +} + +/** How far a detached report follows somebody else's cause chain. */ +const REPORTED_DEPTH = 8; + +function explanatory( + raised: Error, + depth: number, +): { readonly cause: Error | undefined; readonly members: Error[] } { + return { + cause: raised.cause instanceof Error ? reported(raised.cause, depth + 1) : undefined, + members: + raised instanceof AggregateError && Array.isArray(raised.errors) + ? raised.errors.map((member) => reported(member, depth + 1)) + : [], + }; +} diff --git a/packages/core/src/expand.ts b/packages/core/src/expand.ts index 1ba20ed2c..f4de17e1f 100644 --- a/packages/core/src/expand.ts +++ b/packages/core/src/expand.ts @@ -124,6 +124,13 @@ import type { IdentityDomain } from "./invocation-identity.ts"; import { protectedContentLease } from "./protected-content.ts"; import type { SyntaxReference } from "./syntax-reference.ts"; import { withInvocation } from "./invocation.ts"; +import { + claimComponentExpansion, + issueComponentExpansion, + reported, +} from "./component-expansion.ts"; +import { expandThroughTerminal } from "./component-api.ts"; +import type { ComponentExpansionPhase } from "./component-api.ts"; import type { Invocation } from "./invocation.ts"; import { ActiveProjection } from "./projection.ts"; import type { ProjectionHandle, ProjectionRequest } from "./projection.ts"; @@ -2688,498 +2695,562 @@ function* expandComponent( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - // Cycle detection — Prosser's algorithm - if (hideSet.has(name)) { - return [ - yield* raise({ - type: "error", - message: `Cycle detected: ${name} is already being expanded (hide set: ${[...hideSet].join(" → ")})`, - source: name, - }), - ]; - } - - if (hideSet.size >= MAX_EXPANSION_DEPTH) { - return [ - yield* raise({ - type: "error", - message: `Maximum expansion depth (${MAX_EXPANSION_DEPTH}) exceeded`, - source: name, - }), - ]; - } - - let imported: ComponentDefinition | FunctionComponentDefinition; - // Opened before the ask and settled the moment it answers, however it - // answered: what canonical resolution selected here is what decides whether - // this invocation is in one of this execution's identity domains, and nothing - // on the answer or in the chain carries it (`invocation-identity.ts`). - // - // The frame is this dispatch's closure, and the terminal built for this one - // import is the only thing that can select into it. That is what makes it this - // invocation's own: a sibling `` resolving the same name at the same - // time has its own frame behind its own terminal, and a handler delegating - // through any number of descendant scopes still arrives at this one. - const selection = environment?.componentIdentity?.beginImport(name); - let selected: IdentityDomain | undefined; - let dispatcher: FunctionComponent | undefined; - /** - * Whether canonical execution answered this import for a name it closed. - * - * The provenance exact source is read from. An open import's answer — the - * chain's, unverified — never sets it, so nothing a handler writes into a - * definition can reach the presentation decision below. - */ - let authorizedCanonically = false; + // Issued before resolution, props validation or any body: what an observer + // is offered is the whole of this element's expansion, including the parts + // that decide whether it has one. + const issued = issueComponentExpansion(snapshot(path, name, position)); + let produced: Segment[] = []; + let terminated = false; + const terminate = (phase: ComponentExpansionPhase): void => { + if (!terminated) { + terminated = true; + issued.finish(phase); + } + }; + issued.publish({ phase: "enter" }); + let chainFailure: unknown; + let chainFailed = false; try { - // The public chain answers, and canonical execution decides whether the - // answer is one it produced. In a closed execution — a workflow holding a - // component bundle, a generated fragment holding an allowlist — a handler - // may observe this import, delegate it, and refuse it by throwing; nothing - // it returns is invoked. Without an environment the answer is whatever the - // chain produced, exactly as it always was. - // The offer is open for exactly this ask. Middleware composes inside it and - // may observe, delegate or refuse the import; what it cannot do is obtain - // the declaration for an element that did not author it, because the offer - // is made from the closure the segments being expanded carry, is spent by - // whatever asks first, and authorizes only the answer it produced itself. - const offered = environment?.installedComponents?.offer(environment.componentBodyScope, name); - let answered: ImportedDefinition; try { - // Through this import's own terminal when the execution handed expansion - // one: the public middleware chain composes around it by name, and `next` - // terminates in the continuation that carries this frame. Where expansion - // was handed none — driven directly, or a generated fragment answering - // through its own narrowed provider — the ordinary public operation answers - // exactly as it always did. - answered = - imports === undefined - ? yield* importComponent(name, position) - : yield* importThroughTerminal(name, position, (asked, at) => - imports(asked, at, selection), - ); - } finally { - offered?.close(); + yield* expandThroughTerminal(issued.request, (delegated) => + claimComponentExpansion(delegated, function* () { + produced = yield* work(); + }), + ); + } catch (error) { + chainFailure = error; + chainFailed = true; } - selected = selection?.settle(); - // A private import is authorized by the ask that made the offer, and by - // nothing else. Not by the name: a private component runs for the element - // the declaration that carries it authored, so an answer kept from another - // import — however exactly it describes the same definition — authorizes - // nothing here. And a private name written where no offer was made never - // reaches this at all: selection resolves it to nothing, so what arrives is - // the ordinary unresolved failure. - let authorizedPrivate = false; - if (environment?.installedComponents?.declaresPrivate(name) === true) { - imported = requirePrivate(offered, name, answered); - authorizedPrivate = true; - environment.forms?.select(name, imported); - } else if ( - environment?.componentResolution === undefined || - !environment.componentResolution.resolves(name) - ) { - // Closed for this exact name, not for the execution that closed it. A - // bundled run closes every import; a host that declared exact Markdown - // closed the names it declared, and an unrelated one is the open import it - // has always been — the chain's answer, unverified, with no selection - // recorded against it. - imported = answered; - } else { - imported = environment.componentResolution.verify(name, answered); - // This import is canonical execution's own answer for a name this - // execution closed, which is the only provenance exact source is read - // from. An open import — one no tier claims — never sets it, however its - // answer describes itself. - authorizedCanonically = true; - // Closed authorization answers with core's retained copy rather than the - // object the resolver recorded, and the copy is what this expansion - // invokes — so the selection is recorded against it too. Only here: an - // open execution's answer travelled through public middleware, and - // nothing it hands back is canonical resolution's product. The record - // takes its dispatcher from the copy's own `fn`, identical by retention; - // a wrapper whose `fn` is no dispatcher records nothing, so a dispatcher - // an environment recorded explicitly is never displaced. - environment.forms?.select(name, imported); + // Reconciled after the whole dispatch has unwound, middleware cleanup + // included, so what completion says accounts for everything this element + // owned. A handler may refuse the work or fail a success; what it cannot do + // is rescue what canonical expansion raised, which is read back from the + // terminal rather than from whether the chain returned normally. + const settlement = issued.settlement(); + if (settlement.status === "raised") { + terminate({ phase: "complete", result: Err(reported(settlement.raised)) }); + throw settlement.raised; } - // Whatever tier answered, and whatever this execution declares, an - // implementation some declaration's private closure built runs only for an - // import that closure authorized. Neither the name nor the current - // execution can decide it: an answer kept from a legitimate private import - // can be returned for any *other* name, in a copy of the definition, and in - // a later run that declares nothing at all — and a run that has ended - // authorizes nothing. - if (!authorizedPrivate) { - refuseEscapedPrivate(name, imported); + const refusal = + settlement.status === "absent" + ? chainFailed + ? chainFailure + : settlement.refusal + : undefined; + if (refusal !== undefined) { + terminate({ phase: "complete", result: Err(reported(refusal)) }); + throw refusal; } - // Read off the answer rather than from a frame the engine opened: what is - // recognized is the exact definition canonical resolution produced for this - // exact name, whenever it produced it. - dispatcher = environment?.forms?.dispatcherFor(name, imported); - } catch (error) { - selection?.settle(); - // Import is a durable effect, so it is the other place a stale journal - // entry can surface. - const fatal = fatalCause(error); - if (fatal !== undefined) { - throw fatal; + if (chainFailed) { + terminate({ phase: "complete", result: Err(reported(chainFailure)) }); + throw chainFailure; } - return [ - yield* raise({ - type: "error", - message: - error instanceof Error - ? `Failed to import component ${name}: ${error.message}` - : `Failed to import component ${name}: ${String(error)}`, - source: name, - }), - ]; - } - - // Function component: call the generator function directly - if (imported.kind === "function") { - return yield* expandFunctionComponent( - name, - props, - expressions, - authoredExpressions, - children, - selfClosing, - imported, - hideSet, - counter, - projectedEnv, - position, - callerMeta, - callerProps, - owner, - path, - checkedFailures, - environment, - imports, - returnBody, - selected, - dispatcher, - ); - } - - const definition = imported; - - // What this definition's own body may write. A declaration carries its - // private closure here; every other body carries whatever the caller carried, - // which for an ordinary document is nothing. Decided from the definition - // canonical resolution retained — the one this expansion is about to invoke, - // reporting the origin core declared — rather than from the name alone. - const bodyEnvironment = environmentForBody(environment, name, definition); - - const placementError = validateBodyStructure(definition.bodySegments, definition.returns); - if (placementError) { - return [yield* raise(placementError)]; - } - - const asExpression = asExpressionViolation(name, expressions); - if (asExpression !== undefined) { - return [yield* raise({ type: "error", message: asExpression.message, source: name })]; - } - - // Resolve eval expression props against env.values using the shared - // VM context. This must happen before validation so that resolved - // values can be type-checked. See spec §5.1 (expression prop evaluation). - let resolvedProps: Record; - try { - resolvedProps = yield* resolveExpressionProps(props, expressions, name, projectedEnv); - } catch (error) { - return [ - yield* raise({ - type: "error", - message: error instanceof Error ? error.message : String(error), - source: name, - }), - ]; + terminate({ phase: "complete", result: Ok(undefined) }); + return produced; + } finally { + // Nothing terminal was published, so this element unwound without + // completing: a clean cancellation, told after it has finished unwinding. + terminate({ phase: "cancelled" }); } - // Validate caller props against the component's declared props schema. - // Strip the `slot` prop before validation — it is consumed by the - // expansion engine for slot assignment, not forwarded to the child. - let validatedProps: Record; - let asBinding: string | undefined; - try { - const refused = asBindingViolation(name, resolvedProps.as); - if (refused !== undefined) { - throw new Error(refused.message); + function* work(): Operation { + // Cycle detection — Prosser's algorithm + if (hideSet.has(name)) { + return [ + yield* raise({ + type: "error", + message: `Cycle detected: ${name} is already being expanded (hide set: ${[...hideSet].join(" → ")})`, + source: name, + }), + ]; } - asBinding = capturedBinding(resolvedProps.as); - - const { slot: _slot, as: _as, ...propsForValidation } = resolvedProps; - validatedProps = yield* validateProps(name, propsForValidation, definition.props); - } catch (error) { - return [yield* raise(schemaValidationErrorSegment(error, name))]; - } - - const missingCapture = returnCaptureViolation(name, definition.returns !== undefined, asBinding); - if (missingCapture !== undefined) { - return [yield* raise({ type: "error", message: missingCapture.message, source: name })]; - } - // Capture the caller's eval environment before creating the component's - // own env. Children are caller-provided content — expression props like - // {pr} should resolve against the scope where the JSX was written, not - // the component that renders . - // - // For multi-level nesting (Root → Provider → Instruction → ReviewBody), - // the projectedEnv from the outer caller must be merged with the current - // context env so that ancestor bindings propagate through all levels. - // The current context env's ordinary bindings take precedence; the shared - // layering helper keeps a projected caller's props object lexical. - const contextEnv = yield* env; - const callerEvalEnv = layerEnvironments(projectedEnv, contextEnv); - - // Recurse with augmented hide set. - // Each component gets its own fresh binding environment so that - // eval blocks within a component share bindings but don't leak - // into parent or sibling components. This is critical for the - // provider pattern where each provider has isolated port/URL bindings. - // - // Each component also gets its own EvalScope, created as a child of - // the parent component's eval scope. This ensures that middleware - // installed via `persist eval` blocks (e.g., Sample.around()) is - // scoped to the component. Nested providers produce a scope chain - // where innermost middleware runs first (innermost-wins), and - // next() delegates to the parent scope's middleware. - const newHideSet = new Set([...hideSet, name]); - const componentEnv: EvalEnv = propsEnvironment(validatedProps); - liveEnvironment(componentEnv); - - // Children are caller-provided content, not the component's own body. - // Use the parent's hide set (without the current component name) so - // that caller-provided children can reference the same component name - // without triggering false cycle detection. True cycles in a component's - // body are still caught because body expansion uses newHideSet. - // - // Use the caller's eval env for the same reason: expression props (e.g. - // {pr}) resolve against the scope where the JSX was written. - const capturedCallerEnv = callerEvalEnv ?? componentEnv; - // A body eval block can render errors away through a string projection - // (renderChildren, render, useContent); the buffer records them so an - // `as=` capture can be refused (§6.5). - const bodyContentErrors: Segment[] = []; - - // Read before the invocation exists: the eval scope ambient here is the - // caller's, and it is what `retain()` creates resources in. The loop is read - // here for the same reason — it is the one the caller's content was written - // in, and the invocation is about to clear it for the component's own body. - const siteEvalScope = yield* evalScope; - const siteLoop = yield* ActiveLoop.get(); - const siteReturn = returnBody; - - const expansion = snapshot(path, name, position); - - // Both bodies run inside one invocation, so a value component owns its - // resources exactly like a rendered one. - let claimProjection: ClaimFn = passthroughClaim; - - function* installInvocation(invocation: Invocation): Operation { - const enclosing = yield* ActiveProjection.get(); - const handle = createProjectionHandle({ - invocation, - enclosing, - children, - caller: { - env: capturedCallerEnv, - meta: callerMeta, - props: callerProps, - hideSet, - }, - authored: { - env: componentEnv, - meta: definition.meta, - props: validatedProps, - hideSet: newHideSet, - }, - counter, - callerLoop: siteLoop, - callerReturn: siteReturn, - ownPath: path, - printedErrors: bodyContentErrors, - checkedFailures, - environment, - imports, - }); - // Published on the eval scope, which every task the invocation owns - // descends from — including its persist-eval blocks and its content. - invocation.evalScope.scope.set(ActiveProjection, handle); - claimProjection = handle.claim; - - // The component's own body is isolated from the loop that invoked it: a - // `` written here belongs to a `` written here. Set on the body - // task, which the content scope descends from — so each projection restores - // the caller's frame for the caller's own text (createProjectionHandle), - // and anything the body does outside a projection finds none. - yield* ActiveLoop.set(undefined); - - // And from the caller's value body for the same reason: a written - // here satisfies this component's own `returns`, never the caller's. A - // value body installs its own frame below; a rendered one owns none, so a - // written in it stays reserved. - // Published on the body task, so the component's own body and everything it - // owns read this expansion, and a nested one uncovers it again on the way - // out (§5.6). - yield* publishExpansion(expansion); - - // Installed on the invocation's own body task rather than a nested - // scoped(): anything the body acquires must still be alive when teardown - // halts the content scope, and it is released by the body's own stage. - yield* provideEnv(componentEnv); - yield* provideEvalScope(invocation.evalScope); - yield* provideRetain(siteEvalScope); - - // Render closures (spec §4.8). Non-serializable, so serializeExports - // omits them from the journal. The optional error mode is supplied by a - // persistent evaluation's binding snapshot (§4.3), which knows the error mode of the - // block that started the projection; an ordinary block leaves it unset and - // the projection site's error mode applies. - componentEnv.values.renderChildren = (override?: unknown, mode?: ErrorMode) => - handle.projectToString({ - kind: "children", - override: validateRenderOverride(override), - mode, - }); - componentEnv.values.render = (markdown: unknown, mode?: ErrorMode) => - handle.projectToString({ - kind: "markdown", - segments: scanSegments(String(markdown)), - mode, - }); - componentEnv.values.useContent = (slot?: unknown, mode?: ErrorMode) => - handle.projectToString({ - kind: "slot", - name: slot === undefined ? undefined : String(slot), - mode, - }); - } + if (hideSet.size >= MAX_EXPANSION_DEPTH) { + return [ + yield* raise({ + type: "error", + message: `Maximum expansion depth (${MAX_EXPANSION_DEPTH}) exceeded`, + source: name, + }), + ]; + } - const returns = definition.returns; - if (returns !== undefined) { - let value: Json; + let imported: ComponentDefinition | FunctionComponentDefinition; + // Opened before the ask and settled the moment it answers, however it + // answered: what canonical resolution selected here is what decides whether + // this invocation is in one of this execution's identity domains, and nothing + // on the answer or in the chain carries it (`invocation-identity.ts`). + // + // The frame is this dispatch's closure, and the terminal built for this one + // import is the only thing that can select into it. That is what makes it this + // invocation's own: a sibling `` resolving the same name at the same + // time has its own frame behind its own terminal, and a handler delegating + // through any number of descendant scopes still arrives at this one. + const selection = environment?.componentIdentity?.beginImport(name); + let selected: IdentityDomain | undefined; + let dispatcher: FunctionComponent | undefined; + /** + * Whether canonical execution answered this import for a name it closed. + * + * The provenance exact source is read from. An open import's answer — the + * chain's, unverified — never sets it, so nothing a handler writes into a + * definition can reach the presentation decision below. + */ + let authorizedCanonically = false; try { - value = yield* withInvocation(function* (invocation) { - yield* installInvocation(invocation); - return yield* expandValueBody( - name, - returns, - definition.bodySegments, - children, - definition.meta, - validatedProps, - newHideSet, - counter, - callerEvalEnv ?? undefined, - claimProjection, - path, - checkedFailures, - bodyEnvironment, - imports, - returnBody, - ); - }); + // The public chain answers, and canonical execution decides whether the + // answer is one it produced. In a closed execution — a workflow holding a + // component bundle, a generated fragment holding an allowlist — a handler + // may observe this import, delegate it, and refuse it by throwing; nothing + // it returns is invoked. Without an environment the answer is whatever the + // chain produced, exactly as it always was. + // The offer is open for exactly this ask. Middleware composes inside it and + // may observe, delegate or refuse the import; what it cannot do is obtain + // the declaration for an element that did not author it, because the offer + // is made from the closure the segments being expanded carry, is spent by + // whatever asks first, and authorizes only the answer it produced itself. + const offered = environment?.installedComponents?.offer(environment.componentBodyScope, name); + let answered: ImportedDefinition; + try { + // Through this import's own terminal when the execution handed expansion + // one: the public middleware chain composes around it by name, and `next` + // terminates in the continuation that carries this frame. Where expansion + // was handed none — driven directly, or a generated fragment answering + // through its own narrowed provider — the ordinary public operation answers + // exactly as it always did. + answered = + imports === undefined + ? yield* importComponent(name, position) + : yield* importThroughTerminal(name, position, (asked, at) => + imports(asked, at, selection), + ); + } finally { + offered?.close(); + } + selected = selection?.settle(); + // A private import is authorized by the ask that made the offer, and by + // nothing else. Not by the name: a private component runs for the element + // the declaration that carries it authored, so an answer kept from another + // import — however exactly it describes the same definition — authorizes + // nothing here. And a private name written where no offer was made never + // reaches this at all: selection resolves it to nothing, so what arrives is + // the ordinary unresolved failure. + let authorizedPrivate = false; + if (environment?.installedComponents?.declaresPrivate(name) === true) { + imported = requirePrivate(offered, name, answered); + authorizedPrivate = true; + environment.forms?.select(name, imported); + } else if ( + environment?.componentResolution === undefined || + !environment.componentResolution.resolves(name) + ) { + // Closed for this exact name, not for the execution that closed it. A + // bundled run closes every import; a host that declared exact Markdown + // closed the names it declared, and an unrelated one is the open import it + // has always been — the chain's answer, unverified, with no selection + // recorded against it. + imported = answered; + } else { + imported = environment.componentResolution.verify(name, answered); + // This import is canonical execution's own answer for a name this + // execution closed, which is the only provenance exact source is read + // from. An open import — one no tier claims — never sets it, however its + // answer describes itself. + authorizedCanonically = true; + // Closed authorization answers with core's retained copy rather than the + // object the resolver recorded, and the copy is what this expansion + // invokes — so the selection is recorded against it too. Only here: an + // open execution's answer travelled through public middleware, and + // nothing it hands back is canonical resolution's product. The record + // takes its dispatcher from the copy's own `fn`, identical by retention; + // a wrapper whose `fn` is no dispatcher records nothing, so a dispatcher + // an environment recorded explicitly is never displaced. + environment.forms?.select(name, imported); + } + // Whatever tier answered, and whatever this execution declares, an + // implementation some declaration's private closure built runs only for an + // import that closure authorized. Neither the name nor the current + // execution can decide it: an answer kept from a legitimate private import + // can be returned for any *other* name, in a copy of the definition, and in + // a later run that declares nothing at all — and a run that has ended + // authorizes nothing. + if (!authorizedPrivate) { + refuseEscapedPrivate(name, imported); + } + // Read off the answer rather than from a frame the engine opened: what is + // recognized is the exact definition canonical resolution produced for this + // exact name, whenever it produced it. + dispatcher = environment?.forms?.dispatcherFor(name, imported); } catch (error) { - // Body fail-fast propagates unchanged; a return-value failure is the - // component's own printed error and follows the caller's error mode. + selection?.settle(); + // Import is a durable effect, so it is the other place a stale journal + // entry can surface. const fatal = fatalCause(error); if (fatal !== undefined) { throw fatal; } - return [yield* raise(schemaValidationErrorSegment(error, name))]; - } - - // Bind only after the invocation has torn down, so the value reaches the - // caller's environment and never the component's own. - const parentEnv = yield* env; - if (!parentEnv || asBinding === undefined) { return [ yield* raise({ type: "error", - message: `Prop "as" on <${name} /> requires a parent evaluation environment.`, + message: + error instanceof Error + ? `Failed to import component ${name}: ${error.message}` + : `Failed to import component ${name}: ${String(error)}`, source: name, }), ]; } - parentEnv.values[asBinding] = value; - return []; - } - const bodyOwner = asBinding === undefined ? owner : undefined; - // Where this body's own segments start, so what it renders can be told apart - // from what the caller had already produced into the same array. - const renderedFrom = bodyOwner?.length ?? 0; - const expanded = yield* withInvocation(function* (invocation) { - yield* installInvocation(invocation); - return yield* expandBody( - definition.bodySegments, - children, - definition.meta, - validatedProps, - newHideSet, - counter, - callerEvalEnv ?? undefined, - claimProjection, - bodyOwner, - path, - checkedFailures, - bodyEnvironment, - imports, - returnBody, - ); - }); + // Function component: call the generator function directly + if (imported.kind === "function") { + return yield* expandFunctionComponent( + name, + props, + expressions, + authoredExpressions, + children, + selfClosing, + imported, + hideSet, + counter, + projectedEnv, + position, + callerMeta, + callerProps, + owner, + path, + checkedFailures, + environment, + imports, + returnBody, + selected, + dispatcher, + ); + } - // Exact source is a provenance, and both halves of it are read here from - // things no answer can write: that canonical execution authorized this import - // for a name this execution closed, and that the *host's own admitted - // declaration* for that name states exact source. A definition claiming the - // disposition, or segments arriving already marked, decide nothing. - // - // What a component declared exact renders is exact wherever it renders: the - // caller's flow, its own returned region, or neither when the invocation - // binds instead. Recording it here — against the segments this body produced, - // after it produced them — is what carries the fact to the emission loop, - // which is outside every scope the invocation owned. - if (authorizedCanonically && environment?.installedComponents?.declaresExact(name) === true) { - markExactSource( - environment?.sourceSegments, - bodyOwner === undefined ? expanded : bodyOwner.slice(renderedFrom), - ); - } + const definition = imported; - if (asBinding) { - // A capture never swallows an error. The body reported these where they - // were created (§6.9) — including the ones a string projection rendered - // away — so they are handed back as they are and the binding stays unset. - // Recorded errors precede expanded ones regardless of source position; - // the order across the two lists is deliberately unspecified. - const errors = [ - ...bodyContentErrors, - ...expanded.filter((capturedSegment) => capturedSegment.type === "error"), - ]; - if (errors.length > 0) { - return errors; + // What this definition's own body may write. A declaration carries its + // private closure here; every other body carries whatever the caller carried, + // which for an ordinary document is nothing. Decided from the definition + // canonical resolution retained — the one this expansion is about to invoke, + // reporting the origin core declared — rather than from the name alone. + const bodyEnvironment = environmentForBody(environment, name, definition); + + const placementError = validateBodyStructure(definition.bodySegments, definition.returns); + if (placementError) { + return [yield* raise(placementError)]; } - const parentEnv = yield* env; - if (!parentEnv) { + const asExpression = asExpressionViolation(name, expressions); + if (asExpression !== undefined) { + return [yield* raise({ type: "error", message: asExpression.message, source: name })]; + } + + // Resolve eval expression props against env.values using the shared + // VM context. This must happen before validation so that resolved + // values can be type-checked. See spec §5.1 (expression prop evaluation). + let resolvedProps: Record; + try { + resolvedProps = yield* resolveExpressionProps(props, expressions, name, projectedEnv); + } catch (error) { return [ yield* raise({ type: "error", - message: `Prop "as" on <${name} /> requires a parent evaluation environment.`, + message: error instanceof Error ? error.message : String(error), source: name, }), ]; } - parentEnv.values[asBinding] = renderSegments(expanded); - return []; - } - // A rendering body already wrote into the owner, so there is nothing left to - // hand back; one that kept its own returns what it rendered. - return bodyOwner === undefined ? expanded : []; + // Validate caller props against the component's declared props schema. + // Strip the `slot` prop before validation — it is consumed by the + // expansion engine for slot assignment, not forwarded to the child. + let validatedProps: Record; + let asBinding: string | undefined; + try { + const refused = asBindingViolation(name, resolvedProps.as); + if (refused !== undefined) { + throw new Error(refused.message); + } + asBinding = capturedBinding(resolvedProps.as); + + const { slot: _slot, as: _as, ...propsForValidation } = resolvedProps; + validatedProps = yield* validateProps(name, propsForValidation, definition.props); + } catch (error) { + return [yield* raise(schemaValidationErrorSegment(error, name))]; + } + + const missingCapture = returnCaptureViolation( + name, + definition.returns !== undefined, + asBinding, + ); + if (missingCapture !== undefined) { + return [yield* raise({ type: "error", message: missingCapture.message, source: name })]; + } + + // Capture the caller's eval environment before creating the component's + // own env. Children are caller-provided content — expression props like + // {pr} should resolve against the scope where the JSX was written, not + // the component that renders . + // + // For multi-level nesting (Root → Provider → Instruction → ReviewBody), + // the projectedEnv from the outer caller must be merged with the current + // context env so that ancestor bindings propagate through all levels. + // The current context env's ordinary bindings take precedence; the shared + // layering helper keeps a projected caller's props object lexical. + const contextEnv = yield* env; + const callerEvalEnv = layerEnvironments(projectedEnv, contextEnv); + + // Recurse with augmented hide set. + // Each component gets its own fresh binding environment so that + // eval blocks within a component share bindings but don't leak + // into parent or sibling components. This is critical for the + // provider pattern where each provider has isolated port/URL bindings. + // + // Each component also gets its own EvalScope, created as a child of + // the parent component's eval scope. This ensures that middleware + // installed via `persist eval` blocks (e.g., Sample.around()) is + // scoped to the component. Nested providers produce a scope chain + // where innermost middleware runs first (innermost-wins), and + // next() delegates to the parent scope's middleware. + const newHideSet = new Set([...hideSet, name]); + const componentEnv: EvalEnv = propsEnvironment(validatedProps); + liveEnvironment(componentEnv); + + // Children are caller-provided content, not the component's own body. + // Use the parent's hide set (without the current component name) so + // that caller-provided children can reference the same component name + // without triggering false cycle detection. True cycles in a component's + // body are still caught because body expansion uses newHideSet. + // + // Use the caller's eval env for the same reason: expression props (e.g. + // {pr}) resolve against the scope where the JSX was written. + const capturedCallerEnv = callerEvalEnv ?? componentEnv; + // A body eval block can render errors away through a string projection + // (renderChildren, render, useContent); the buffer records them so an + // `as=` capture can be refused (§6.5). + const bodyContentErrors: Segment[] = []; + + // Read before the invocation exists: the eval scope ambient here is the + // caller's, and it is what `retain()` creates resources in. The loop is read + // here for the same reason — it is the one the caller's content was written + // in, and the invocation is about to clear it for the component's own body. + const siteEvalScope = yield* evalScope; + const siteLoop = yield* ActiveLoop.get(); + const siteReturn = returnBody; + + const expansion = snapshot(path, name, position); + + // Both bodies run inside one invocation, so a value component owns its + // resources exactly like a rendered one. + let claimProjection: ClaimFn = passthroughClaim; + + function* installInvocation(invocation: Invocation): Operation { + const enclosing = yield* ActiveProjection.get(); + const handle = createProjectionHandle({ + invocation, + enclosing, + children, + caller: { + env: capturedCallerEnv, + meta: callerMeta, + props: callerProps, + hideSet, + }, + authored: { + env: componentEnv, + meta: definition.meta, + props: validatedProps, + hideSet: newHideSet, + }, + counter, + callerLoop: siteLoop, + callerReturn: siteReturn, + ownPath: path, + printedErrors: bodyContentErrors, + checkedFailures, + environment, + imports, + }); + // Published on the eval scope, which every task the invocation owns + // descends from — including its persist-eval blocks and its content. + invocation.evalScope.scope.set(ActiveProjection, handle); + claimProjection = handle.claim; + + // The component's own body is isolated from the loop that invoked it: a + // `` written here belongs to a `` written here. Set on the body + // task, which the content scope descends from — so each projection restores + // the caller's frame for the caller's own text (createProjectionHandle), + // and anything the body does outside a projection finds none. + yield* ActiveLoop.set(undefined); + + // And from the caller's value body for the same reason: a written + // here satisfies this component's own `returns`, never the caller's. A + // value body installs its own frame below; a rendered one owns none, so a + // written in it stays reserved. + // Published on the body task, so the component's own body and everything it + // owns read this expansion, and a nested one uncovers it again on the way + // out (§5.6). + yield* publishExpansion(expansion); + + // Installed on the invocation's own body task rather than a nested + // scoped(): anything the body acquires must still be alive when teardown + // halts the content scope, and it is released by the body's own stage. + yield* provideEnv(componentEnv); + yield* provideEvalScope(invocation.evalScope); + yield* provideRetain(siteEvalScope); + + // Render closures (spec §4.8). Non-serializable, so serializeExports + // omits them from the journal. The optional error mode is supplied by a + // persistent evaluation's binding snapshot (§4.3), which knows the error mode of the + // block that started the projection; an ordinary block leaves it unset and + // the projection site's error mode applies. + componentEnv.values.renderChildren = (override?: unknown, mode?: ErrorMode) => + handle.projectToString({ + kind: "children", + override: validateRenderOverride(override), + mode, + }); + componentEnv.values.render = (markdown: unknown, mode?: ErrorMode) => + handle.projectToString({ + kind: "markdown", + segments: scanSegments(String(markdown)), + mode, + }); + componentEnv.values.useContent = (slot?: unknown, mode?: ErrorMode) => + handle.projectToString({ + kind: "slot", + name: slot === undefined ? undefined : String(slot), + mode, + }); + } + + const returns = definition.returns; + if (returns !== undefined) { + let value: Json; + try { + value = yield* withInvocation(function* (invocation) { + yield* installInvocation(invocation); + return yield* expandValueBody( + name, + returns, + definition.bodySegments, + children, + definition.meta, + validatedProps, + newHideSet, + counter, + callerEvalEnv ?? undefined, + claimProjection, + path, + checkedFailures, + bodyEnvironment, + imports, + returnBody, + ); + }); + } catch (error) { + // Body fail-fast propagates unchanged; a return-value failure is the + // component's own printed error and follows the caller's error mode. + const fatal = fatalCause(error); + if (fatal !== undefined) { + throw fatal; + } + return [yield* raise(schemaValidationErrorSegment(error, name))]; + } + + // Bind only after the invocation has torn down, so the value reaches the + // caller's environment and never the component's own. + const parentEnv = yield* env; + if (!parentEnv || asBinding === undefined) { + return [ + yield* raise({ + type: "error", + message: `Prop "as" on <${name} /> requires a parent evaluation environment.`, + source: name, + }), + ]; + } + parentEnv.values[asBinding] = value; + return []; + } + + const bodyOwner = asBinding === undefined ? owner : undefined; + // Where this body's own segments start, so what it renders can be told apart + // from what the caller had already produced into the same array. + const renderedFrom = bodyOwner?.length ?? 0; + const expanded = yield* withInvocation(function* (invocation) { + yield* installInvocation(invocation); + return yield* expandBody( + definition.bodySegments, + children, + definition.meta, + validatedProps, + newHideSet, + counter, + callerEvalEnv ?? undefined, + claimProjection, + bodyOwner, + path, + checkedFailures, + bodyEnvironment, + imports, + returnBody, + ); + }); + + // Exact source is a provenance, and both halves of it are read here from + // things no answer can write: that canonical execution authorized this import + // for a name this execution closed, and that the *host's own admitted + // declaration* for that name states exact source. A definition claiming the + // disposition, or segments arriving already marked, decide nothing. + // + // What a component declared exact renders is exact wherever it renders: the + // caller's flow, its own returned region, or neither when the invocation + // binds instead. Recording it here — against the segments this body produced, + // after it produced them — is what carries the fact to the emission loop, + // which is outside every scope the invocation owned. + if (authorizedCanonically && environment?.installedComponents?.declaresExact(name) === true) { + markExactSource( + environment?.sourceSegments, + bodyOwner === undefined ? expanded : bodyOwner.slice(renderedFrom), + ); + } + + if (asBinding) { + // A capture never swallows an error. The body reported these where they + // were created (§6.9) — including the ones a string projection rendered + // away — so they are handed back as they are and the binding stays unset. + // Recorded errors precede expanded ones regardless of source position; + // the order across the two lists is deliberately unspecified. + const errors = [ + ...bodyContentErrors, + ...expanded.filter((capturedSegment) => capturedSegment.type === "error"), + ]; + if (errors.length > 0) { + return errors; + } + + const parentEnv = yield* env; + if (!parentEnv) { + return [ + yield* raise({ + type: "error", + message: `Prop "as" on <${name} /> requires a parent evaluation environment.`, + source: name, + }), + ]; + } + parentEnv.values[asBinding] = renderSegments(expanded); + return []; + } + + // A rendering body already wrote into the owner, so there is nothing left to + // hand back; one that kept its own returns what it rendered. + return bodyOwner === undefined ? expanded : []; + } } // Without `returns`, a function component's rendering is its return value, so diff --git a/packages/core/src/invocation.ts b/packages/core/src/invocation.ts index 8c589a32d..dff283a68 100644 --- a/packages/core/src/invocation.ts +++ b/packages/core/src/invocation.ts @@ -77,8 +77,28 @@ function asError(cause: unknown): Error { * failure and a single `InvocationTeardownError` — each original error stays * reachable by identity, which is what `fatalCause()` traverses. */ -export function* withInvocation(body: (invocation: Invocation) => Operation): Operation { +export function* withInvocation( + body: (invocation: Invocation) => Operation, + /** + * Told once that the body's own work has ended, and why, before any of the + * ordered teardown stages run. + * + * An observer of the invocation, not a participant in it: nothing it does + * changes the outcome, and it cannot see what the body produced. It is here + * rather than around the call because "the body ended" and "the invocation + * returned" are different moments — the destructors between them are exactly + * what a reader watching an element wants to see it waiting in. + */ + settled?: (reason: "returned" | "failed" | "cancelled") => void, +): Operation { return yield* scoped(function* () { + let told = false; + const tell = (reason: "returned" | "failed" | "cancelled"): void => { + if (!told) { + told = true; + settled?.(reason); + } + }; let bodyFailure: Error | undefined; const teardownFailures: unknown[] = []; @@ -185,10 +205,20 @@ export function* withInvocation(body: (invocation: Invocation) => Operation { + tell("cancelled"); + }); + start.resolve(invocation); try { - return yield* resultPublished.operation; + const value = yield* resultPublished.operation; + tell("returned"); + return value; } catch (error) { + tell("failed"); // Recorded so the outcome destructor can keep it when a teardown stage // also fails; a destructor throw would otherwise replace it as the // scope's failure. From adf51b9d7f99e9f43d3b6eeda75b67952c8d2c77 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 05:39:18 -0400 Subject: [PATCH 02/19] =?UTF-8?q?=F0=9F=9A=A7=20Tell=20an=20element's=20ob?= =?UTF-8?q?servers=20where=20it=20has=20reached=20(#881=20PR=202,=20layer?= =?UTF-8?q?=201b)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ACTIVE where accepted work starts, in all three body paths, and EXIT with its reason when that work ends — before the invocation's ordered teardown, which is the stretch a reader watching a destructor is interested in. COMPLETE still waits for the whole dispatch to unwind. The first observation tier drives real expansions through the public chain: the ordered sequence, a failed body's detached report, an element resolution refused, two readers, a reader that never reads, a handler that returns without delegating, a counterfeit request, a repeated delegation, a caught canonical failure that stays failed, and a late reader told where the element is rather than replayed. Writing it found the hazard the contract warns about: a subscription spawned on the handler's own frame dies when dispatch unwinds, which is before COMPLETE is published. Subscriptions belong to an owner that outlives the dispatch, and the tier's harness now shows that. --- packages/core/src/component-expansion.ts | 14 + packages/core/src/expand.ts | 27 +- .../core/tests/component-expansion.test.ts | 374 ++++++++++++++++++ 3 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 packages/core/tests/component-expansion.test.ts diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts index 40bc9ec26..751b39fb6 100644 --- a/packages/core/src/component-expansion.ts +++ b/packages/core/src/component-expansion.ts @@ -155,6 +155,20 @@ class CanonicalExpansionRequest implements ComponentExpansionRequest { } } +/** + * What one element's observers are told, handed to the paths that run its body. + * + * Publication and nothing else: a path that takes it can say the work started + * and that it ended, and cannot read an outcome, decide one or reach the + * request it belongs to. + */ +export interface ObservedExpansion { + /** Accepted work is starting. */ + active(): void; + /** The body's own work ended, and why, before its owned cleanup. */ + settled(reason: "returned" | "failed" | "cancelled"): void; +} + /** What canonical expansion produced for one element. */ export type ExpansionSettlement = /** The delegated work ran and settled on its own terms. */ diff --git a/packages/core/src/expand.ts b/packages/core/src/expand.ts index f4de17e1f..4ab106068 100644 --- a/packages/core/src/expand.ts +++ b/packages/core/src/expand.ts @@ -129,6 +129,7 @@ import { issueComponentExpansion, reported, } from "./component-expansion.ts"; +import type { ObservedExpansion } from "./component-expansion.ts"; import { expandThroughTerminal } from "./component-api.ts"; import type { ComponentExpansionPhase } from "./component-api.ts"; import type { Invocation } from "./invocation.ts"; @@ -2708,6 +2709,16 @@ function* expandComponent( } }; issued.publish({ phase: "enter" }); + const observed: ObservedExpansion = { + active: () => issued.publish({ phase: "active" }), + settled: (reason) => issued.publish({ phase: "exit", reason }), + }; + /** + * The body's own work ended, and why — told before this invocation's ordered + * teardown runs, which is exactly the stretch a reader watching a destructor + * sees the element waiting in. + */ + const settledExit = observed.settled; let chainFailure: unknown; let chainFailed = false; try { @@ -2904,6 +2915,7 @@ function* expandComponent( // Function component: call the generator function directly if (imported.kind === "function") { return yield* expandFunctionComponent( + observed, name, props, expressions, @@ -3048,6 +3060,9 @@ function* expandComponent( let claimProjection: ClaimFn = passthroughClaim; function* installInvocation(invocation: Invocation): Operation { + // Resolution and validation accepted this element, and its body is about + // to run: that is what makes it active, and both bodies install here. + observed.active(); const enclosing = yield* ActiveProjection.get(); const handle = createProjectionHandle({ invocation, @@ -3150,7 +3165,7 @@ function* expandComponent( imports, returnBody, ); - }); + }, settledExit); } catch (error) { // Body fail-fast propagates unchanged; a return-value failure is the // component's own printed error and follows the caller's error mode. @@ -3199,7 +3214,7 @@ function* expandComponent( imports, returnBody, ); - }); + }, settledExit); // Exact source is a provenance, and both halves of it are read here from // things no answer can write: that canonical execution authorized this import @@ -3341,6 +3356,11 @@ function* raiseFrom(segment: ErrorSegment, from: unknown): Operation, expressions: Record, @@ -3521,6 +3541,7 @@ function* expandFunctionComponent( // in scope so it can render its invocation content through `yield* content()`. try { const output: unknown = yield* withInvocation(function* (invocation) { + observed.active(); const enclosing = yield* ActiveProjection.get(); // Minted before the handle, because the handle is what raises it: an // invocation names nothing while it is expanding its own content, and @@ -3768,7 +3789,7 @@ function* expandFunctionComponent( } throw new ThrownValue(error); } - }); + }, observed.settled); if (asBinding) { const parentEnv = yield* env; if (!parentEnv) { diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts new file mode 100644 index 000000000..4c3faea50 --- /dev/null +++ b/packages/core/tests/component-expansion.test.ts @@ -0,0 +1,374 @@ +/** + * Tier CX — canonical expansion observation (spec §5.7). + * + * What a `Component.expand` handler is offered, what it may do with it, and + * what the element's observers are told. These drive `expandSegments` through + * the real engine, so the phases asserted here are the ones an element + * actually passed through rather than a report of them. + * + * The subject is the boundary, not the body: every case below also checks that + * observing changed nothing about what the document rendered or how it failed. + */ + +import { describe, it } from "@executablemd/test-support/bdd"; +import { expect } from "@executablemd/test-support/expect"; +import { each, scoped, sleep, useScope, withResolvers } from "effection"; +import type { Scope } from "effection"; +import type { Operation } from "effection"; +import { Component } from "../src/component-api.ts"; +import type { ComponentExpansionPhase, ComponentExpansionRequest } from "../src/component-api.ts"; +import { expandSegments } from "../src/expand.ts"; +import { renderSegments } from "../src/render.ts"; +import { scanSegments } from "../src/scanner.ts"; +import type { EvalEnv, FunctionComponentDefinition, Json, Segment } from "../src/types.ts"; + +const NO_PROPS = { type: "object", properties: {}, additionalProperties: false }; + +function component(name: string, fn: () => Operation): FunctionComponentDefinition { + return { kind: "function", name, props: NO_PROPS, fn }; +} + +/** Every phase one run published, by the element it belongs to. */ +interface Watched { + readonly seen: Map; + readonly order: string[]; + readonly requests: ComponentExpansionRequest[]; +} + +/** + * Expand `source`, watching every element through the public chain. + * + * `observe` is the handler under test; the default delegates once, which is + * what an ordinary observer does. Each element's subscription is spawned as a + * sibling of the dispatch rather than joined inside it: the terminal phase is + * published after handlers unwind, so a handler that waited for it in its own + * destructor would wait for itself. + */ +function watch( + source: string, + definitions: Record, + observe?: ( + request: ComponentExpansionRequest, + next: (request: ComponentExpansionRequest) => Operation, + read: (collect: (phase: ComponentExpansionPhase) => void) => void, + owner: Scope, + ) => Operation, +): Operation<{ + readonly watched: Watched; + readonly rendered: string; + readonly failure?: unknown; + /** What this run said in the end, however it said it. */ + readonly report: string; +}> { + return scoped(function* () { + const watched: Watched = { seen: new Map(), order: [], requests: [] }; + // The owner every subscription runs under. Core publishes the terminal + // phase after the whole dispatch has unwound, so a subscription spawned on + // the handler's own frame dies before it is told the element completed — + // which is the one thing a reader is watching for. + const owner: Scope = yield* useScope(); + const reading = ( + request: ComponentExpansionRequest, + collect: (phase: ComponentExpansionPhase) => void, + ): void => { + owner.run(function* () { + for (const phase of yield* each(request.phases)) { + collect(phase); + yield* each.next(); + } + }); + }; + const env: EvalEnv = { values: {} }; + yield* Component.around({ env: () => env }, { at: "min" }); + yield* Component.around( + { + // deno-lint-ignore require-yield + *importComponent([name]) { + const definition = definitions[name]; + if (!definition) { + throw new Error(`no component ${name}`); + } + return definition; + }, + }, + { at: "min" }, + ); + yield* Component.around({ + *expand([request], next) { + watched.requests.push(request); + const phases: ComponentExpansionPhase[] = []; + watched.seen.set(request.expansion.id, phases); + reading(request, (phase) => { + phases.push(phase); + watched.order.push(`${request.expansion.name}:${phase.phase}`); + }); + if (observe !== undefined) { + yield* observe(request, next, (collect) => reading(request, collect), owner); + return; + } + yield* next(request); + }, + }); + + let failure: unknown; + let segments: Segment[] = []; + try { + segments = yield* expandSegments(scanSegments(source), {}, {}, new Set()); + } catch (error) { + failure = error; + } + // One turn, so the spawned subscriptions drain what was published while + // the element was unwinding. + yield* sleep(0); + const rendered = renderSegments(segments); + return { + watched, + rendered, + failure, + report: failure === undefined ? rendered : String(failure), + }; + }); +} + +describe("Tier CX — what surrounds one expansion", () => { + it("CX1: a function component is entered, active, exited and completed, in order", function* () { + const { watched, rendered } = yield* watch("", { + Hello: component("Hello", function* () { + return "hi"; + }), + }); + + expect(rendered).toBe("hi"); + expect(watched.order).toEqual(["Hello:enter", "Hello:active", "Hello:exit", "Hello:complete"]); + const phases = [...watched.seen.values()][0]; + const exit = phases[2]; + expect(exit.phase === "exit" && exit.reason).toBe("returned"); + const complete = phases[3]; + expect(complete.phase === "complete" && complete.result.ok).toBe(true); + }); + + it("CX1: a body that throws exits as failed and completes with a detached report", function* () { + const { watched, report } = yield* watch("", { + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }); + + expect(watched.order).toEqual(["Boom:enter", "Boom:active", "Boom:exit", "Boom:complete"]); + const phases = [...watched.seen.values()][0]; + const exit = phases[2]; + expect(exit.phase === "exit" && exit.reason).toBe("failed"); + const complete = phases[3]; + if (complete.phase !== "complete" || complete.result.ok) { + throw new Error("the element completed without a failure"); + } + // What it was called and what it said, and nothing canonical execution is + // holding: a new Error every time, frozen, reaching no live object. + expect(complete.result.error.message).toContain("the body said no"); + expect(Object.isFrozen(complete.result.error)).toBe(true); + // The document still reports the failure the way it always did. + expect(report).toContain("the body said no"); + }); + + it("CX1: an element that resolves to nothing is never active, and still completes", function* () { + const { watched, report } = yield* watch("", {}); + const phases = [...watched.seen.values()][0].map((one) => one.phase); + // Resolution refused it, so no work was ever accepted — and the element + // still finished, because an observer is told how every expansion ended. + expect(phases).not.toContain("active"); + expect(phases[phases.length - 1]).toBe("complete"); + expect(report).toContain("no component Missing"); + }); + + it("CX4: two readers of one element each get the whole sequence", function* () { + const first: string[] = []; + const second: string[] = []; + const { rendered } = yield* watch( + "", + { + Hello: component("Hello", function* () { + return "hi"; + }), + }, + // deno-lint-ignore require-yield + function* (request, next, read) { + for (const collected of [first, second]) { + read((phase) => collected.push(phase.phase)); + } + return yield* next(request); + }, + ); + + expect(rendered).toBe("hi"); + expect(first).toEqual(["enter", "active", "exit", "complete"]); + expect(second).toEqual(first); + }); + + it("CX4: a reader that never reads delays nothing", function* () { + const { rendered, watched } = yield* watch( + "", + { + Hello: component("Hello", function* () { + return "hi"; + }), + }, + function* (request, next) { + // Subscribed and then abandoned: the queue fills and nobody drains it. + yield* request.phases; + yield* next(request); + }, + ); + + expect(rendered).toBe("hi"); + expect(watched.requests.length).toBe(1); + }); + + it("CX1: a handler that returns without delegating refuses the work", function* () { + let ran = false; + const { report } = yield* watch( + "", + { + Hello: component("Hello", function* () { + ran = true; + return "hi"; + }), + }, + // deno-lint-ignore require-yield + function* () {}, + ); + + expect(ran).toBe(false); + expect(report).toContain("without delegating"); + }); + + it("CX1: a counterfeit request runs nothing", function* () { + let ran = false; + const { report } = yield* watch( + "", + { + Hello: component("Hello", function* () { + ran = true; + return "hi"; + }), + }, + function* (request, next) { + // Every member the real one has, and not the one it was issued as. + yield* next({ expansion: request.expansion, phases: request.phases }); + }, + ); + + expect(ran).toBe(false); + expect(report).toContain("did not issue"); + }); + + it("CX1: delegating the same request twice runs the body once", function* () { + let ran = 0; + const { report } = yield* watch( + "", + { + Hello: component("Hello", function* () { + ran += 1; + return "hi"; + }), + }, + function* (request, next) { + yield* next(request); + yield* next(request); + }, + ); + + expect(ran).toBe(1); + expect(report).toContain("more than once"); + }); + + it("CX3: catching a canonical failure does not rescue it", function* () { + const { report, watched } = yield* watch( + "", + { + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }, + function* (request, next) { + try { + yield* next(request); + } catch { + // Swallowed on purpose. The outcome is not middleware's to decide. + } + }, + ); + + expect(report).toContain("the body said no"); + const phases = [...watched.seen.values()][0]; + const complete = phases[phases.length - 1]; + expect(complete.phase === "complete" && complete.result.ok).toBe(false); + }); + + it("CX3: observing changes neither what rendered nor how it failed", function* () { + const source = "\n\n\n"; + const definitions = { + Hello: component("Hello", function* () { + return "hi"; + }), + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }; + const unobserved = yield* scoped(function* () { + const env: EvalEnv = { values: {} }; + yield* Component.around({ env: () => env }, { at: "min" }); + yield* Component.around( + { + // deno-lint-ignore require-yield + *importComponent([name]) { + const definition = definitions[name as keyof typeof definitions]; + if (!definition) { + throw new Error(`no component ${name}`); + } + return definition; + }, + }, + { at: "min" }, + ); + try { + return renderSegments(yield* expandSegments(scanSegments(source), {}, {}, new Set())); + } catch (error) { + return String(error); + } + }); + const observed = yield* watch(source, definitions); + expect(observed.report).toBe(unobserved); + }); + + it("CX4: a late subscriber is told where it is, without earlier replay", function* () { + const started = withResolvers(); + const release = withResolvers(); + const arrived: string[] = []; + const { rendered } = yield* watch( + "", + { + Held: component("Held", function* () { + started.resolve(); + yield* release.operation; + return "held"; + }), + }, + function* (request, next, read, owner) { + // Arrives while the element is mid-flight, from an owner that outlives + // the dispatch, and is told where the element is rather than walked + // through the two phases it missed. + owner.run(function* () { + yield* started.operation; + read((phase) => arrived.push(phase.phase)); + release.resolve(); + }); + yield* next(request); + }, + ); + + expect(rendered).toBe("held"); + expect(arrived[0]).toBe("active"); + expect(arrived).not.toContain("enter"); + expect(arrived[arrived.length - 1]).toBe("complete"); + }); +}); From 38fa9e7c2430def4eefa9583c78927364d1c795b Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 05:45:10 -0400 Subject: [PATCH 03/19] =?UTF-8?q?=F0=9F=9A=A7=20Say=20where=20a=20source?= =?UTF-8?q?=20text's=20elements=20are,=20without=20running=20any=20of=20it?= =?UTF-8?q?=20(#881=20PR=202,=20layer=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `inspectSource(text, kind)` answers where each recognized element's delimiters are and what the author called it. It is the scanner's own reading — the same walk that decides what a fence, an inline code span, a quoted `>` and a tag-like expression are — so there is no second grammar to disagree with the first, and a nested collector is committed only with the parse that found it. A document's body boundary is read lexically, matching the installed extractor's rule without calling its value parser: a byte-order mark, `---` on its own line, `----` that is not one, an optional header language, the first closing line, and the newline after it. `parseSource` asserts the two agree, so a divergence is loud rather than a quiet offset drift. Probed against the engine over BOM, CRLF, a header language, an absent closing delimiter and a `---` inside a list: every case agrees, and the one the value parser refuses is the one inspection reads without it. The tier cuts every range out of the exact input it was given, and checks that what inspection reports is what the engine's own scan recognized — including an incomplete passive tag, which is prose, and leaves no guessed children. --- packages/core/api.ts | 16 ++ packages/core/mod.ts | 2 + packages/core/src/definition.ts | 11 ++ packages/core/src/scanner.ts | 54 +++++- packages/core/src/source-inspection.ts | 117 +++++++++++ packages/core/tests/source-inspection.test.ts | 183 ++++++++++++++++++ 6 files changed, 379 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/source-inspection.ts create mode 100644 packages/core/tests/source-inspection.test.ts diff --git a/packages/core/api.ts b/packages/core/api.ts index 5d7a0740b..fee42b6e1 100644 --- a/packages/core/api.ts +++ b/packages/core/api.ts @@ -112,3 +112,19 @@ export type { Structural, } from "./src/execution-declarations.ts"; export type { JournalAdmission } from "./src/execute.ts"; + +/** + * The contextual Api a consumer installs middleware on, and the types one + * `Component.expand` handler is written in. + * + * Exported here rather than from the root because this is the consumer-facing + * boundary: a host that wants to watch an element expand needs the descriptor + * and the shapes it will be handed, and nothing of the engine behind them. + */ +export { Component } from "./src/component-api.ts"; +export type { + ComponentApi, + ComponentExpansionPhase, + ComponentExpansionRequest, +} from "./src/component-api.ts"; +export type { Expansion } from "./src/expansion.ts"; diff --git a/packages/core/mod.ts b/packages/core/mod.ts index b08e21491..be32a01a2 100644 --- a/packages/core/mod.ts +++ b/packages/core/mod.ts @@ -68,6 +68,8 @@ export { handleFailure, } from "./src/component-api.ts"; +export { inspectSource } from "./src/source-inspection.ts"; +export type { SourceElement, SourceRange } from "./src/source-inspection.ts"; export { renderSegments } from "./src/render.ts"; export { createReplayStream } from "./src/replay-stream.ts"; diff --git a/packages/core/src/definition.ts b/packages/core/src/definition.ts index cef192914..945f0331f 100644 --- a/packages/core/src/definition.ts +++ b/packages/core/src/definition.ts @@ -9,6 +9,7 @@ import { findTarget, outlineDocument, retainedRanges, selectTarget } from "./doc import type { DocumentOutline, DocumentTargetInfo } from "./document-targets.ts"; import matter from "gray-matter"; +import { envelopeBody } from "./source-inspection.ts"; /** * Whether a path names a function component. Execution imports `.ts` @@ -42,6 +43,16 @@ export function parseSource(path: string, content: string): ParsedSource { if (content.slice(baseOffset) !== parsed.content) { throw new Error(`frontmatter parse did not preserve the markdown body verbatim: ${path}`); } + // Inspection finds this same boundary without asking the value parser for + // anything, so that reading a document's shape never interprets its header. + // One boundary, asserted here: a divergence is loud rather than a quiet + // offset drift between what executes and what is shown. + if (envelopeBody(content) !== baseOffset) { + throw new Error( + `frontmatter boundary disagrees with the lexical envelope (${envelopeBody(content)} vs ` + + `${baseOffset}): ${path}`, + ); + } let baseLine = 1; for (let i = 0; i < baseOffset; i++) { if (content[i] === "\n") { diff --git a/packages/core/src/scanner.ts b/packages/core/src/scanner.ts index 6cdf8f188..86bae0e9a 100644 --- a/packages/core/src/scanner.ts +++ b/packages/core/src/scanner.ts @@ -12,6 +12,7 @@ import { Err, Ok } from "effection"; import type { Result } from "effection"; import { validateBindingName } from "./live-env.ts"; +import type { SourceRange } from "./document-targets.ts"; import { bindsByReference, isStructural } from "./structural.ts"; import type { Segment, @@ -211,6 +212,16 @@ export function scanSegments( text: string, origin?: SourceOrigin, spans?: ComponentSpan[], + /** + * Where every recognized element's delimiters are, collected as the scan + * commits each one. + * + * The same walk, asked for one more thing. A second reader looking for `<` + * and `>` afterwards would be a second grammar — it would have to decide + * again what a fence, a quoted `>` and a tag-like expression are — and the + * two readings would disagree the first time one of them was wrong. + */ + elements?: SourceElement[], ): Segment[] { const index: PositionIndex = { origin, lineStarts: computeLineStarts(text) }; const segments: Segment[] = []; @@ -269,7 +280,7 @@ export function scanSegments( // Check for component invocation: `<` followed by uppercase letter if (text[pos] === "<" && pos + 1 < text.length && /[A-Z]/.test(text[pos + 1]!)) { // Make sure we're not inside a fenced code block (handled above) - const component = parseComponentTag(text, pos, index); + const component = parseComponentTag(text, pos, index, elements); if (component) { // Flush text before component if (pos > textStart) { @@ -294,6 +305,22 @@ export function scanSegments( return segments; } +/** + * One recognized element's delimiters, as the scanner committed them. + * + * `name` is the authored spelling, dots included. It says nothing about + * whether the name resolves, what it is allowed to do, or whether anything + * ever ran: this is where the characters are, and no more than that. + * + * `closing` is absent for exactly self-closing syntax. An element written with + * paired delimiters and no content between them still has one. + */ +export interface SourceElement { + readonly name: string; + readonly opening: SourceRange; + readonly closing?: SourceRange; +} + /** The source spans of the top-level component invocations in `text`. */ export function scanComponentSpans(text: string): ComponentSpan[] { const spans: ComponentSpan[] = []; @@ -436,6 +463,7 @@ function parseComponentTag( text: string, start: number, index: PositionIndex, + elements?: SourceElement[], ): ParsedComponent | null { let pos = start + 1; // Skip '<' @@ -476,6 +504,7 @@ function parseComponentTag( } pos++; // Skip '>' + elements?.push(Object.freeze({ name, opening: Object.freeze({ start, end: pos }) })); return { segment: { type: "component", @@ -496,13 +525,29 @@ function parseComponentTag( return null; } pos++; // Skip '>' + const openingEnd = pos; - // Parse children until closing tag - const { children, end: childEnd } = parseChildren(text, pos, name, index); + // Parse children until closing tag. Nested elements are collected aside and + // committed only with this parse: an incomplete passive tag has no children + // the scanner recognized, so it must leave none behind. + const nested: SourceElement[] | undefined = elements === undefined ? undefined : []; + const { children, end: childEnd } = parseChildren(text, pos, name, index, nested); if (childEnd === -1) { return null; } + if (elements !== undefined && nested !== undefined) { + // This element before the ones inside it, which is opening order. + elements.push( + Object.freeze({ + name, + opening: Object.freeze({ start, end: openingEnd }), + closing: Object.freeze({ start: childEnd - ``.length, end: childEnd }), + }), + ); + elements.push(...nested); + } + return { segment: { type: "component", @@ -819,6 +864,7 @@ function parseChildren( start: number, tagName: string, index: PositionIndex, + elements?: SourceElement[], ): ParsedChildren { let pos = start; let textStart = pos; @@ -884,7 +930,7 @@ function parseChildren( // Check for nested component if (text[pos] === "<" && pos + 1 < text.length && /[A-Z]/.test(text[pos + 1]!)) { - const nested = parseComponentTag(text, pos, index); + const nested = parseComponentTag(text, pos, index, elements); if (nested) { if (pos > textStart) { pushText(children, text.slice(textStart, pos)); diff --git a/packages/core/src/source-inspection.ts b/packages/core/src/source-inspection.ts new file mode 100644 index 000000000..c2dc49c5e --- /dev/null +++ b/packages/core/src/source-inspection.ts @@ -0,0 +1,117 @@ +/** + * Where the executable elements of a source text are written (spec §5.8). + * + * A reading, not a run. It answers where each recognized element's delimiters + * are and what the author called it, and it does nothing else: no name is + * resolved, no schema compiled, no prop evaluated, no frontmatter interpreted + * and no component invoked. A caller that wants to show somebody their own + * source — with the parts that execute marked — needs exactly this and must + * not pay execution to get it. + * + * It is the scanner's own reading. The ranges come from the same walk that + * decides what a fence, an inline code span, a quoted `>` and a tag-like + * expression are, so there is no second grammar to disagree with the first. + * + * Offsets are half-open UTF-16 slices into the exact text that was passed in, + * a document's header prefix included, so `text.slice(opening.start, + * opening.end)` is the delimiter as authored. + */ + +import { Err, Ok } from "effection"; +import type { Result } from "effection"; +import { scanSegments } from "./scanner.ts"; +import type { SourceElement } from "./scanner.ts"; +import type { SourceRange } from "./document-targets.ts"; + +export type { SourceElement, SourceRange }; + +/** + * Every executable element `text` is written with, in opening order. + * + * `"document"` reads the markdown body beneath a frontmatter header, with + * offsets still counted from the start of the whole text. `"fragment"` reads + * all of it. Text the scanner does not recognize as an element — prose, a + * fence, an inline code span, an incomplete tag — is simply absent, which is + * success and not a refusal. + */ +export function inspectSource( + text: string, + kind: "document" | "fragment", +): Result { + const body = kind === "document" ? envelopeBody(text) : 0; + const elements: SourceElement[] = []; + try { + scanSegments(text.slice(body), undefined, undefined, elements); + } catch (error) { + // The scanner refused this text. Inspection reports that rather than + // guessing at a reading the engine itself would not accept. + return Err(error instanceof Error ? error : new Error(String(error))); + } + return Ok(Object.freeze(body === 0 ? elements : elements.map((one) => shifted(one, body)))); +} + +function shifted(element: SourceElement, by: number): SourceElement { + return Object.freeze({ + name: element.name, + opening: Object.freeze({ start: element.opening.start + by, end: element.opening.end + by }), + ...(element.closing === undefined + ? {} + : { + closing: Object.freeze({ + start: element.closing.start + by, + end: element.closing.end + by, + }), + }), + }); +} + +/** + * Where a document's markdown body starts, read lexically. + * + * The same boundary `parseSource` ends up with, found without asking the + * frontmatter engine for a value: inspection must not run a YAML parser over + * somebody's header to learn where their body begins, and a document whose + * header is itself executable text must stay unexecuted. `parseSource` asserts + * the two agree, so a divergence is loud rather than a quiet offset drift. + * + * The rule is the installed extractor's: an optional byte-order mark, then + * `---` on its own opening line — `----` is not one — an optional language + * after it, the first following newline, and the first later line that is + * exactly the closing delimiter. A header with no closing delimiter is not a + * header, and the body is the whole text. + */ +export function envelopeBody(text: string): number { + const mark = text.charCodeAt(0) === 0xfeff ? 1 : 0; + if (!text.startsWith("---", mark) || text.charAt(mark + 3) === "-") { + return 0; + } + const opened = text.indexOf("\n", mark + 3); + if (opened === -1) { + return 0; + } + const closed = closingDelimiter(text, opened + 1); + if (closed === -1) { + return 0; + } + // Past the closing line's own newline, and the carriage return before it. + const line = text.indexOf("\n", closed); + return line === -1 ? text.length : line + 1; +} + +/** Where the line that is exactly the closing delimiter begins, or -1. */ +function closingDelimiter(text: string, from: number): number { + let at = from; + while (at <= text.length) { + const end = text.indexOf("\n", at); + const stop = end === -1 ? text.length : end; + const line = text.slice(at, stop).replace(/\r$/, ""); + if (line === "---") { + return at; + } + if (end === -1) { + return -1; + } + at = end + 1; + } + return -1; +} diff --git a/packages/core/tests/source-inspection.test.ts b/packages/core/tests/source-inspection.test.ts new file mode 100644 index 000000000..96d4f678b --- /dev/null +++ b/packages/core/tests/source-inspection.test.ts @@ -0,0 +1,183 @@ +/** + * Tier SI — static source boundaries (spec §5.8). + * + * Where the executable elements of a text are written, read without running + * any of it. Every case below checks the ranges against the exact input — the + * assertion is `text.slice(...)`, so an offset that drifted cannot pass by + * agreeing with another offset — and the last two check that reading a + * document interprets neither its header nor its body. + */ + +import { describe, it } from "@executablemd/test-support/bdd"; +import { expect } from "@executablemd/test-support/expect"; +import { inspectSource } from "../src/source-inspection.ts"; +import type { SourceElement } from "../src/source-inspection.ts"; +import { scanSegments } from "../src/scanner.ts"; + +/** The top-level element names the engine's own scan recognized in `text`. */ +function componentNames(text: string): string[] { + return scanSegments(text) + .filter((segment) => segment.type === "component") + .map((segment) => segment.name); +} + +/** Whether `outer`'s opening..closing contains `inner`'s opening. */ +function encloses(outer: SourceElement, inner: SourceElement): boolean { + const end = outer.closing?.end ?? outer.opening.end; + return outer.opening.start <= inner.opening.start && inner.opening.end <= end; +} + +/** The elements of `text`, or a failure naming what refused it. */ +function inspect( + text: string, + kind: "document" | "fragment" = "fragment", +): readonly SourceElement[] { + const result = inspectSource(text, kind); + if (!result.ok) { + throw result.error; + } + return result.value; +} + +/** Each element as the exact characters its ranges name. */ +function cut(text: string, elements: readonly SourceElement[]): string[] { + return elements.map((one) => { + const opening = text.slice(one.opening.start, one.opening.end); + if (one.closing === undefined) { + return `${one.name} ${opening}`; + } + return `${one.name} ${opening} … ${text.slice(one.closing.start, one.closing.end)}`; + }); +} + +describe("Tier SI — what a source text says it is made of", () => { + it("SI1: nested, same-name, dotted, empty and self-closing elements, in opening order", function* () { + const text = + '\n' + + " \n" + + " inner\n" + + " \n" + + "\n"; + const elements = inspect(text); + + expect(cut(text, elements)).toEqual([ + 'Plan … ', + "Json ", + "Plan … ", + "Ui.Panel … ", + ]); + // Exactly self-closing syntax lacks a closing range; paired empty content + // still has one. + expect(elements[1].closing).toBe(undefined); + expect(elements[3].closing).not.toBe(undefined); + }); + + it("SI1: a quoted delimiter and a tag-like expression are not elements", function* () { + const text = ' b"} label="x > y" />\n'; + const elements = inspect(text); + expect(cut(text, elements)).toEqual(['Json b"} label="x > y" />']); + }); + + it("SI1: fenced and inline code hold no elements", function* () { + const text = + "```md\n\n```\n\n" + "`not this`\n\n" + "\n"; + const elements = inspect(text); + expect(cut(text, elements)).toEqual(["Json "]); + }); + + it("SI1: an incomplete passive tag is not an element, and leaves no guessed children", function* () { + const text = "\n \n"; + // `` has no closing delimiter, so it is prose. The nested element the + // scanner looked at while trying is not committed as its child — and the + // same walk then recognizes that `` where it really is, at the top + // level, which is what the engine's own segments say too. + const elements = inspect(text); + expect(elements.map((one) => one.name)).toEqual(["Json"]); + expect(elements[0].opening.start).toBe(text.indexOf("\n \n\n', + "\n \n", + "```md\n\n```\nx\n", + ' b"} />\n', + "`x` and \n", + ]; + for (const text of texts) { + // Inspection reports every element, nested ones included; the engine's + // top-level segments report the outermost. The outermost must agree. + const elements = inspect(text); + const outermost = elements + .filter((one) => !elements.some((other) => other !== one && encloses(other, one))) + .map((one) => one.name); + expect([text, outermost]).toEqual([text, componentNames(text)]); + } + }); + + it("SI1: ranges index the exact text, BOM, CRLF and non-ASCII included", function* () { + const text = "# 界é🙂\r\n\r\n\r\n"; + const elements = inspect(text); + expect(elements.length).toBe(1); + expect(text.slice(elements[0].opening.start, elements[0].opening.end)).toBe( + "", + ); + }); + + it("SI2: a document's offsets count from the start of the whole text", function* () { + const header = "---\ntitle: a document\n---\n"; + const text = `${header}\n`; + const elements = inspect(text, "document"); + + expect(elements.length).toBe(1); + // Counted from the file, not from the body: the header prefix is included. + expect(elements[0].opening.start).toBe(header.length); + expect(text.slice(elements[0].opening.start, elements[0].opening.end)).toBe( + "", + ); + // The same text read as a fragment has its header as ordinary prose, so the + // element sits at the same place either way. + expect(inspect(text, "fragment")[0].opening.start).toBe(header.length); + }); + + it("SI2: a header that looks executable is read as a header and never run", function* () { + // The sentinel is in the header. If anything evaluated it the expression + // would throw, and if anything scanned it as body it would be an element. + const text = + "---\n" + + 'title: { throw new Error("the header ran") })()} />\n' + + "---\n" + + "\n"; + const elements = inspect(text, "document"); + + expect(cut(text, elements)).toEqual(["Json "]); + }); + + it("SI2: a fragment reads all of its text, header-looking prefix included", function* () { + const text = "---\n\n---\nx\n"; + // As a fragment nothing is a header, so both elements are there. + expect(inspect(text, "fragment").map((one) => one.name)).toEqual(["Json", "Plan"]); + // As a document the first is inside the envelope and is not body at all. + expect(inspect(text, "document").map((one) => one.name)).toEqual(["Plan"]); + }); + + it("SI2: an unterminated header is not a header", function* () { + const text = "---\ntitle: x\n\n"; + // gray-matter's value parser refuses this text; inspection never calls it, + // and reads the whole thing as body. + expect(inspect(text, "document").map((one) => one.name)).toEqual(["Json"]); + }); + + it("SI1: text with no elements is success, not a refusal", function* () { + expect(inspect("")).toEqual([]); + expect(inspect("# just prose\n\nand more.\n")).toEqual([]); + }); + + it("SI1: every element and range it answers with is frozen", function* () { + const [element] = inspect("x\n"); + expect(Object.isFrozen(element)).toBe(true); + expect(Object.isFrozen(element.opening)).toBe(true); + expect(Object.isFrozen(element.closing)).toBe(true); + }); +}); From 4ef4eef708e88a2f7830caa4fc4af42e53c9b23f Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 05:47:44 -0400 Subject: [PATCH 04/19] =?UTF-8?q?=F0=9F=9A=A7=20Classify=20the=20new=20exp?= =?UTF-8?q?ansion=20seam=20as=20a=20gate=20(#881=20PR=202,=20layer=203a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Component.expand` surrounds an element's whole expansion, which makes it a step in the walk that reached it rather than a walk of its own. Counting it as a walk would make every element a separate expansion to pause and release, and a structural element crossing the seam would release the hold its enclosing walk is still standing in. The boundary inventory test caught the new member the moment it existed, which is what it is for. --- packages/cli/src/repl/expansion.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/cli/src/repl/expansion.ts b/packages/cli/src/repl/expansion.ts index 1309c67f6..d998525b7 100644 --- a/packages/cli/src/repl/expansion.ts +++ b/packages/cli/src/repl/expansion.ts @@ -79,10 +79,18 @@ export interface BoundaryPartition { * `hasBinding` answer a question about an invocation the walk has already * reached; holding one would stop the same walk the gate before it already * stops, one question later. + * + * `expand` surrounds an element's whole expansion, which makes it a step in + * the walk that reached it and not a walk of its own. Treating it as one would + * count every element as a separate expansion to pause and release, and a + * structural element crossing this seam would release the hold its enclosing + * walk is still standing in. It inherits the walk it was reached through, and + * holding it stops that walk before the element resolves. */ export const COMPONENT_BOUNDARIES: BoundaryPartition = { walks: ["content", "tryContent"], gates: [ + "expand", "importComponent", "applyModifiers", "applyBoundModifiers", From 4f5fc254963e948235010967f66625ccdbffd9a3 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 05:59:37 -0400 Subject: [PATCH 05/19] =?UTF-8?q?=F0=9F=9A=A7=20Surround=20structural=20wo?= =?UTF-8?q?rk=20with=20the=20same=20observation=20(#881=20PR=202,=20layer?= =?UTF-8?q?=201c)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``, ``, ``, `` and `` each cross the seam once, through one shared helper rather than five copies of the reconciliation. The selected ``, the `` that actually runs and every `` an `` really starts are elements of their own; an unselected branch expands nothing and is told nothing. Structural syntax has no separate body to enter, so ACTIVE is published where its region begins and EXIT when the region ends, with cancellation assumed until the work says otherwise. The tier now counts boundaries per construct, checks that exactly one terminal observation reaches each, and shows an unchosen `` and the component inside it were never elements at all. Two cleanup cases pin EXIT to the stretch a destructor runs in, and a failing destructor to a failed completion. The whole Core suite passes: 440 tests, 3253 steps. --- packages/core/src/component-expansion.ts | 78 +- packages/core/src/expand.ts | 844 +++++++++--------- .../core/tests/component-expansion.test.ts | 121 ++- 3 files changed, 619 insertions(+), 424 deletions(-) diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts index 751b39fb6..b98a562f6 100644 --- a/packages/core/src/component-expansion.ts +++ b/packages/core/src/component-expansion.ts @@ -14,8 +14,9 @@ * settlement readable whether or not the chain returned normally. */ -import { createQueue, ensure } from "effection"; +import { createQueue, ensure, Err, Ok } from "effection"; import type { Operation, Queue, Stream } from "effection"; +import { expandThroughTerminal } from "./component-api.ts"; import type { ComponentExpansionPhase, ComponentExpansionRequest } from "./component-api.ts"; import type { Expansion } from "./expansion.ts"; @@ -303,3 +304,78 @@ function explanatory( : [], }; } + +/** + * Surround one element's work with its canonical observation. + * + * Every path that expands something an author wrote goes through here, so the + * sequence a reader sees, the authority a handler has and the reconciliation + * between the two are decided once rather than per call site. + * + * What the work produces is returned untouched. The observation says what + * happened and nothing more: it cannot read the value, and a handler cannot + * replace it, rescue a failure or complete the element early. + */ +export function* observeExpansion( + expansion: Expansion, + work: (observed: ObservedExpansion) => Operation, +): Operation { + const issued = issueComponentExpansion(expansion); + let produced: { readonly value: T } | undefined; + let terminated = false; + const terminate = (phase: ComponentExpansionPhase): void => { + if (!terminated) { + terminated = true; + issued.finish(phase); + } + }; + issued.publish({ phase: "enter" }); + const observed: ObservedExpansion = { + active: () => issued.publish({ phase: "active" }), + settled: (reason) => issued.publish({ phase: "exit", reason }), + }; + + let chainFailure: unknown; + let chainFailed = false; + try { + try { + yield* expandThroughTerminal(issued.request, (delegated) => + claimComponentExpansion(delegated, function* () { + produced = { value: yield* work(observed) }; + }), + ); + } catch (error) { + chainFailure = error; + chainFailed = true; + } + // Reconciled after the whole dispatch has unwound, middleware cleanup + // included. A handler may refuse the work or fail a success; what it + // cannot do is rescue what canonical expansion raised, which is read back + // from the terminal rather than from whether the chain returned normally. + const settlement = issued.settlement(); + if (settlement.status === "raised") { + terminate({ phase: "complete", result: Err(reported(settlement.raised)) }); + throw settlement.raised; + } + if (settlement.status === "absent") { + const refusal = chainFailed ? chainFailure : settlement.refusal; + terminate({ phase: "complete", result: Err(reported(refusal)) }); + throw refusal; + } + if (chainFailed) { + terminate({ phase: "complete", result: Err(reported(chainFailure)) }); + throw chainFailure; + } + if (produced === undefined) { + const missing = new ComponentExpansionProtocolError("returned before the expansion settled"); + terminate({ phase: "complete", result: Err(reported(missing)) }); + throw missing; + } + terminate({ phase: "complete", result: Ok(undefined) }); + return produced.value; + } finally { + // Nothing terminal was published, so this element unwound without + // completing: a clean cancellation, told after it has finished unwinding. + terminate({ phase: "cancelled" }); + } +} diff --git a/packages/core/src/expand.ts b/packages/core/src/expand.ts index 4ab106068..5566e06a7 100644 --- a/packages/core/src/expand.ts +++ b/packages/core/src/expand.ts @@ -124,14 +124,8 @@ import type { IdentityDomain } from "./invocation-identity.ts"; import { protectedContentLease } from "./protected-content.ts"; import type { SyntaxReference } from "./syntax-reference.ts"; import { withInvocation } from "./invocation.ts"; -import { - claimComponentExpansion, - issueComponentExpansion, - reported, -} from "./component-expansion.ts"; +import { observeExpansion } from "./component-expansion.ts"; import type { ObservedExpansion } from "./component-expansion.ts"; -import { expandThroughTerminal } from "./component-api.ts"; -import type { ComponentExpansionPhase } from "./component-api.ts"; import type { Invocation } from "./invocation.ts"; import { ActiveProjection } from "./projection.ts"; import type { ProjectionHandle, ProjectionRequest } from "./projection.ts"; @@ -1805,93 +1799,97 @@ function* expandEach( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - // Decided from source alone, so the catalog is shared with validation. A - // literal `in` is checked here too; an expression is a value the document - // computes, and its answer is checked below where it arrives. - const violations = eachViolations(segment); - const refusal = violations[0]; - if (refusal !== undefined) { - return [yield* raise(eachError(refusal.message))]; - } - const name = eachItemBinding(segment)!; - const asBinding = eachCaptureBinding(segment); + return yield* structural(segment, path, () => work()); - let items: Json | undefined; - if ("in" in segment.props) { - items = segment.props.in; - } else if ("in" in segment.expressions) { - try { - const resolved = yield* resolveExpressionProps( - {}, - { in: segment.expressions.in }, - "Each", - segment.projectedEnv, - ); - items = resolved.in; - } catch (error) { - return [yield* raise(eachError(error instanceof Error ? error.message : String(error)))]; + function* work(): Operation { + // Decided from source alone, so the catalog is shared with validation. A + // literal `in` is checked here too; an expression is a value the document + // computes, and its answer is checked below where it arrives. + const violations = eachViolations(segment); + const refusal = violations[0]; + if (refusal !== undefined) { + return [yield* raise(eachError(refusal.message))]; } - } - if (!Array.isArray(items)) { - return [yield* raise(eachError(eachItemsViolation(items)!.message))]; - } + const name = eachItemBinding(segment)!; + const asBinding = eachCaptureBinding(segment); - // Effective caller env honors projection through , mirroring - // expandComponent, so a projected resolves both lexical caller - // bindings and the current component's bindings. - const contextEnv = yield* env; - const callerEnv = layerEnvironments(segment.projectedEnv, contextEnv); - const parentEvalScope = yield* evalScope; - - const enclosingLoop = yield* ActiveLoop.get(); - // A rendering iteration writes into the caller's region as it goes, so a - // failure partway leaves the items it already produced behind. A captured one - // builds a value instead: its buffer is private and never becomes output. - const out: Segment[] = asBinding === undefined ? owner : []; - for (const [iteration, item] of items.entries()) { - yield* expandChildrenScoped( - segment.children, - callerEnv ?? undefined, - { [name]: item }, - parentEvalScope ?? undefined, - parentMeta, - parentProps, - hideSet, - counter, - out, - extendPath(path, { f: "item", i: iteration }), - checkedFailures, - environment, - imports, - returnBody, - ); - // A `` in the body exits the enclosing ``, so the remaining - // items are part of the work that iteration no longer does. - if (enclosingLoop?.broken) { - break; + let items: Json | undefined; + if ("in" in segment.props) { + items = segment.props.in; + } else if ("in" in segment.expressions) { + try { + const resolved = yield* resolveExpressionProps( + {}, + { in: segment.expressions.in }, + "Each", + segment.projectedEnv, + ); + items = resolved.in; + } catch (error) { + return [yield* raise(eachError(error instanceof Error ? error.message : String(error)))]; + } + } + if (!Array.isArray(items)) { + return [yield* raise(eachError(eachItemsViolation(items)!.message))]; } - } - if (asBinding === undefined) { - return []; - } + // Effective caller env honors projection through , mirroring + // expandComponent, so a projected resolves both lexical caller + // bindings and the current component's bindings. + const contextEnv = yield* env; + const callerEnv = layerEnvironments(segment.projectedEnv, contextEnv); + const parentEvalScope = yield* evalScope; + + const enclosingLoop = yield* ActiveLoop.get(); + // A rendering iteration writes into the caller's region as it goes, so a + // failure partway leaves the items it already produced behind. A captured one + // builds a value instead: its buffer is private and never becomes output. + const out: Segment[] = asBinding === undefined ? owner : []; + for (const [iteration, item] of items.entries()) { + yield* expandChildrenScoped( + segment.children, + callerEnv ?? undefined, + { [name]: item }, + parentEvalScope ?? undefined, + parentMeta, + parentProps, + hideSet, + counter, + out, + extendPath(path, { f: "item", i: iteration }), + checkedFailures, + environment, + imports, + returnBody, + ); + // A `` in the body exits the enclosing ``, so the remaining + // items are part of the work that iteration no longer does. + if (enclosingLoop?.broken) { + break; + } + } - // A capture never swallows an error. The body reported these where they were - // created (§6.9), so they are returned as they are: the printed errors reach the - // document unchanged and the binding stays unset. - const errors = out.filter((outSegment) => outSegment.type === "error"); - if (errors.length > 0) { - return errors; - } + if (asBinding === undefined) { + return []; + } - const captureEnv = yield* env; - if (!captureEnv) { - return [ - yield* raise(eachError('Prop "as" on requires a parent evaluation environment.')), - ]; + // A capture never swallows an error. The body reported these where they were + // created (§6.9), so they are returned as they are: the printed errors reach the + // document unchanged and the binding stays unset. + const errors = out.filter((outSegment) => outSegment.type === "error"); + if (errors.length > 0) { + return errors; + } + + const captureEnv = yield* env; + if (!captureEnv) { + return [ + yield* raise(eachError('Prop "as" on requires a parent evaluation environment.')), + ]; + } + captureEnv.values[asBinding] = renderSegments(out); + return []; } - captureEnv.values[asBinding] = renderSegments(out); - return []; } /** @@ -1946,6 +1944,37 @@ function ifError(segment: ComponentElement, message: string): ErrorSegment { * handed back untouched, so a `` inside a selected branch settles * once, exactly as it would inline. */ +/** + * Surround one structural element's own work with its canonical observation. + * + * Structural syntax has no separate body to enter: the work it consumes starts + * where the element does, so ACTIVE is published as the region begins and EXIT + * when it ends. Written once here, so a construct that recurses and one that + * selects a branch are observed the same way. + */ +function structural( + segment: { readonly name: string; readonly position?: SourcePosition }, + path: string, + work: () => Operation, +): Operation { + return observeExpansion(snapshot(path, segment.name, segment.position), function* (observed) { + observed.active(); + // Cancellation unless something says otherwise: the `finally` runs on an + // unwind the work never returned from as well as on the two it did. + let reason: "returned" | "failed" | "cancelled" = "cancelled"; + try { + const value = yield* work(); + reason = "returned"; + return value; + } catch (error) { + reason = "failed"; + throw error; + } finally { + observed.settled(reason); + } + }); +} + function* expandIf( segment: ComponentElement, parentMeta: Record, @@ -1961,78 +1990,91 @@ function* expandIf( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - // Decided from source alone and shared with validation: which props were - // written, and how the body splits at its ``. - const unknownProp = ifPropsViolation(segment); - if (unknownProp !== undefined) { - owner.push(yield* raise(ifError(segment, unknownProp.message))); - return; - } + return yield* structural(segment, path, () => work()); + + function* work(): Operation { + // Decided from source alone and shared with validation: which props were + // written, and how the body splits at its ``. + const unknownProp = ifPropsViolation(segment); + if (unknownProp !== undefined) { + owner.push(yield* raise(ifError(segment, unknownProp.message))); + return; + } - const structure = ifStructure(segment); - if (structure.violations.length > 0) { - for (const violation of structure.violations) { - owner.push(yield* raise(structuralErrorSegment(violation, segment))); + const structure = ifStructure(segment); + if (structure.violations.length > 0) { + for (const violation of structure.violations) { + owner.push(yield* raise(structuralErrorSegment(violation, segment))); + } + return; } - return; - } - let condition: unknown; - if ("condition" in segment.props) { - condition = segment.props.condition; - } else if ("condition" in segment.expressions) { - try { - // Evaluated directly rather than through resolveExpressionProps: that - // helper normalizes its result through JSON, which rejects `undefined`, - // rewrites `NaN` as `null`, and throws on a BigInt. A condition is - // decided and discarded rather than passed on or recorded, so it takes - // any JavaScript value and crosses no serialization boundary. - condition = yield* evaluateExpression( - segment.expressions.condition, - "If", - "condition", - segment.projectedEnv, - ); - } catch (error) { - owner.push( - yield* raise(ifError(segment, error instanceof Error ? error.message : String(error))), - ); + let condition: unknown; + if ("condition" in segment.props) { + condition = segment.props.condition; + } else if ("condition" in segment.expressions) { + try { + // Evaluated directly rather than through resolveExpressionProps: that + // helper normalizes its result through JSON, which rejects `undefined`, + // rewrites `NaN` as `null`, and throws on a BigInt. A condition is + // decided and discarded rather than passed on or recorded, so it takes + // any JavaScript value and crosses no serialization boundary. + condition = yield* evaluateExpression( + segment.expressions.condition, + "If", + "condition", + segment.projectedEnv, + ); + } catch (error) { + owner.push( + yield* raise(ifError(segment, error instanceof Error ? error.message : String(error))), + ); + return; + } + } else { + owner.push(yield* raise(ifError(segment, ifConditionViolation(segment)!.message))); return; } - } else { - owner.push(yield* raise(ifError(segment, ifConditionViolation(segment)!.message))); - return; - } - const selected = !!condition; + const selected = !!condition; - // The false arm belongs to ``, which is consumed above, so its frame is - // added here — otherwise both arms of one `` expand under one path. - const branchPath = - selected || structure.elseElement === undefined - ? path - : extendPath( - path, - elementFrame( - structure.elseElement.name, - elementSite(structure.elseElement.position, structure.elseIndex ?? 0), - ), - ); + // The false arm belongs to ``, which is consumed above, so its frame is + // added here — otherwise both arms of one `` expand under one path. + const branchPath = + selected || structure.elseElement === undefined + ? path + : extendPath( + path, + elementFrame( + structure.elseElement.name, + elementSite(structure.elseElement.position, structure.elseIndex ?? 0), + ), + ); - yield* expandSegmentsWithin( - selected ? structure.whenTrue : structure.whenFalse, - parentMeta, - parentProps, - hideSet, - counter, - owner, - branchPath, - 0, - checkedFailures, - environment, - imports, - returnBody, - ); + const branch = function* (): Operation { + yield* expandSegmentsWithin( + selected ? structure.whenTrue : structure.whenFalse, + parentMeta, + parentProps, + hideSet, + counter, + owner, + branchPath, + 0, + checkedFailures, + environment, + imports, + returnBody, + ); + }; + // The `` is an element of its own, and only when it is the arm that + // runs: the unselected arm expands nothing, so it is told nothing. + if (selected || structure.elseElement === undefined) { + yield* branch(); + return; + } + yield* structural(structure.elseElement, branchPath, branch); + } } function switchError(segment: ComponentElement, message: string): ErrorSegment { @@ -2103,73 +2145,82 @@ function* expandSwitch( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - // Decided from source alone and shared with validation: which props were - // written, and how the body divides into branches. - const structure = switchStructure(segment); - if (structure.violations.length > 0) { - for (const violation of structure.violations) { - owner.push(yield* raise(structuralErrorSegment(violation, segment))); + return yield* structural(segment, path, () => work()); + + function* work(): Operation { + // Decided from source alone and shared with validation: which props were + // written, and how the body divides into branches. + const structure = switchStructure(segment); + if (structure.violations.length > 0) { + for (const violation of structure.violations) { + owner.push(yield* raise(structuralErrorSegment(violation, segment))); + } + return; } - return; - } - - let selector: unknown; - try { - selector = yield* structuralOperand(segment, "Switch"); - } catch (error) { - owner.push( - yield* raise(switchError(segment, error instanceof Error ? error.message : String(error))), - ); - return; - } - let selected: SwitchCase | undefined; - for (const candidate of structure.matching) { - let matcher: unknown; + let selector: unknown; try { - matcher = yield* structuralOperand(candidate.element, "Case"); + selector = yield* structuralOperand(segment, "Switch"); } catch (error) { owner.push( - yield* raise( - caseError(candidate.element, error instanceof Error ? error.message : String(error)), - ), + yield* raise(switchError(segment, error instanceof Error ? error.message : String(error))), ); return; } - // The `===` operator, and nothing else: `NaN` matches no case including one - // written `NaN`, `0` and `-0` are the same value, and two objects match only - // when they are the same object. - if (selector === matcher) { - selected = candidate; - break; + + let selected: SwitchCase | undefined; + for (const candidate of structure.matching) { + let matcher: unknown; + try { + matcher = yield* structuralOperand(candidate.element, "Case"); + } catch (error) { + owner.push( + yield* raise( + caseError(candidate.element, error instanceof Error ? error.message : String(error)), + ), + ); + return; + } + // The `===` operator, and nothing else: `NaN` matches no case including one + // written `NaN`, `0` and `-0` are the same value, and two objects match only + // when they are the same object. + if (selector === matcher) { + selected = candidate; + break; + } } - } - const chosen = selected ?? structure.fallback; - if (chosen === undefined) { - return; - } + const chosen = selected ?? structure.fallback; + if (chosen === undefined) { + return; + } - // The selected `` is consumed above and never reaches dispatch, so its - // frame is added here — otherwise corresponding children of two branches - // would expand under one path (§5.6). - yield* expandSegmentsWithin( - chosen.element.children, - parentMeta, - parentProps, - hideSet, - counter, - owner, - extendPath( + // The selected `` is consumed above and never reaches dispatch, so its + // frame is added here — otherwise corresponding children of two branches + // would expand under one path (§5.6). + const casePath = extendPath( path, elementFrame(chosen.element.name, elementSite(chosen.element.position, chosen.index)), - ), - 0, - checkedFailures, - environment, - imports, - returnBody, - ); + ); + // The chosen `` is an element of its own; the ones that were not + // chosen expand nothing and are told nothing. + yield* structural(chosen.element, casePath, () => + expandSegmentsWithin( + chosen.element.children, + parentMeta, + parentProps, + hideSet, + counter, + owner, + casePath, + 0, + checkedFailures, + environment, + imports, + returnBody, + ), + ); + } } function loopError(segment: ComponentElement, message: string): ErrorSegment { @@ -2246,103 +2297,107 @@ function* expandLoop( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - const unknownProp = loopPropsViolation(segment); - if (unknownProp !== undefined) { - owner.push(yield* raise(loopError(segment, unknownProp.message))); - return; - } + return yield* structural(segment, path, () => work()); - if ("name" in segment.expressions) { - owner.push( - yield* raise(loopError(segment, 'Prop "name" on must be a string literal.')), - ); - return; - } - const name = segment.props.name; - if (name !== undefined && (typeof name !== "string" || name.length === 0)) { - owner.push( - yield* raise(loopError(segment, 'Prop "name" on must be a non-empty string.')), - ); - return; - } + function* work(): Operation { + const unknownProp = loopPropsViolation(segment); + if (unknownProp !== undefined) { + owner.push(yield* raise(loopError(segment, unknownProp.message))); + return; + } - const bound = yield* resolveLoopBound(segment); - if (!bound.ok) { - owner.push(yield* raise(loopError(segment, bound.error.message))); - return; - } + if ("name" in segment.expressions) { + owner.push( + yield* raise(loopError(segment, 'Prop "name" on must be a string literal.')), + ); + return; + } + const name = segment.props.name; + if (name !== undefined && (typeof name !== "string" || name.length === 0)) { + owner.push( + yield* raise(loopError(segment, 'Prop "name" on must be a non-empty string.')), + ); + return; + } - // Taken from the shared block counter, so every `` an execution enters - // — including each entry into a nested one — has a distinct identity that - // lands the same way on replay. - const identity: LoopIdentity = { - id: counter.next(), - ...(name === undefined ? {} : { name }), - ...(segment.position === undefined ? {} : { position: segment.position }), - }; + const bound = yield* resolveLoopBound(segment); + if (!bound.ok) { + owner.push(yield* raise(loopError(segment, bound.error.message))); + return; + } - const frame: LoopFrame = { broken: false }; - let started = 0; + // Taken from the shared block counter, so every `` an execution enters + // — including each entry into a nested one — has a distinct identity that + // lands the same way on replay. + const identity: LoopIdentity = { + id: counter.next(), + ...(name === undefined ? {} : { name }), + ...(segment.position === undefined ? {} : { position: segment.position }), + }; - try { - yield* scoped(function* () { - yield* ActiveLoop.set(frame); - for (let iteration = 0; iteration < bound.value; iteration++) { - yield* recordIteration(identity, iteration); - started = iteration + 1; - yield* expandSegmentsWithin( - segment.children, - parentMeta, - parentProps, - hideSet, - counter, - owner, - extendPath(path, { f: "iter", i: iteration }), - 0, - checkedFailures, - environment, - imports, - returnBody, - ); - if (frame.broken) { - break; + const frame: LoopFrame = { broken: false }; + let started = 0; + + try { + yield* scoped(function* () { + yield* ActiveLoop.set(frame); + for (let iteration = 0; iteration < bound.value; iteration++) { + yield* recordIteration(identity, iteration); + started = iteration + 1; + yield* expandSegmentsWithin( + segment.children, + parentMeta, + parentProps, + hideSet, + counter, + owner, + extendPath(path, { f: "iter", i: iteration }), + 0, + checkedFailures, + environment, + imports, + returnBody, + ); + if (frame.broken) { + break; + } } + }); + } catch (error) { + // A durability failure is not an outcome of the loop's work, and recording + // one would reach the journal twice over: it appends an entry on top of a + // journal already known not to describe this run, and on replay it consumes + // a terminal entry an earlier run wrote — which is how a stale journal + // would quietly hand this loop a different outcome. The durability failure + // stays the primary error. + const durability = durabilityFailure(error); + if (durability !== undefined) { + // The durability failure itself, not whatever wrapped it. A teardown + // aggregate or an AggregateError says how the failure travelled, not what + // went wrong, and the caller has to see which journal entry stopped + // describing this run. + throw durability; } - }); - } catch (error) { - // A durability failure is not an outcome of the loop's work, and recording - // one would reach the journal twice over: it appends an entry on top of a - // journal already known not to describe this run, and on replay it consumes - // a terminal entry an earlier run wrote — which is how a stale journal - // would quietly hand this loop a different outcome. The durability failure - // stays the primary error. - const durability = durabilityFailure(error); - if (durability !== undefined) { - // The durability failure itself, not whatever wrapped it. A teardown - // aggregate or an AggregateError says how the failure travelled, not what - // went wrong, and the caller has to see which journal entry stopped - // describing this run. - throw durability; - } - // An ordinary document failure is the loop's own outcome. Recorded from the - // catch rather than a destructor: this frame is still live here, so the - // entry lands in the journal before the failure leaves the loop. - try { - yield* recordOutcome(identity, { iterations: started, outcome: "error" }); - } catch (recording) { - // Recording found the journal recording a different outcome. That is the - // more fundamental failure and becomes the primary one, but the document - // failure that reached it is what the author has to fix. - if (recording instanceof Error && recording.cause === undefined) { - recording.cause = error; + // An ordinary document failure is the loop's own outcome. Recorded from the + // catch rather than a destructor: this frame is still live here, so the + // entry lands in the journal before the failure leaves the loop. + try { + yield* recordOutcome(identity, { iterations: started, outcome: "error" }); + } catch (recording) { + // Recording found the journal recording a different outcome. That is the + // more fundamental failure and becomes the primary one, but the document + // failure that reached it is what the author has to fix. + if (recording instanceof Error && recording.cause === undefined) { + recording.cause = error; + } + throw recording; } - throw recording; + throw error; } - throw error; - } - const outcome: LoopOutcome = frame.broken ? "break" : "exhausted"; - yield* recordOutcome(identity, { iterations: started, outcome }); + const outcome: LoopOutcome = frame.broken ? "break" : "exhausted"; + yield* recordOutcome(identity, { iterations: started, outcome }); + } } /** @@ -2442,19 +2497,23 @@ function spawnChild( // a checked command failure inside one child fails that child, and a // sibling's walk is not stopped by a ledger it does not own. const ledger = containedLedger(inherited); - yield* expandSegmentsWithin( - spawn.element.children, - parentMeta, - parentProps, - new Set(hideSet), - createBlockCounter(), - segments, - childPath, - 0, - ledger, - environment, - imports, - undefined, + // Each child the `` actually runs is its own element, observed on its + // own: real siblings reach their phases independently of each other. + yield* structural(spawn.element, childPath, () => + expandSegmentsWithin( + spawn.element.children, + parentMeta, + parentProps, + new Set(hideSet), + createBlockCounter(), + segments, + childPath, + 0, + ledger, + environment, + imports, + undefined, + ), ); yield* refuseCheckedFailure(ledger); // Runs rather than one joined string. What a child produced is prose, or a @@ -2500,57 +2559,61 @@ function* expandAll( environment: ExecutionEnvironment | undefined, imports: ComponentImportTerminal | undefined, ): Operation { - // Decided from source alone and shared with validation, completely, before a - // child is constructed: a malformed `` starts none of them. - const structure = allStructure(segment); - if (structure.violations.length > 0) { - for (const violation of structure.violations) { - owner.push(yield* raise(structuralErrorSegment(violation, segment))); + return yield* structural(segment, path, () => work()); + + function* work(): Operation { + // Decided from source alone and shared with validation, completely, before a + // child is constructed: a malformed `` starts none of them. + const structure = allStructure(segment); + if (structure.violations.length > 0) { + for (const violation of structure.violations) { + owner.push(yield* raise(structuralErrorSegment(violation, segment))); + } + return; } - return; - } - // Read once, here: every child starts from the same incoming snapshot, and - // reading it inside a child would let whichever ran first decide what the - // others saw. - const incoming = yield* env; - const children = structure.spawns.map( - (spawn) => () => - spawnChild( - spawn, - incoming, - parentMeta, - parentProps, - hideSet, - path, - checkedFailures, - environment, - imports, - ), - ); + // Read once, here: every child starts from the same incoming snapshot, and + // reading it inside a child would let whichever ran first decide what the + // others saw. + const incoming = yield* env; + const children = structure.spawns.map( + (spawn) => () => + spawnChild( + spawn, + incoming, + parentMeta, + parentProps, + hideSet, + path, + checkedFailures, + environment, + imports, + ), + ); - const scope = yield* useScope(); - const rendered = - scope.get(DurableContext) === undefined - ? yield* all(children.map((child) => child())) - : (yield* durableAll( - children.map((child) => (): Workflow => ephemeral(retained(child()))), - )).map(readEmissions); - - for (const runs of rendered) { - for (const run of runs) { - if (run.text === "") { - continue; - } - // One segment per run, and the exact ones are marked again here: the - // record is keyed by segment identity, and these segments are this - // region's, not the child's. A child that ran on a previous attempt says - // what its runs were through its own durable close, so a replay marks - // exactly what the live run marked. - const segment: Segment = { type: "text", content: run.text }; - owner.push(segment); - if (run.exact) { - markExactSource(environment?.sourceSegments, [segment]); + const scope = yield* useScope(); + const rendered = + scope.get(DurableContext) === undefined + ? yield* all(children.map((child) => child())) + : (yield* durableAll( + children.map((child) => (): Workflow => ephemeral(retained(child()))), + )).map(readEmissions); + + for (const runs of rendered) { + for (const run of runs) { + if (run.text === "") { + continue; + } + // One segment per run, and the exact ones are marked again here: the + // record is keyed by segment identity, and these segments are this + // region's, not the child's. A child that ran on a previous attempt says + // what its runs were through its own durable close, so a replay marks + // exactly what the live run marked. + const segment: Segment = { type: "text", content: run.text }; + owner.push(segment); + if (run.exact) { + markExactSource(environment?.sourceSegments, [segment]); + } } } } @@ -2696,75 +2759,12 @@ function* expandComponent( imports: ComponentImportTerminal | undefined, returnBody: ReturnBody | undefined, ): Operation { - // Issued before resolution, props validation or any body: what an observer - // is offered is the whole of this element's expansion, including the parts - // that decide whether it has one. - const issued = issueComponentExpansion(snapshot(path, name, position)); - let produced: Segment[] = []; - let terminated = false; - const terminate = (phase: ComponentExpansionPhase): void => { - if (!terminated) { - terminated = true; - issued.finish(phase); - } - }; - issued.publish({ phase: "enter" }); - const observed: ObservedExpansion = { - active: () => issued.publish({ phase: "active" }), - settled: (reason) => issued.publish({ phase: "exit", reason }), - }; - /** - * The body's own work ended, and why — told before this invocation's ordered - * teardown runs, which is exactly the stretch a reader watching a destructor - * sees the element waiting in. - */ - const settledExit = observed.settled; - let chainFailure: unknown; - let chainFailed = false; - try { - try { - yield* expandThroughTerminal(issued.request, (delegated) => - claimComponentExpansion(delegated, function* () { - produced = yield* work(); - }), - ); - } catch (error) { - chainFailure = error; - chainFailed = true; - } - // Reconciled after the whole dispatch has unwound, middleware cleanup - // included, so what completion says accounts for everything this element - // owned. A handler may refuse the work or fail a success; what it cannot do - // is rescue what canonical expansion raised, which is read back from the - // terminal rather than from whether the chain returned normally. - const settlement = issued.settlement(); - if (settlement.status === "raised") { - terminate({ phase: "complete", result: Err(reported(settlement.raised)) }); - throw settlement.raised; - } - const refusal = - settlement.status === "absent" - ? chainFailed - ? chainFailure - : settlement.refusal - : undefined; - if (refusal !== undefined) { - terminate({ phase: "complete", result: Err(reported(refusal)) }); - throw refusal; - } - if (chainFailed) { - terminate({ phase: "complete", result: Err(reported(chainFailure)) }); - throw chainFailure; - } - terminate({ phase: "complete", result: Ok(undefined) }); - return produced; - } finally { - // Nothing terminal was published, so this element unwound without - // completing: a clean cancellation, told after it has finished unwinding. - terminate({ phase: "cancelled" }); - } + // Surrounded before resolution, props validation or any body: what an + // observer is offered is the whole of this element's expansion, including + // the parts that decide whether it has one. + return yield* observeExpansion(snapshot(path, name, position), (observed) => work(observed)); - function* work(): Operation { + function* work(observed: ObservedExpansion): Operation { // Cycle detection — Prosser's algorithm if (hideSet.has(name)) { return [ @@ -3165,7 +3165,7 @@ function* expandComponent( imports, returnBody, ); - }, settledExit); + }, observed.settled); } catch (error) { // Body fail-fast propagates unchanged; a return-value failure is the // component's own printed error and follows the caller's error mode. @@ -3214,7 +3214,7 @@ function* expandComponent( imports, returnBody, ); - }, settledExit); + }, observed.settled); // Exact source is a provenance, and both halves of it are read here from // things no answer can write: that canonical execution authorized this import diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts index 4c3faea50..9579245ab 100644 --- a/packages/core/tests/component-expansion.test.ts +++ b/packages/core/tests/component-expansion.test.ts @@ -12,7 +12,7 @@ import { describe, it } from "@executablemd/test-support/bdd"; import { expect } from "@executablemd/test-support/expect"; -import { each, scoped, sleep, useScope, withResolvers } from "effection"; +import { each, ensure, scoped, sleep, useScope, withResolvers } from "effection"; import type { Scope } from "effection"; import type { Operation } from "effection"; import { Component } from "../src/component-api.ts"; @@ -340,6 +340,125 @@ describe("Tier CX — what surrounds one expansion", () => { expect(observed.report).toBe(unobserved); }); + it("CX1: structural work crosses the seam once, and only where it runs", function* () { + const source = [ + '', + '', + '', + "", + "", + "skipped", + "", + "", + "", + ].join("\n"); + const { watched, failure } = yield* watch(source, { + Hello: component("Hello", function* () { + return "hi"; + }), + }); + expect(failure).toBe(undefined); + + const counted = new Map(); + for (const [, phases] of watched.seen) { + const name = watched.requests.find( + (request) => watched.seen.get(request.expansion.id) === phases, + )?.expansion.name; + counted.set(name ?? "?", (counted.get(name ?? "?") ?? 0) + 1); + } + + // Every construct that actually consumed a region is surrounded once, and + // each real sibling of the `` is its own element. + expect(counted.get("Switch")).toBe(1); + expect(counted.get("If")).toBe(1); + expect(counted.get("All")).toBe(1); + expect(counted.get("Spawn")).toBe(2); + // One `` was chosen; the other expanded nothing and is told nothing. + expect(counted.get("Case")).toBe(1); + // The `` ran, so it is an element; `skipped` is the arm that did not. + expect(counted.get("Else")).toBe(1); + // Four `` bodies: one per selected region. + expect(counted.get("Hello")).toBe(4); + + // Every element that ran reached a terminal observation, exactly one. + for (const [, phases] of watched.seen) { + const terminals = phases.filter( + (one) => one.phase === "complete" || one.phase === "cancelled", + ); + expect(terminals.length).toBe(1); + } + }); + + it("CX1: an unselected branch and passive syntax are told nothing", function* () { + const source = + '\ntaken\n' + + '\n\n'; + const { watched, failure } = yield* watch(source, { + Boom: component("Boom", function* () { + throw new Error("the branch that was not chosen ran"); + }), + }); + + expect(failure).toBe(undefined); + const names = watched.requests.map((one) => one.expansion.name).sort(); + // The chosen Case, and the Switch around it. The unchosen Case never + // expanded, so neither it nor the component inside it was ever an element. + expect(names).toEqual(["Case", "Switch"]); + }); + + it("CX2: a body that has returned stays in EXIT while its cleanup runs", function* () { + const entered = withResolvers(); + const release = withResolvers(); + const observedDuringCleanup: string[] = []; + const { rendered } = yield* watch( + "", + { + Held: component("Held", function* () { + // Registered before anything is acquired, and held open after the + // body returns: this is the stretch EXIT exists to describe. + yield* ensure(function* () { + entered.resolve(); + yield* release.operation; + }); + return "held"; + }), + }, + function* (request, next, read, owner) { + owner.run(function* () { + yield* entered.operation; + // The body has returned and its destructor is standing. + read((phase) => observedDuringCleanup.push(phase.phase)); + release.resolve(); + }); + yield* next(request); + }, + ); + + expect(rendered).toBe("held"); + // Where the element was while its cleanup ran, and only then completed. + expect(observedDuringCleanup[0]).toBe("exit"); + expect(observedDuringCleanup[observedDuringCleanup.length - 1]).toBe("complete"); + }); + + it("CX2: cleanup that fails completes the element with a failure", function* () { + const { watched, report } = yield* watch("", { + Leaky: component("Leaky", function* () { + yield* ensure(function* () { + throw new Error("the destructor said no"); + }); + return "body was fine"; + }), + }); + + const phases = [...watched.seen.values()][0]; + const exit = phases.find((one) => one.phase === "exit"); + // The body itself returned; the failure belongs to the teardown after it. + expect(exit?.phase === "exit" && exit.reason).toBe("returned"); + const complete = phases[phases.length - 1]; + expect(complete.phase === "complete" && complete.result.ok).toBe(false); + expect(report).toContain("the destructor said no"); + }); + it("CX4: a late subscriber is told where it is, without earlier replay", function* () { const started = withResolvers(); const release = withResolvers(); From b122a9f2bd12ba9e50ed5a33646532e4abd38bf2 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 06:12:41 -0400 Subject: [PATCH 06/19] =?UTF-8?q?=F0=9F=9A=A7=20Keep=20what=20this=20proce?= =?UTF-8?q?ss=20is=20doing,=20element=20by=20element=20(#881=20PR=202,=20l?= =?UTF-8?q?ayer=203b)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A private lifecycle module holds the session's reading. Each actual call of an element gets a key of this entry's own, so a document that writes one element twice is two calls and a repeated logical id never overwrites anything; the enclosing key is bound *around* the delegation, following the controller's own `CurrentWalk` composition, so descendants know which call they are in while their capability environment stays as narrow as it was. Consumers run on the session's owner as siblings of the dispatch. That is not a preference: Core publishes the terminal phase after the dispatch unwinds, so a consumer owned by the handler would be gone before it was told, and one the handler joined would wait for itself. A question counts a wait against the element that is asking it, read from the lineage where the wait is taken, so two concurrent questions are two waiting elements rather than one session that is "busy". Ordinary suspension counts nothing. ACTIVE is now published where resolution and validation accept the element, which is where the accepted work starts on every body path — a refusal above it is an element that never became active at all. The session's liveness release moved to the entry's own finalizer, so `live` turns false after the execution, the output consumer and the Agent attachment have all released, and the completion wake is announced even when nothing was appended. Tier L drives real sessions: repeated calls, nested lineage, a counted question wait that stops when answered, ordinary work counting nothing, an entry that takes its reading with it, and observed and unobserved runs rendering the same thing. --- packages/cli/src/repl/elicitation.ts | 98 +++++--- packages/cli/src/repl/lifecycle.ts | 276 ++++++++++++++++++++++ packages/cli/src/repl/session.ts | 41 +++- packages/cli/tests/repl-lifecycle.test.ts | 202 ++++++++++++++++ packages/core/src/component-expansion.ts | 11 +- packages/core/src/expand.ts | 5 + 6 files changed, 590 insertions(+), 43 deletions(-) create mode 100644 packages/cli/src/repl/lifecycle.ts create mode 100644 packages/cli/tests/repl-lifecycle.test.ts diff --git a/packages/cli/src/repl/elicitation.ts b/packages/cli/src/repl/elicitation.ts index e7f42cceb..8177adaaf 100644 --- a/packages/cli/src/repl/elicitation.ts +++ b/packages/cli/src/repl/elicitation.ts @@ -42,6 +42,7 @@ */ import { action, createSignal } from "effection"; +import type { ReplWaits } from "./lifecycle.ts"; import type { Operation, Stream } from "effection"; import { Elicitation, ElicitationProviderError, prepareElicitation } from "@executablemd/core"; import { validateParsed } from "@executablemd/core"; @@ -433,7 +434,15 @@ export function readQuestionForm(schema: Json): ReplQuestionForm { * outermost, so an outer provider would answer ahead of this one — the opposite * of what a provider is. */ -export function* useReplElicitation(): Operation { +export function* useReplElicitation( + /** + * Where a question says the element asking it is waiting, or none. + * + * Optional because the provider is complete without it: counting a wait is + * something a reading wants, not something answering a question needs. + */ + waits?: ReplWaits, +): Operation { const changes = createSignal(); let pending: ReplQuestion | undefined; let asked = 0; @@ -453,44 +462,51 @@ export function* useReplElicitation(): Operation { // thing that will judge the answer on its way out. const prepared = yield* prepareElicitation(request.schema, "Elicit"); asked++; - return yield* action(function (resolve) { - let settled = false; - const question: ReplQuestion = { - message: request.message, - // No schema member. The parsed form is everything a reader needs, - // and retaining the caller's object would hand a live reference to - // whatever built it out to the application. - form, - submit(values: Readonly>): ReplFormOutcome { - if (settled) { - return { kind: "invalid", issues: [] }; - } - // Every property the form actually holds, copied into a plain - // object — the empty string included. An optional field someone - // deliberately cleared is present and empty, which a schema may - // well accept; dropping it would answer a different question from - // the one on the screen. A field nobody has touched is absent. - const assembled: Record = {}; - for (const field of form.fields) { - const value = values[field.name]; - if (value !== undefined) { - assembled[field.name] = value; + // This element is waiting on an answer, from here until the question + // stops existing — however it stops: answered, halted or failed above. + const release = yield* waits?.hold("question") ?? noWait(); + try { + return yield* action(function (resolve) { + let settled = false; + const question: ReplQuestion = { + message: request.message, + // No schema member. The parsed form is everything a reader needs, + // and retaining the caller's object would hand a live reference to + // whatever built it out to the application. + form, + submit(values: Readonly>): ReplFormOutcome { + if (settled) { + return { kind: "invalid", issues: [] }; + } + // Every property the form actually holds, copied into a plain + // object — the empty string included. An optional field someone + // deliberately cleared is present and empty, which a schema may + // well accept; dropping it would answer a different question from + // the one on the screen. A field nobody has touched is absent. + const assembled: Record = {}; + for (const field of form.fields) { + const value = values[field.name]; + if (value !== undefined) { + assembled[field.name] = value; + } } - } - const issues = validateParsed(prepared.validate, assembled); - if (issues.length > 0) { - return { kind: "invalid", issues: Object.freeze([...issues]) }; - } - settled = true; - resolve(assembled); - return { kind: "answered", answer: Object.freeze({ ...assembled }) }; - }, - }; - publish(question); - // Whatever ends this — an answer, a halt, a failure upstream — the - // request stops being pending exactly when it stops existing. - return () => publish(undefined); - }); + const issues = validateParsed(prepared.validate, assembled); + if (issues.length > 0) { + return { kind: "invalid", issues: Object.freeze([...issues]) }; + } + settled = true; + resolve(assembled); + return { kind: "answered", answer: Object.freeze({ ...assembled }) }; + }, + }; + publish(question); + // Whatever ends this — an answer, a halt, a failure upstream — the + // request stops being pending exactly when it stops existing. + return () => publish(undefined); + }); + } finally { + release(); + } }, }, { at: "min" }, @@ -506,3 +522,9 @@ export function* useReplElicitation(): Operation { }, }; } + +/** No reading is counting waits, so nothing is held and nothing is released. */ +// deno-lint-ignore require-yield +function* noWait(): Operation<() => void> { + return () => {}; +} diff --git a/packages/cli/src/repl/lifecycle.ts b/packages/cli/src/repl/lifecycle.ts new file mode 100644 index 000000000..d233f4e4a --- /dev/null +++ b/packages/cli/src/repl/lifecycle.ts @@ -0,0 +1,276 @@ +/** + * What this process is doing right now, element by element. + * + * Core says where one expansion has reached; this is where the session keeps + * what it was told, for as long as the entry that caused it is open. It is a + * reading, not a record: nothing here reaches the Journal, a cold process + * reconstructs none of it, and an entry that goes takes its observations with + * it. + * + * ## One call, not one name + * + * An expansion id names a logical element. A document that writes the same + * element twice, or writes one inside a ``, produces several *calls* of + * it, and a reader watching the second must not be shown the first. Each + * actual call is given an occurrence key of this entry's own, and the + * enclosing key is bound around the delegation, so the calls under one element + * are its children and a repeated id never overwrites anything. + * + * The lineage is presentation and only presentation. It is bound in a context + * a descendant can rebind, which is exactly why nothing that must be + * authoritative reads it: a generated fragment inherits where it is being + * shown while its capability environment stays as narrow as it was. + * + * ## Consumers are siblings of the dispatch, never children + * + * Core publishes an element's terminal phase after the whole middleware + * dispatch has unwound. A consumer spawned on the handler's own frame is torn + * down before that, so it never learns the element finished — and one the + * handler *joined* would wait for a phase that cannot arrive until the handler + * returns. Consumers therefore run on the entry's own owner, started before + * the delegation and outliving it. + */ + +import { createSignal, each, ensure, useScope } from "effection"; +import type { Operation, Scope, Stream } from "effection"; +import { Component } from "@executablemd/core/api"; +import type { ComponentExpansionPhase, ComponentExpansionRequest } from "@executablemd/core/api"; +import { createContext } from "effection"; +import type { Context } from "effection"; +import type { ExecutionInstallation } from "@executablemd/core/host"; +import type { SourcePosition } from "@executablemd/core"; + +/** Where one call of one element has reached, as a reader sees it. */ +export type ReplLifecyclePhase = "enter" | "active" | "exit" | "settled" | "failed" | "cancelled"; + +/** One actual call of one authored element. */ +export interface ReplOccurrence { + /** This entry's own key for this call. Never a logical id. */ + readonly key: string; + /** The logical element this is a call of. */ + readonly expansion: string; + readonly name: string; + /** The call this one was reached through, or none at the top. */ + readonly parent: string | undefined; + readonly position: Readonly | undefined; + readonly phase: ReplLifecyclePhase; + /** Why an element that has not settled is waiting, if it is. */ + readonly waiting: readonly ReplWaitReason[]; +} + +/** What an element is waiting on, counted rather than guessed. */ +export type ReplWaitReason = "question" | "permission" | "expansion"; + +/** + * Counting one reason an element is waiting, for whoever actually waits. + * + * The narrow half of the lifecycle, handed to a provider so it can say "this + * element is waiting on me" without being able to read, change or end anything + * else. A provider given none counts nothing, which is what an execution with + * no session reading behaves like. + */ +export interface ReplWaits { + hold(reason: ReplWaitReason): Operation<() => void>; +} + +/** Everything this entry is doing, detached and immutable. */ +export interface ReplLifecycleReading { + /** The entry these observations belong to, or none between entries. */ + readonly entry: string | undefined; + /** Every call, in the order it was first observed. */ + readonly occurrences: readonly ReplOccurrence[]; +} + +/** Nothing observed. What a reading is between entries, and after one closes. */ +export const NO_LIFECYCLE: ReplLifecycleReading = Object.freeze({ + entry: undefined, + occurrences: Object.freeze([]), +}); + +export interface ReplLifecycle { + /** Installed into one execution, carrying this session's observation. */ + readonly installation: ExecutionInstallation; + /** Begin this entry's generation. Updates from an older one are refused. */ + open(entry: string): void; + /** End it, and drop what it was holding. */ + close(entry: string): void; + /** What this entry is doing now. Detached: the caller may keep it. */ + reading(): ReplLifecycleReading; + /** + * Count one reason the element being expanded is waiting, until released. + * + * An operation, because the call it belongs to is read from the lineage + * where the wait is taken: two concurrent questions are two waits on two + * elements rather than one session that is "busy". Releasing is idempotent, + * and a wait taken outside any element releases nothing. + */ + hold(reason: ReplWaitReason): Operation<() => void>; + /** Announced whenever the reading changed. */ + readonly changes: Stream; +} + +/** + * The call a descendant was reached through. + * + * Presentation lineage, nothing else. It is an ordinary context, so a + * descendant may rebind it for its own descendants — which is why no + * authority, identity or durable decision reads it. + */ +const CurrentOccurrence: Context = createContext( + "repl.lifecycle.occurrence", + undefined, +); + +interface Observed { + key: string; + expansion: string; + name: string; + parent: string | undefined; + position: Readonly | undefined; + phase: ReplLifecyclePhase; + waiting: ReplWaitReason[]; +} + +export function useReplLifecycle(): Operation { + return { + *[Symbol.iterator]() { + // The owner every consumer runs under: the session's own scope, which + // outlives any one element's dispatch. + const owner: Scope = yield* useScope(); + const changes = createSignal(); + let generation: string | undefined; + let sequence = 0; + const observed = new Map(); + + const announce = (): void => { + changes.send(reading()); + }; + const reading = (): ReplLifecycleReading => + Object.freeze({ + entry: generation, + occurrences: Object.freeze( + [...observed.values()].map((one) => + Object.freeze({ + key: one.key, + expansion: one.expansion, + name: one.name, + parent: one.parent, + position: one.position, + phase: one.phase, + waiting: Object.freeze([...one.waiting]), + }), + ), + ), + }); + + const settle = (key: string, phase: ComponentExpansionPhase): void => { + const one = observed.get(key); + if (one === undefined) { + return; + } + if (phase.phase === "complete") { + one.phase = phase.result.ok ? "settled" : "failed"; + } else if (phase.phase === "cancelled") { + one.phase = "cancelled"; + } else if (phase.phase === "exit") { + one.phase = "exit"; + } else { + one.phase = phase.phase; + } + announce(); + }; + + const lifecycle: ReplLifecycle = { + installation: { + *install(): Operation { + yield* Component.around({ + *expand([request]: [ComponentExpansionRequest], next) { + const entry = generation; + if (entry === undefined) { + // Nothing is open to attribute this to. Observation is never + // a reason to change what executes, so it is delegated as it + // is and nothing is recorded. + yield* next(request); + return; + } + sequence += 1; + const key = `${entry}#${sequence}`; + const parent = yield* CurrentOccurrence.get(); + observed.set(key, { + key, + expansion: request.expansion.id, + name: request.expansion.name, + parent, + position: request.expansion.position, + phase: "enter", + waiting: [], + }); + announce(); + // Started before the delegation and owned by the session, so + // it is still there when the terminal phase is published after + // this handler has unwound. + owner.run(function* () { + for (const phase of yield* each(request.phases)) { + if (generation === entry) { + settle(key, phase); + } + yield* each.next(); + } + }); + // Bound *around* the delegation rather than set on this + // frame, which is what makes it the enclosing key for + // everything the call reaches — generated descendants + // included — and for nothing beside it. + yield* CurrentOccurrence.with(key, () => next(request)); + }, + }); + }, + }, + open(entry: string): void { + generation = entry; + sequence = 0; + observed.clear(); + announce(); + }, + close(entry: string): void { + if (generation !== entry) { + return; + } + generation = undefined; + observed.clear(); + announce(); + }, + reading, + *hold(reason: ReplWaitReason): Operation<() => void> { + // The call that is waiting is the one this wait was taken inside. + const key = yield* CurrentOccurrence.get(); + const one = key === undefined ? undefined : observed.get(key); + if (one === undefined) { + return () => {}; + } + one.waiting.push(reason); + announce(); + let released = false; + return () => { + if (released) { + return; + } + released = true; + const at = one.waiting.indexOf(reason); + if (at >= 0) { + one.waiting.splice(at, 1); + } + announce(); + }; + }, + changes, + }; + + yield* ensure(() => { + generation = undefined; + observed.clear(); + }); + return lifecycle; + }, + }; +} diff --git a/packages/cli/src/repl/session.ts b/packages/cli/src/repl/session.ts index e5c5164e5..98388852c 100644 --- a/packages/cli/src/repl/session.ts +++ b/packages/cli/src/repl/session.ts @@ -95,6 +95,8 @@ import { filter } from "@effectionx/stream-helpers"; import { consumeAdmissions } from "./admission.ts"; import type { ReplAgentAuthority, ReplAgentReading } from "./agent.ts"; import { useReplElicitation } from "./elicitation.ts"; +import { useReplLifecycle } from "./lifecycle.ts"; +import type { ReplLifecycleReading } from "./lifecycle.ts"; import type { ReplElicitations, ReplQuestion } from "./elicitation.ts"; import { EntrySegmentStream, entryKey, partitionEntrySegments } from "./entries.ts"; import { useExpansionController } from "./expansion.ts"; @@ -263,6 +265,17 @@ export interface ReplSession { readonly permissions: ReplAgentAuthority; /** Whether an entry's execution is still running in this process. */ readonly live: boolean; + /** + * What this process is doing element by element, for the entry that is open. + * + * Ephemeral and detached, like the Agent reading beside it: a cold process + * reconstructs none of it, and an entry that closes takes its observations + * with it. Static syntax and a retained admission prove nothing about it — + * what is here is what this process actually watched happen. + */ + readonly lifecycle: ReplLifecycleReading; + /** Every change to that reading, as it changes. */ + readonly lifecycleChanges: Stream; /** Each reprojection, as the history grows under it. */ readonly changes: Stream; /** @@ -432,8 +445,12 @@ function* start( } provisional.run(function* () { + // Created before anything can start an entry, and owned by this session: + // its consumers outlive every element's dispatch, which is the only place + // a terminal observation can reach them. + const lifecycle = yield* useReplLifecycle(); const expansion = yield* useExpansionController(); - const elicitation = yield* useReplElicitation(); + const elicitation = yield* useReplElicitation(lifecycle); // Created here and installed into each entry's execution below, so the // middleware it owns belongs to this session's scope and dies with it. An // execution elsewhere would otherwise inherit an observer watching for a @@ -500,6 +517,10 @@ function* start( get live() { return live; }, + get lifecycle() { + return lifecycle.reading(); + }, + lifecycleChanges: lifecycle.changes, changes, outputs, join(): Operation> { @@ -644,6 +665,7 @@ function* start( // not what this one has printed, and the Journal holds that one's anyway. output = ""; live = true; + lifecycle.open(key); const task = owner.run(function* () { // Registered before anything this task acquires, and therefore released // after all of it: destructors run in reverse order of registration. By @@ -663,6 +685,19 @@ function* start( running = undefined; } }); + // Registered here, so it runs after everything this entry acquired has + // been released: the execution and its providers, the output consumer + // and the Agent attachment all come down first, and only then does the + // session say it is no longer live. The two readings that describe + // work in flight go with it, because by now there is none. + yield* ensure(() => { + live = false; + lifecycle.close(key); + // Said on the ordinary path, because nothing else will: an entry + // that appended no record and took no input still stopped running, + // and a reader waiting for that is waiting for this. + changes.send(model); + }); const outcome = yield* runEntry(key, source, view, initialBindings); settle(outcome); // A settled entry is past whatever its segment retained, whichever way @@ -710,7 +745,7 @@ function* start( // Installed into this exact execution, and nowhere else: the live // observer and the permission policy are this session's, not the // process's, and the attachment carries the entry whose turns they are. - [...installations, installation], + [...installations, lifecycle.installation, installation], { initialBindings }, ); // Consumed as it arrives, inside this session's scope. Collecting until @@ -731,7 +766,6 @@ function* start( } }); const outcome = yield* started; - live = false; if (!outcome.ok && isReconstructionFailure(outcome.error)) { refuse(outcome.error); return outcome; @@ -739,7 +773,6 @@ function* start( open(); return outcome; } catch (error) { - live = false; const raised = error instanceof Error ? error : new Error(String(error)); if (isReconstructionFailure(raised)) { refuse(raised); diff --git a/packages/cli/tests/repl-lifecycle.test.ts b/packages/cli/tests/repl-lifecycle.test.ts new file mode 100644 index 000000000..5256a673d --- /dev/null +++ b/packages/cli/tests/repl-lifecycle.test.ts @@ -0,0 +1,202 @@ +/** + * Tier L — what this process is doing, element by element (#881 PR 2). + * + * Real sessions over a real stream, executing real entries. What is asserted + * is the reading the session actually published while work was in flight — + * collected from its own change stream, the way the screen consumes it — and + * not a shape a fixture assembled. Every case also checks the two things an + * observation must never do: change what executed, or outlive its entry. + */ + +import { beforeAll, describe, it } from "@executablemd/test-support/bdd"; +import { expect } from "@executablemd/test-support/expect"; +import { useTempFileCompiler } from "@executablemd/core"; +import { InMemoryStream } from "@executablemd/durable-streams"; +import { each, scoped, sleep, spawn } from "effection"; +import type { Operation, Result } from "effection"; + +import { openReplSession } from "../src/repl/session.ts"; +import type { ReplSession } from "../src/repl/session.ts"; +import type { ReplExecution } from "../src/repl/journal.ts"; +import type { ReplLifecycleReading, ReplOccurrence } from "../src/repl/lifecycle.ts"; + +function execution(): ReplExecution { + return { id: "lifecycle", stream: new InMemoryStream([]) }; +} + +function opened(result: Result): ReplSession { + if (!result.ok) { + throw result.error; + } + return result.value; +} + +function accepted(result: Result): void { + if (!result.ok) { + throw result.error; + } +} + +/** Every reading one session published, in order. */ +interface Watched { + readonly readings: ReplLifecycleReading[]; + /** Every call of one element seen at any point, by key. */ + calls(name: string): ReplOccurrence[]; +} + +function watching(session: ReplSession): Operation { + return { + *[Symbol.iterator]() { + const readings: ReplLifecycleReading[] = []; + yield* spawn(function* () { + for (const reading of yield* each(session.lifecycleChanges)) { + readings.push(reading); + yield* each.next(); + } + }); + return { + readings, + calls(name: string): ReplOccurrence[] { + const byKey = new Map(); + for (const reading of readings) { + for (const one of reading.occurrences) { + if (one.name === name) { + byKey.set(one.key, one); + } + } + } + return [...byKey.values()]; + }, + }; + }, + }; +} + +describe("Tier L — the reading one entry leaves behind", () => { + beforeAll(() => useTempFileCompiler()); + + it("L1: a repeated element is two calls, never one overwritten by the other", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n\n\n')); + yield* session.join(); + yield* sleep(0); + + const seen = watched.calls("Json"); + expect(seen.length).toBe(2); + expect(new Set(seen.map((one) => one.key)).size).toBe(2); + // Both reached a terminal observation of their own. + expect(seen.map((one) => one.phase).sort()).toEqual(["settled", "settled"]); + }); + }); + + it("L1: a nested element is a child of the call that reached it", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + const outer = watched.calls("Each"); + const inner = watched.calls("Json"); + expect(outer.length).toBe(1); + expect(inner.length).toBe(2); + // Each iteration's element names the call it was reached through, and + // the two iterations are separate calls rather than one id twice. + for (const one of inner) { + expect(one.parent).toBe(outer[0].key); + } + expect(new Set(inner.map((one) => one.key)).size).toBe(2); + }); + }); + + it("L2: an element waiting on a question says so, and stops when it is answered", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + accepted( + yield* session.submit( + 'Answer this.\n', + ), + ); + // Several turns: the phases a consumer is told travel through its own + // queue, and the question itself is published from inside the element. + for (let turn = 0; turn < 5; turn += 1) { + yield* sleep(0); + } + + const waiting = session.lifecycle.occurrences.filter((one) => one.waiting.length > 0); + // The element that is waiting, what it is waiting on, and that it is + // the only one: a session-wide "busy" would name every element here. + expect( + session.lifecycle.occurrences.map( + (one) => `${one.name}:${one.phase}:${one.waiting.join()}`, + ), + ).toEqual(["Elicit:active:question"]); + expect(waiting.map((one) => one.name)).toEqual(["Elicit"]); + + const question = session.elicitation.pending; + if (question === undefined) { + throw new Error("this session is waiting on no question"); + } + question.submit({ note: "answered" }); + yield* session.join(); + yield* sleep(0); + // The entry closed, so its reading went with it. + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.live).toBe(false); + }); + }); + + it("L2: ordinary work is not a wait", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + const waited = watched.readings.flatMap((reading) => + reading.occurrences.filter((one) => one.waiting.length > 0), + ); + expect(waited).toEqual([]); + }); + }); + + it("L3: an entry that closes takes its reading, and says it is no longer live", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + expect(session.lifecycle.entry).toBe(undefined); + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.live).toBe(false); + // The entry really ran: the reading going is the reading going, not the + // work never having happened. + expect(session.model.entries.length).toBe(1); + expect(session.model.entries[0]?.terminal?.status).toBe("ok"); + }); + }); + + it("L3: observing changes neither the outcome nor what the document rendered", function* () { + const source = '\n'; + const rendered: string[] = []; + for (const collect of [true, false]) { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + if (collect) { + yield* watching(session); + } + accepted(yield* session.submit(source)); + yield* session.join(); + rendered.push(session.model.entries[0]?.terminal?.output ?? ""); + }); + } + expect(rendered[0]).toBe(rendered[1]); + expect(rendered[0]).not.toBe(""); + }); +}); diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts index b98a562f6..b166f9314 100644 --- a/packages/core/src/component-expansion.ts +++ b/packages/core/src/component-expansion.ts @@ -330,8 +330,17 @@ export function* observeExpansion( } }; issued.publish({ phase: "enter" }); + // Said once however many body paths an element has: a second ACTIVE would + // be the same observation twice, and a reader counting changes would see a + // step that did not happen. + let active = false; const observed: ObservedExpansion = { - active: () => issued.publish({ phase: "active" }), + active: () => { + if (!active) { + active = true; + issued.publish({ phase: "active" }); + } + }, settled: (reason) => issued.publish({ phase: "exit", reason }), }; diff --git a/packages/core/src/expand.ts b/packages/core/src/expand.ts index 5566e06a7..29307e0d9 100644 --- a/packages/core/src/expand.ts +++ b/packages/core/src/expand.ts @@ -2992,6 +2992,11 @@ function* expandComponent( } catch (error) { return [yield* raise(schemaValidationErrorSegment(error, name))]; } + // Resolution and validation accepted this element, so whatever body it has + // is the work that was accepted. Published here rather than at each body, + // because every path past this point is work — and a refusal above it is + // an element that never became active at all. + observed.active(); const missingCapture = returnCaptureViolation( name, From 5dffeb0bb7af0047e417fdf6d2e6c718b8f39313 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 06:30:24 -0400 Subject: [PATCH 07/19] =?UTF-8?q?=F0=9F=9A=A7=20Carry=20the=20reading=20to?= =?UTF-8?q?=20the=20screen,=20and=20say=20so=20in=20the=20specs=20(#881=20?= =?UTF-8?q?PR=202,=20layers=203c/4a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The live reading reaches the view through the path the Agent reading already takes, and a frame frozen at a recorded position leaves it out — stated once in `viewFor`, beside the other live halves it already suppresses, rather than decided again at each surface. A held expansion counts a wait of its own, so an element standing at a boundary reads as waiting rather than as slow. Both window controls are spelled `[↑ earlier]` and `[↓ later]` everywhere a reading has a window. The semantic actions and activation are unchanged and no shortcut is introduced; the three suites that read those labels off a real terminal pass unchanged otherwise. architecture.md gains the two Core contracts and their modules; specs/executable-mdx-spec.md gains §5.7 expansion observation and §5.8 source inspection; specs/repl-spec.md gains what this process is doing element by element — entered, active, waiting, exited, settled — and that none of it is written down, reconstructed cold or shown at a frozen position. --- architecture.md | 49 +++++++++++ packages/cli/src/repl/application.ts | 41 +++++++-- packages/cli/src/repl/expansion.ts | 26 +++++- packages/cli/src/repl/program.ts | 9 +- packages/cli/src/repl/session.ts | 2 +- packages/cli/tests/fixtures/repl/surface.ts | 8 +- .../cli/tests/repl-agent-interface.test.ts | 2 + packages/cli/tests/repl-agent-journey.test.ts | 8 +- packages/cli/tests/repl-entries.test.ts | 4 + packages/cli/tests/repl-forms.test.ts | 3 + packages/cli/tests/repl-journey.test.ts | 13 +-- .../cli/tests/repl-presentation-style.test.ts | 2 + packages/cli/tests/repl-terminal.test.ts | 4 +- specs/executable-mdx-spec.md | 88 +++++++++++++++++++ specs/repl-spec.md | 28 +++++- 15 files changed, 260 insertions(+), 27 deletions(-) diff --git a/architecture.md b/architecture.md index e1f2eea95..10a8566a6 100644 --- a/architecture.md +++ b/architecture.md @@ -2821,6 +2821,53 @@ actions is closed so every one is journalable. ``` +### 1a. One element's expansion can be surrounded + +`Component.expand` offers an observer the whole of one executable element's +expansion: before resolution and props validation, through the accepted body +and its owned cleanup, to the acceptance of what it produced. Core issues a +request and the public chain composes around it; a handler delegates that exact +request once with `next(request)`. + +The authority is the shape bound execution already uses. The request is branded +with a private field, so a copy carrying the same members is not it; the claim +is spent once, so a repeated delegation runs nothing; and the settlement is +readable whether or not the chain returned normally, so a handler that catches +what canonical expansion raised has not rescued it. A handler that returns +without delegating refuses the work, and what a handler returns is ignored. + +Observation reaches no outcome. Phases carry `Result` and nothing else — +what the element produced, what it bound and which error identity core is +holding stay private — and a failure is reported as a detached, frozen `Error` +preserving the selected name, message and explanatory causes. Completion is +published only after the whole dispatch, middleware cleanup included, has +unwound and canonical acceptance is reconciled. + +Each subscription is registered with the element's latest phase and then told +each change in order, ending after exactly one terminal observation. A reader +that is slow, absent or cancelled delays nothing and cancels nothing: execution +never waits for an observer, and a consumer that must see the terminal phase +belongs to an owner outliving the dispatch rather than to the handler's frame. + +Every path that expands something an author wrote crosses this once: the +component paths, and the structural constructs ``, ``, ``, +`` and ``, plus the selected ``, the `` that runs and +each `` an `` starts. An unselected branch expands nothing and is +told nothing. + +### 1b. Where a text's elements are, without running it + +`inspectSource(text, kind)` answers where each recognized element's delimiters +are and what it is called. It is the scanner's own reading, collected by the +same walk that decides what a fence, an inline code span, a quoted `>` and a +tag-like expression are, so there is no second grammar to disagree with the +first — and a nested collector is committed only with the parse that found it. + +A document's body boundary is read lexically, matching the installed +extractor's envelope rule without calling its value parser, so inspecting a +document interprets neither its header nor its body. Definition parsing asserts +the two boundaries agree. + ### 2. Decide once An error no middleware handles is decided exactly once, where it is raised, @@ -5336,6 +5383,8 @@ Status is measured against main. | `` region `output` mode | an undecided error fails the document execution | built on main | | `` rendering selection | chooses which regions of a body render, and buffers a root that declares one; it decides nothing about failure | built on main | | `Expansion` / `getExpansion()` | describes the current logical element expansion | built on main | +| `Component.expand` | surrounds one element's complete expansion — before resolution, through the accepted body and its owned cleanup, to the acceptance of what it produced. Core issues a branded request the public chain composes around; a handler delegates it once, may refuse the work by throwing or by not delegating, and decides nothing about the outcome. Phases carry `Result` and a detached, frozen report, so no canonical identity, binding or resource crosses. Completion follows the whole dispatch, middleware cleanup included. Each subscription is registered with the latest phase and then told each change in order, ending after one terminal observation; a slow, absent or cancelled reader delays and cancels nothing | built on this stack | +| `inspectSource()` | answers where a text's executable elements are written and what they are called, without resolving, compiling, evaluating or running any of it. The scanner's own reading, so fences, inline code, quoted delimiters and tag-like expressions are decided once; a document's body boundary is read lexically, without the frontmatter value parser, and definition parsing asserts the two agree | built on this stack | | document targets | catalogs a root document's addressable static headings, resolves one selector to one exact target, and projects the document to it before expansion | built on the #412 stack | | document-aware `xmd run … --help` | describes what one document declares and every target it addresses, each as a full document reference with the description its section states, by inspection alone | built on the #463 stack | | standard-input root documents | `xmd run -` and `xmd run -- -` read the whole root document from standard input, once, to end of file, and run it through the ordinary run profile. Fixed grammar selects it — the explicit `run` command form plus a document argument that is exactly `-`, read from the parser's own unconsumed remainder so a `-` another option took as its value is not one — and every other spelling keeps the meaning it had: the shorthand `xmd -` executes the file named `-`, `xmd run -#Section` executes that file's `Section`, another command's `-` is that command's, and `--eval -` keeps its refusal. `-` is the one filename the option grammar leaves unwritable, so the reference grammar reaches it and nothing else beginning with `-` is read as a document. The parsed path and every recovered reference stay separate facts until the grammar is settled, so a command line naming two roots refuses in either order, before the read and before either candidate is inspected. The reader is a value each runtime-named entrypoint supplies and the shared CLI never reaches a stdin global; what comes back is `retainedSource("", source)`, adding no root-source variant, constructor, digest member or public API. The complete input is acquired before inspection, provider setup, the secret-detection announcement, journal creation, root admission and execution, inside the run's existing deadline; a failed read is one fixed sentence carrying no host error, input or path, and cancellation tears the reader down without becoming one | built on this stack | diff --git a/packages/cli/src/repl/application.ts b/packages/cli/src/repl/application.ts index c9f01b454..7cd6a163d 100644 --- a/packages/cli/src/repl/application.ts +++ b/packages/cli/src/repl/application.ts @@ -127,6 +127,8 @@ import { SELECT_ROW, } from "./components/rows.ts"; import type { ReplAction } from "./components/actions.ts"; +import { NO_LIFECYCLE } from "./lifecycle.ts"; +import type { ReplLifecycleReading } from "./lifecycle.ts"; export type { ReplAction }; @@ -156,6 +158,15 @@ export interface ReplLive { * live reading describes work this process is doing, and none of those is. */ readonly agent: ReplAgentReading; + /** + * What this process is doing element by element, for the entry that is open. + * + * Empty wherever a live reading has nothing to say: a replay, a document + * with no element in flight, and every frozen prefix. What is here is what + * this process watched happen, which is why retained syntax and a recorded + * admission add nothing to it. + */ + readonly lifecycle: ReplLifecycleReading; } /** @@ -766,6 +777,10 @@ export function viewFor( // a fact about the position being inspected. running: false, agent: NO_AGENT, + // And the elements this process is expanding are the head's, not + // this position's: a reading frozen before them describes a file + // that had not reached them yet. + lifecycle: NO_LIFECYCLE, }; return Ok( Object.freeze({ @@ -809,6 +824,7 @@ export function refusedView( pausable: false, running: false, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }), location: encodeLocation(state.route), refusal: reason, @@ -2339,7 +2355,7 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS items.push( row( "sessions:earlier", - " [^ earlier]", + ` ${EARLIER}`, { select: "scroll-sessions", delta: -1 }, styleOf("action"), { @@ -2351,7 +2367,7 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS items.push( row( "sessions:later", - " [v later]", + ` ${LATER}`, { select: "scroll-sessions", delta: 1 }, styleOf("action"), { @@ -2381,7 +2397,7 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS items.push( row( "entries:earlier", - " [^ earlier]", + ` ${EARLIER}`, { select: "scroll-entries", delta: -1 }, styleOf("action"), { here: view.focused }, @@ -2393,7 +2409,7 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS items.push( row( "entries:later", - " [v later]", + ` ${LATER}`, { select: "scroll-entries", delta: 1 }, styleOf("action"), { here: view.focused }, @@ -3084,7 +3100,7 @@ function drawerFor( rows.push( row( "drawer:scroll:up", - padControl("[^ earlier]", width), + padControl(EARLIER, width), { select: "scroll", delta: -1 }, styleOf("action"), { here: view.focused }, @@ -3096,7 +3112,7 @@ function drawerFor( rows.push( row( "drawer:scroll:down", - padControl("[v later]", width), + padControl(LATER, width), { select: "scroll", delta: 1 }, styleOf("action"), { here: view.focused }, @@ -3917,6 +3933,19 @@ function failedLine(message: string, width: number): string { return `${line.slice(0, Math.max(FAILED_PREFIX.length, width - 1))}…`; } +/** + * What the two window controls are called, wherever a reading has a window. + * + * One spelling, so Sessions, the catalog, a drawer and the entry reading + * cannot drift apart — and arrows rather than the ASCII they replaced, which + * is what the accepted presentation states. The semantic actions behind them + * are unchanged, and no keyboard shortcut is introduced: these are controls a + * person activates the way they always did. + */ +export const EARLIER = "[\u2191 earlier]"; +/** The other one. */ +export const LATER = "[\u2193 later]"; + /** The Sessions reading's window. */ export const SESSIONS_WINDOW = "sessions"; /** The Entries catalog's window. */ diff --git a/packages/cli/src/repl/expansion.ts b/packages/cli/src/repl/expansion.ts index d998525b7..5725f7f30 100644 --- a/packages/cli/src/repl/expansion.ts +++ b/packages/cli/src/repl/expansion.ts @@ -62,6 +62,8 @@ export type ExpansionState = "playing" | "pausing" | "paused"; * the inventory test says so rather than leaving an expansion path nothing * controls. Pause is sound only while every path crosses something here. */ +import type { ReplWaits } from "./lifecycle.ts"; + export interface BoundaryPartition { /** Operations that bracket one expansion walk. */ readonly walks: readonly string[]; @@ -192,7 +194,16 @@ export interface ExpansionController { * where the install runs: a controller installed inside a resource body would * be invisible to the execution the caller is about to start. */ -export function* useExpansionController(): Operation { +export function* useExpansionController( + /** + * Where a held walk says the element it stopped is waiting, or none. + * + * A hold is the one wait this controller owns: the element has reached a + * boundary and is standing there until Continue releases it, which is a + * different thing from the work being slow. + */ + waits?: ReplWaits, +): Operation { const walks = new Set(); const states = createSignal(); const crossings = new Map(); @@ -266,7 +277,12 @@ export function* useExpansionController(): Operation { if (walk === undefined) { return; } - yield* hold(walk); + const release = yield* waits?.hold("expansion") ?? noExpansionWait(); + try { + yield* hold(walk); + } finally { + release(); + } } function* bracket(boundary: string, body: () => Operation): Operation { @@ -371,3 +387,9 @@ export function* useExpansionController(): Operation { }, }; } + +/** No reading is counting waits, so nothing is held and nothing is released. */ +// deno-lint-ignore require-yield +function* noExpansionWait(): Operation<() => void> { + return () => {}; +} diff --git a/packages/cli/src/repl/program.ts b/packages/cli/src/repl/program.ts index f0fb6b704..a25458941 100644 --- a/packages/cli/src/repl/program.ts +++ b/packages/cli/src/repl/program.ts @@ -772,7 +772,13 @@ function keyOfFocus(tree: ReplTree): string | undefined { return node === undefined ? undefined : tree.keyOf(node); } -/** This process's overlay, as the application reads it. */ +/** + * This process's overlay, as the application reads it. + * + * Everything this process knows and no record holds. What a reading frozen at + * a recorded position leaves out of it is stated once, in `viewFor`, rather + * than decided again here. + */ function liveOf(session: ReplSession): ReplLive { return { output: session.overlay.output, @@ -781,6 +787,7 @@ function liveOf(session: ReplSession): ReplLive { pausable: session.controller !== undefined, running: session.live, agent: session.agent, + lifecycle: session.lifecycle, }; } diff --git a/packages/cli/src/repl/session.ts b/packages/cli/src/repl/session.ts index 98388852c..229b6bb67 100644 --- a/packages/cli/src/repl/session.ts +++ b/packages/cli/src/repl/session.ts @@ -449,7 +449,7 @@ function* start( // its consumers outlive every element's dispatch, which is the only place // a terminal observation can reach them. const lifecycle = yield* useReplLifecycle(); - const expansion = yield* useExpansionController(); + const expansion = yield* useExpansionController(lifecycle); const elicitation = yield* useReplElicitation(lifecycle); // Created here and installed into each entry's execution below, so the // middleware it owns belongs to this session's scope and dies with it. An diff --git a/packages/cli/tests/fixtures/repl/surface.ts b/packages/cli/tests/fixtures/repl/surface.ts index 2eeecf665..ea6c05393 100644 --- a/packages/cli/tests/fixtures/repl/surface.ts +++ b/packages/cli/tests/fixtures/repl/surface.ts @@ -451,11 +451,11 @@ export function fixturePairs( ): readonly ReplBox[] => { const id = `box:${window}:viewport`; viewports.push(Object.freeze({ id, region, window })); - const less = paired(CONTROL, `${window}:earlier`, "[^ earlier]", region, { + const less = paired(CONTROL, `${window}:earlier`, "[↑ earlier]", region, { control: true, extra: { window, delta: -1 }, }); - const more = paired(CONTROL, `${window}:later`, "[v later]", region, { + const more = paired(CONTROL, `${window}:later`, "[↓ later]", region, { control: true, extra: { window, delta: 1 }, }); @@ -601,11 +601,11 @@ export function fixturePairs( const id = `box:${DRAWER}:viewport`; viewports.push(Object.freeze({ id, region: "drawer", window: DRAWER })); regions.push({ region: "drawer", id: "box:drawer:layer" }); - const less = paired(CONTROL, "drawer:earlier", "[^ earlier]", "drawer", { + const less = paired(CONTROL, "drawer:earlier", "[↑ earlier]", "drawer", { control: true, extra: { window: DRAWER, delta: -1 }, }); - const more = paired(CONTROL, "drawer:later", "[v later]", "drawer", { + const more = paired(CONTROL, "drawer:later", "[↓ later]", "drawer", { control: true, extra: { window: DRAWER, delta: 1 }, }); diff --git a/packages/cli/tests/repl-agent-interface.test.ts b/packages/cli/tests/repl-agent-interface.test.ts index 09c84067a..2a4a2ca8a 100644 --- a/packages/cli/tests/repl-agent-interface.test.ts +++ b/packages/cli/tests/repl-agent-interface.test.ts @@ -65,6 +65,7 @@ import { presentationFor, viewFor, } from "../src/repl/application.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; import type { ReplAction, ReplIntent, @@ -462,6 +463,7 @@ function liveReading(session: ReplSession): ReplLive { pausable: session.controller !== undefined, running: session.live, agent: session.agent, + lifecycle: NO_LIFECYCLE, }; } diff --git a/packages/cli/tests/repl-agent-journey.test.ts b/packages/cli/tests/repl-agent-journey.test.ts index 8d0d06b55..19b87f02a 100644 --- a/packages/cli/tests/repl-agent-journey.test.ts +++ b/packages/cli/tests/repl-agent-journey.test.ts @@ -1323,13 +1323,13 @@ describe("J2 — what filtering Sessions leaves on the screen (#875 R1)", () => /** * The rows the Sessions reading itself is drawn in. * - * The sidebar band, cut at the reading's own `[v later]` control: below that + * The sidebar band, cut at the reading's own `[↓ later]` control: below that * sit the Entries heading and the catalog, which a conversation filter does * not touch, and beside it are columns holding a journal that grows. */ const listBand = (terminal: Terminal): string[] => { const rows = screenOf(terminal).map((line) => line.slice(0, SIDEBAR)); - const bottom = rows.findIndex((line) => line.includes("[v later]")); + const bottom = rows.findIndex((line) => line.includes("[↓ later]")); return rows.slice(0, bottom === -1 ? rows.length : bottom); }; @@ -1382,7 +1382,7 @@ describe("J2 — what filtering Sessions leaves on the screen (#875 R1)", () => const before = listBand(terminal); const lastBefore = lastWritten(before); // Pre-assert: the reading really is windowed, so there is a reading to - // shrink and a `[v later]` to bound it by. + // shrink and a `[↓ later]` to bound it by. expect(before.length).toBeGreaterThan(0); expect(lastBefore).toBeGreaterThan(0); @@ -2281,7 +2281,7 @@ function historyMarkers(terminal: Terminal): string[] { const found: string[] = []; for (let row = at + 1; row < rows.length; row += 1) { const label = (rows[row] ?? "").trim().replace(/^>\s*/, ""); - if (label === "[^ earlier]") { + if (label === "[↑ earlier]") { // How the window moves, not a position in it. This drawer scrolls (#875), // and both window controls sit outside the content they scroll. continue; diff --git a/packages/cli/tests/repl-entries.test.ts b/packages/cli/tests/repl-entries.test.ts index 59795ead6..950cea683 100644 --- a/packages/cli/tests/repl-entries.test.ts +++ b/packages/cli/tests/repl-entries.test.ts @@ -68,6 +68,7 @@ import { viewFor, withoutAbsentEntry, } from "../src/repl/application.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; import type { ReplAction, ReplLive, ReplState, ReplView } from "../src/repl/application.ts"; import { flatten, inspectionWidth, NARROW, sidebarWidth } from "../src/repl/layout.ts"; import type { ReplBounds, ReplRegion } from "../src/repl/layout.ts"; @@ -1458,6 +1459,7 @@ const NOTHING_LIVE: ReplLive = Object.freeze({ pausable: false, running: false, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }); /** This process's overlay, exactly as the program reads it into a view. */ @@ -1469,6 +1471,7 @@ function liveReading(session: ReplSession): ReplLive { pausable: session.controller !== undefined, running: session.live, agent: session.agent, + lifecycle: NO_LIFECYCLE, }; } @@ -3042,6 +3045,7 @@ describe("REPL entries: what a frozen position says is unavailable", () => { pausable: true, running: true, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }; // Projected *at* the position, because a prefix is a different reading of diff --git a/packages/cli/tests/repl-forms.test.ts b/packages/cli/tests/repl-forms.test.ts index 69c01160d..f25e2aa6b 100644 --- a/packages/cli/tests/repl-forms.test.ts +++ b/packages/cli/tests/repl-forms.test.ts @@ -35,6 +35,7 @@ import { reduceRepl, viewFor, } from "../src/repl/application.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; import type { ReplAction, ReplLive, @@ -142,6 +143,7 @@ function asking(question: ReplQuestion | undefined): ReplLive { pausable: false, running: false, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }; } @@ -1271,6 +1273,7 @@ function liveReading(session: ReplSession): ReplLive { pausable: session.controller !== undefined, running: session.live, agent: session.agent, + lifecycle: NO_LIFECYCLE, }; } diff --git a/packages/cli/tests/repl-journey.test.ts b/packages/cli/tests/repl-journey.test.ts index 292a671c3..9ecb626ef 100644 --- a/packages/cli/tests/repl-journey.test.ts +++ b/packages/cli/tests/repl-journey.test.ts @@ -48,6 +48,7 @@ import { reduceRepl, refusedView, } from "../src/repl/application.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; import { readDescription } from "../src/repl/description.ts"; import { runReplProgram } from "../src/repl/program.ts"; import type { ReplExecutionProfile } from "../src/repl-profile.ts"; @@ -1028,10 +1029,10 @@ function drawerMarkers(terminal: Terminal): string[] { title = true; continue; } - if (label === "[close]" || label === "[v later]") { + if (label === "[close]" || label === "[↓ later]") { break; } - if (label === "[^ earlier]") { + if (label === "[↑ earlier]") { // How the window moves, not a position in it. Both window controls stay // outside the content they scroll, so neither is one of these. continue; @@ -1044,7 +1045,7 @@ function drawerMarkers(terminal: Terminal): string[] { /** * Every content row the open drawer can show, gathered by scrolling it. * - * Through `[v later]`, the way a person reaches the rest of a long record: + * Through `[↓ later]`, the way a person reaches the rest of a long record: * pressing it moves the window by a row, and what the window holds is what is * mounted. Stops when a press adds nothing new, which is the end of the reading. */ @@ -1064,7 +1065,7 @@ function* drawerContent( // What one frame holds, before anything has been scrolled. const first = drawerMarkers(terminal); take(); - yield* focusOn(terminal, "[v later]"); + yield* focusOn(terminal, "[↓ later]"); // Stopped when the window itself stops moving, not when a press reveals no // label this walk had not already collected. A serialized value repeats rows — // `}` closes every object — so a press that only brought a duplicate into view @@ -3135,6 +3136,7 @@ describe("REPL journey: what it settles before it acts", () => { pausable: true, running: true, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }); expect(pausing.intent.kind).toBe("none"); expect(pausing.state.refusal).toContain("not paused"); @@ -3146,6 +3148,7 @@ describe("REPL journey: what it settles before it acts", () => { pausable: true, running: true, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }); expect(held.intent.kind).toBe("continue"); expect(held.state.refusal).toBe(undefined); @@ -4784,7 +4787,7 @@ describe("REPL first use: UI10 narrow drawer guidance", () => { // And a control in the same drawer that does something else entirely. It // moves the window over a message too long to draw at once, so the row says // that instead of promising an answer to somebody who is still reading. - yield* focusOn(terminal, "[v later]"); + yield* focusOn(terminal, "[↓ later]"); const onScroll = guidanceRow(terminal); expect(onScroll).toBe("Entry 1 question · Enter scrolls · Esc closes · Tab/Shift+Tab move"); diff --git a/packages/cli/tests/repl-presentation-style.test.ts b/packages/cli/tests/repl-presentation-style.test.ts index 7521ab234..682bfa24e 100644 --- a/packages/cli/tests/repl-presentation-style.test.ts +++ b/packages/cli/tests/repl-presentation-style.test.ts @@ -45,6 +45,7 @@ import { reduceRepl, viewFor, } from "../src/repl/application.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; import { useReplElicitation } from "../src/repl/elicitation.ts"; import type { ReplQuestion } from "../src/repl/elicitation.ts"; import { encodeLocation } from "../src/repl/route.ts"; @@ -120,6 +121,7 @@ const NOTHING_LIVE: ReplLive = Object.freeze({ pausable: false, running: false, agent: NO_AGENT, + lifecycle: NO_LIFECYCLE, }); /** This process part-way through an entry: output on the overlay, nothing closed. */ diff --git a/packages/cli/tests/repl-terminal.test.ts b/packages/cli/tests/repl-terminal.test.ts index cddec2628..3d103171b 100644 --- a/packages/cli/tests/repl-terminal.test.ts +++ b/packages/cli/tests/repl-terminal.test.ts @@ -278,9 +278,9 @@ describe("REPL terminal: responsive semantic frames", () => { // sit outside the content they move. expect(textsIn(frame, "drawer")).toEqual([ "Binding: plan", - "[^ earlier]", + "[↑ earlier]", "Close", - "[v later]", + "[↓ later]", "[close]", ]); // One surface, the routed one, and nothing from the others. diff --git a/specs/executable-mdx-spec.md b/specs/executable-mdx-spec.md index 51f7779c3..5d2ddb69a 100644 --- a/specs/executable-mdx-spec.md +++ b/specs/executable-mdx-spec.md @@ -5564,6 +5564,94 @@ inside another execution without moving what an invocation may name. `Expansion` and `getExpansion()` belong to `@executablemd/core`, so ordinary document execution receives expansion identity with no extension installed. +### 5.7 Expansion observation + +`Component.expand` surrounds one executable element's complete expansion. Core +issues a request before the element is resolved or its props validated, and the +public middleware chain composes around it; a handler delegates that exact +request once with `next(request)`. + +```ts +interface ComponentExpansionRequest { + readonly expansion: Expansion; + readonly phases: Stream; +} + +type ComponentExpansionPhase = + | { readonly phase: "enter" } + | { readonly phase: "active" } + | { readonly phase: "exit"; readonly reason: "returned" | "failed" | "cancelled" } + | { readonly phase: "complete"; readonly result: Result } + | { readonly phase: "cancelled" }; +``` + +An element is **entered** before anything about it is decided, becomes +**active** once resolution and validation have accepted it, **exits** when its +own body ends — before its owned cleanup runs, which is why a component with a +destructor stays in `exit` while the destructor runs — and reaches exactly one +terminal observation: `complete`, once the whole dispatch has unwound and +canonical acceptance is reconciled, or `cancelled` where it unwound without +completing. + +An observer decides nothing. What a handler returns is ignored; catching what +canonical expansion raised does not rescue it; a handler may refuse the work by +throwing or by returning without delegating. A copied, foreign or repeated +request runs nothing, and `Component.expand` called outside canonical dispatch +refuses an unissued request. A failure is reported as a detached, frozen +`Error` preserving the selected name, message and explanatory causes — no +canonical error identity, binding or resource object crosses. + +Each subscription is registered with the element's latest phase and then told +each change in order, ending after the terminal observation. Reading or +cancelling a subscription neither starts nor cancels the element, and a reader +that is slow or absent delays nothing: execution never waits for an observer. +A consumer that must see the terminal phase belongs to an owner that outlives +the dispatch. + +Every path that expands authored work crosses this once: Markdown, function +and value or captured component bodies, and the structural constructs ``, +``, ``, `` and ``, together with the selected +``, the `` that actually runs and each `` an `` +starts. An unselected branch, passive syntax and restored work expand nothing +and receive no phases. Code blocks are observed within the element that +contains them. + +### 5.8 Source inspection + +`inspectSource(text, kind)` answers where the executable elements of a text are +written, without executing, resolving, compiling or evaluating any of it. + +```ts +function inspectSource(text: string, kind: "document" | "fragment"): + Result; + +interface SourceElement { + readonly name: string; + readonly opening: SourceRange; + readonly closing?: SourceRange; +} +``` + +Elements come back in opening order, nested ones included, each frozen. +`closing` is absent for exactly self-closing syntax; an element written with +paired delimiters and no content between them has one. `name` preserves the +authored spelling, dots included, and says nothing about whether the name +resolves or what it is permitted to do. Ranges are half-open UTF-16 slices into +the exact text passed in, a document's header prefix included. + +The reading is the scanner's own, so a fence, an inline code span, a quoted +`>` and a tag-like expression are decided exactly as execution decides them, +and an incomplete passive tag is text — leaving no guessed children behind. +Passive text and an empty result are success; a scanner refusal is an `Error` +result. + +`"document"` reads the markdown body beneath a frontmatter header. That body +boundary is found lexically — a byte-order mark, `---` on its own line, `----` +which is not one, an optional header language, and the first closing line — +without calling the frontmatter value parser, so inspecting a document +interprets neither its header nor its body. Definition parsing asserts that its +own boundary agrees. + ## 6. Expansion ### 6.1 The expansion algorithm diff --git a/specs/repl-spec.md b/specs/repl-spec.md index 9ae0136b6..5908f2d6b 100644 --- a/specs/repl-spec.md +++ b/specs/repl-spec.md @@ -140,8 +140,11 @@ that is still running appears under that entry, never under the settled one you are reading. The list is windowed rather than clipped: it moves through as many rows as the -frame can place, with its earlier and later controls staying put while the rows -move beneath them. What the window is not showing is not drawn, not focusable +frame can place, with `[\u2191 earlier]` and `[\u2193 later]` staying put while the +rows move beneath them. Those two controls are spelled the same way wherever a +reading has a window — this list, the catalog, Sessions and every drawer — and +they are controls you activate, not keys you press: no arrow shortcut and no +horizontal scrolling exist. What the window is not showing is not drawn, not focusable and reaches no pointer, and every row can be scrolled to, activated by Enter and activated by a pointer. @@ -595,6 +598,27 @@ execution is unsupported. The Sessions surface presents the Agent work every entry did, as one chronology, and an execution with no Agent work has one that says so. +## What this process is doing, element by element + +While an entry runs, the screen can say where each element of it has reached: +entered, active, waiting, exited, and then settled, failed or cancelled. An +element that has returned stays in exit while its own cleanup runs, because +that is where it is — a component with a destructor has not finished until the +destructor has. + +Waiting is counted, not guessed. An element waits when something it is actually +waiting on says so: a question nobody has answered, a permission request +attributed to the turn that asked for it, a hold the expansion controller is +keeping. Each of those removes itself when it resolves, opening and closing a +drawer changes none of them, and ordinary suspension is not waiting at all. Two +questions at once are two waiting elements rather than one screen that is busy. + +All of it is this process's, and none of it is written down. A cold process +reconstructs none of it, a reading frozen at an earlier position shows none of +it, and an entry that finishes takes its own with it. Source that is still on +the screen and a record the history retained prove only that something was +written and something was recorded — never that anything is running now. + ## What is retained, and what is not Each execution is one file of serialized ordinary `DurableEvent`s — the same From 9a1d3473515a686b08b27509fa346d60f96fe4c9 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 06:49:58 -0400 Subject: [PATCH 08/19] =?UTF-8?q?=F0=9F=9A=A7=20Read=20an=20entry=20as=20o?= =?UTF-8?q?utput=20then=20source,=20fitted=20by=20the=20engine=20=E2=80=94?= =?UTF-8?q?=20layer=204a/4b?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The reading itself: `source-reading.ts` turns one model entry into Output then Source, and `fitting.ts` cuts that reading to a measured width by asking the engine how wide text actually is. Static syntax acquires no phase. An element reads as observed only where an observation was attributed to it — this entry, its recorded source position and the fragment that position belongs to — so a retained prefix shows the rails that mean nothing was observed, which is the truth about it. Generated source replaces its producer inside the enclosure bytes the author wrote, and keeps its own offsets as a child region rather than being spliced: splicing would renumber the positions its own elements were recorded against. A refused, absent or ambiguous admission keeps the producer. Wrapping is engine answers all the way down. A UTF-16 code unit is not a cell, so every width is measured and every cut is at a grapheme boundary; the rail, the gap and the status column are reserved from measurements rather than from character counts, with the cleanup wait's two readings setting the column so a phase change cannot reflow somebody's document. A region with no room for one grapheme is a frame refusal, never a clip. S1–S4 in `repl-source-reading.test.ts`: 33 steps, every width from a real engine. Two defects it found and this fixes — a self-closing element lost the badge it had settled with, and badges align at the right inner edge rather than at a shared start column. The archive's `L` and `RAIL` constants join the independent reference fixture. --- .cliall.log | 79907 ++++++++++++++++ packages/cli/src/repl/fitting.ts | 466 + packages/cli/src/repl/presentation-style.ts | 62 +- packages/cli/src/repl/source-reading.ts | 678 + .../tests/fixtures/repl/reference-style.ts | 39 + .../cli/tests/repl-source-reading.test.ts | 781 + 6 files changed, 81932 insertions(+), 1 deletion(-) create mode 100644 .cliall.log create mode 100644 packages/cli/src/repl/fitting.ts create mode 100644 packages/cli/src/repl/source-reading.ts create mode 100644 packages/cli/tests/repl-source-reading.test.ts diff --git a/.cliall.log b/.cliall.log new file mode 100644 index 000000000..1a619e351 --- /dev/null +++ b/.cliall.log @@ -0,0 +1,79907 @@ +Task test deno test --allow-all --frozen 'packages/cli/tests/' +Check packages/cli/tests/agent-adapters.test.ts +Check packages/cli/tests/agent-cli.test.ts +Check packages/cli/tests/agent-config.test.ts +Check packages/cli/tests/agent-options-cli.test.ts +Check packages/cli/tests/agent-options.test.ts +Check packages/cli/tests/agent-session-coordinator.test.ts +Check packages/cli/tests/cli-help.test.ts +Check packages/cli/tests/command.test.ts +Check packages/cli/tests/compiled-upgrade.test.ts +Check packages/cli/tests/document-suites/inline/inline-markdown.test.ts +Check packages/cli/tests/document-suites/plan/plan-markdown.test.ts +Check packages/cli/tests/document-suites/props/props-markdown.test.ts +Check packages/cli/tests/document-suites/syntax/syntax-markdown.test.ts +Check packages/cli/tests/document-suites/targets/targets-markdown.test.ts +Check packages/cli/tests/document-suites/verbose/verbose-markdown.test.ts +Check packages/cli/tests/evaluate-component.test.ts +Check packages/cli/tests/evaluate-workflow.test.ts +Check packages/cli/tests/fetch-cli.test.ts +Check packages/cli/tests/file-stream.test.ts +Check packages/cli/tests/github-zero-effect.test.ts +Check packages/cli/tests/inline-cli.test.ts +Check packages/cli/tests/launch-timeout.test.ts +Check packages/cli/tests/packaged-document.test.ts +Check packages/cli/tests/plan-args.test.ts +Check packages/cli/tests/plan-cli.test.ts +Check packages/cli/tests/plan-command-document.test.ts +Check packages/cli/tests/plan-component.test.ts +Check packages/cli/tests/plan-host-acts.test.ts +Check packages/cli/tests/plan.test.ts +Check packages/cli/tests/plugin-cli.test.ts +Check packages/cli/tests/plugin-host.test.ts +Check packages/cli/tests/plugin-modules.test.ts +Check packages/cli/tests/plugin-selection.test.ts +Check packages/cli/tests/process-retention.test.ts +Check packages/cli/tests/props-cli.test.ts +Check packages/cli/tests/props-schema.test.ts +Check packages/cli/tests/props-sources.test.ts +Check packages/cli/tests/pull-request-read-fork.test.ts +Check packages/cli/tests/repl-admission.test.ts +Check packages/cli/tests/repl-agent-execution.test.ts +Check packages/cli/tests/repl-agent-interface.test.ts +Check packages/cli/tests/repl-agent-journey.test.ts +Check packages/cli/tests/repl-boundaries.test.ts +Check packages/cli/tests/repl-composition.test.ts +Check packages/cli/tests/repl-entries.test.ts +Check packages/cli/tests/repl-execution.test.ts +Check packages/cli/tests/repl-exit-pty.test.ts +Check packages/cli/tests/repl-forms.test.ts +Check packages/cli/tests/repl-journey.test.ts +Check packages/cli/tests/repl-layout-admission.test.ts +Check packages/cli/tests/repl-lifecycle.test.ts +Check packages/cli/tests/repl-model.test.ts +Check packages/cli/tests/repl-presentation-style.test.ts +Check packages/cli/tests/repl-route.test.ts +Check packages/cli/tests/repl-terminal.test.ts +Check packages/cli/tests/run-composition-deno.test.ts +Check packages/cli/tests/run-composition-nested.test.ts +Check packages/cli/tests/run-composition.test.ts +Check packages/cli/tests/run-deadline.test.ts +Check packages/cli/tests/run-profile.test.ts +Check packages/cli/tests/run-timeouts.test.ts +Check packages/cli/tests/secret-detection-cli.test.ts +Check packages/cli/tests/service-document.test.ts +Check packages/cli/tests/service-host.test.ts +Check packages/cli/tests/session-launch-cli.test.ts +Check packages/cli/tests/stdin-cli.test.ts +Check packages/cli/tests/stdout-delivery.test.ts +Check packages/cli/tests/syntax-cli.test.ts +Check packages/cli/tests/targets-cli.test.ts +Check packages/cli/tests/test-root-profile.test.ts +Check packages/cli/tests/test-target.test.ts +Check packages/cli/tests/testing-activation.test.ts +Check packages/cli/tests/testing-execution-host.test.ts +Check packages/cli/tests/upgrade-cli.test.ts +Check packages/cli/tests/upgrade-command-document.test.ts +Check packages/cli/tests/upgrade-output.test.ts +Check packages/cli/tests/value-root.test.ts +Check packages/cli/tests/verbose-component.test.ts +Check packages/cli/tests/workflow-agent-sessions.test.ts +Check packages/cli/tests/workflow-agent.test.ts +Check packages/cli/tests/workflow-cli.test.ts +Check packages/cli/tests/workflow-crash.test.ts +Check packages/cli/tests/workflow-declaration.test.ts +Check packages/cli/tests/workflow-export-publication.test.ts +Check packages/cli/tests/workflow-fetch.test.ts +Check packages/cli/tests/workflow-fork.test.ts +Check packages/cli/tests/workflow-host.test.ts +Check packages/cli/tests/workflow-inspection.test.ts +Check packages/cli/tests/workflow-installation.test.ts +Check packages/cli/tests/workflow-lifecycle-control.test.ts +Check packages/cli/tests/workflow-retention.test.ts +Check packages/cli/tests/workflow-suspension.test.ts +running 1 test from ./packages/cli/tests/agent-adapters.test.ts +Tier AE — embedded adapters on the run and plan paths ... + AE1: the run path resolves an embedded agent to this build's own adapter ... ok (2ms) + AE2: an agent this build carries no snapshot for resolves as it always did ... ok (1ms) + AE3: the plan path's ceiling hands its provider the same registry ... ok (1ms) + AE4: preparing an agent this build carries nothing for writes nothing ... ok (1ms) + AE6: the plan profile prepares its adapter through the host, not the document ... ok (288ms) + AE5: a settled stack carries this host's own adapter root ... ok (0ms) +Tier AE — embedded adapters on the run and plan paths ... ok (296ms) +running 2 tests from ./packages/cli/tests/agent-cli.test.ts +Tier CA — xmd run agent stack ... + CA1: an unknown --agent-provider fails before the document executes ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Unknown agent provider "bogus" +----- post-test output end ----- + CA1: an unknown --agent-provider fails before the document executes ... ok (1s) + CA2: mutually exclusive permission flags fail before the document executes ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--approve-all, --approve-reads, and --deny-all are mutually exclusive +----- post-test output end ----- + CA2: mutually exclusive permission flags fail before the document executes ... ok (1s) + CA3: a document that never uses an agent runs with default flags ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +PLAIN_MARKER + +No agent here. +----- post-test output end ----- + CA3: a document that never uses an agent runs with default flags ... ok (1s) + CA5: the default agent resolves environment, then flag, with the flag winning ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +BEFORE_MARKER + +agent "xmd-env-only-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-env-only-agent; command=xmd-env-only-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-380ff196-705e-4b41-82b9-a33b7c339246/work; Failed to spawn agent command: xmd-env-only-agent) +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +BEFORE_MARKER + +agent "xmd-flag-only-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-flag-only-agent; command=xmd-flag-only-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-f1a5fe5e-e48c-4255-95eb-b9edd44b83dd/work; Failed to spawn agent command: xmd-flag-only-agent) +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +BEFORE_MARKER + +agent "xmd-flag-wins-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-flag-wins-agent; command=xmd-flag-wins-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-623c90d5-bf80-4370-a544-1d088618b414/work; Failed to spawn agent command: xmd-flag-wins-agent) +----- post-test output end ----- + CA5: the default agent resolves environment, then flag, with the flag winning ... ok (4s) + CA6: an unavailable agent aborts expansion, for and for a bare ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +BEFORE_MARKER + +agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-b792598d-bad0-4562-bd18-422b95008b22/work; Failed to spawn agent command: xmd-nonexistent-agent) +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +BEFORE_MARKER + +agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-9988ee77-5f97-4f17-bcf4-3a63df9b7a07/work; Failed to spawn agent command: xmd-nonexistent-agent) +----- post-test output end ----- + CA6: an unavailable agent aborts expansion, for and for a bare ... ok (3s) + CA7: xmd test rejects every agent-only option at argument parsing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --agent-provider — agent options are exclusive to xmd run and xmd plan +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --default-agent — agent options are exclusive to xmd run and xmd plan +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --approve-all — agent options are exclusive to xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --approve-reads — agent options are exclusive to xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --deny-all — agent options are exclusive to xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd test: --agent-provider=acpx — agent options are exclusive to xmd run and xmd plan +----- post-test output end ----- + CA7: xmd test rejects every agent-only option at argument parsing ... ok (7s) +Tier CA — xmd run agent stack ... ok (20s) +Tier CO — xmd agent options ... + CO1: a command line this command does not define is refused before an agent is asked ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd agent names an action — write `xmd agent options [agent] [--model ] [--json]`. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd agent does not have a "list" action. The one action is `xmd agent options`. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd agent options accepts at most one agent name. claude is an extra argument. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd agent options does not recognize --effort. It accepts one optional agent name and these options: --model, --json. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--model needs a model id — write `--model ` with the exact id the agent advertises. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--json does not take a value. Use it by itself. +----- post-test output end ----- + CO1: a command line this command does not define is refused before an agent is asked ... ok (8s) + CO2: an agent that is not there fails without printing a partial answer ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +agent "definitely-not-an-agent-command" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=definitely-not-an-agent-command; command=definitely-not-an-agent-command; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-3b31b49a-a1ef-43f2-9820-2ebfc38b7dee/work; Failed to spawn agent command: definitely-not-an-agent-command) +----- post-test output end ----- + CO2: an agent that is not there fails without printing a partial answer ... ok (1s) + CO3: the help says what inspecting costs, and what it does not ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd agent [OPTIONS] [action] [agent] + +Arguments: + [action] the one action: `options` + [agent] agent to ask (default: the agent `xmd run` would use) + +Options: + --model [MODEL] read effort choices for this exact model id instead of the current one + --json write the choices as version-1 JSON instead of text [default: false] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Inspecting an agent reads the choices it advertises for a session, so xmd +creates one, reads it, and closes it without sending a prompt. The provider +may keep that empty conversation in its own history. + +The command runs no document, spends no model turn, writes no xmd journal and +creates no durable xmd session. + + xmd agent options + xmd agent options codex + xmd agent options codex --model gpt-5.4 + xmd agent options codex --model gpt-5.4 --json + +Ids are exact provider ids, and they are what a writes: + +----- post-test output end ----- + CO3: the help says what inspecting costs, and what it does not ... ok (1s) +Tier CO — xmd agent options ... ok (11s) +running 1 test from ./packages/cli/tests/agent-config.test.ts +Tier AF — agent flag parsing ... + AF1: no permission flag selects approve-reads ... ok (3ms) + AF2: each explicit permission flag selects its own mode ... ok (1ms) + AF3: more than one permission flag is an error ... ok (0ms) + AF4: the explicit default agent passes through untouched ... ok (1ms) +Tier AF — agent flag parsing ... ok (10ms) +running 1 test from ./packages/cli/tests/agent-options-cli.test.ts +Tier CX — xmd agent options against an agent ... + CX1: one session, no prompt, closed — and nothing of the run left behind ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-38828c02-b64d-41bf-844d-49e8d26a1833/acp-agent +Selected model: gpt-5.4 + +Models + gpt-5.4 GPT-5.4 — the current one (selected) + Group mini Small + gpt-5.4-mini GPT-5.4 Mini + +Effort levels for gpt-5.4 + low Low + medium Medium (selected) + high High +----- post-test output end ----- + CX1: one session, no prompt, closed — and nothing of the run left behind ... ok (1s) + CX2: the text a person reads is the agent's own order and grouping ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-71432c30-da25-42bf-8451-50d59f119583/acp-agent +Selected model: gpt-5.4 + +Models + gpt-5.4 GPT-5.4 — the current one (selected) + Group mini Small + gpt-5.4-mini GPT-5.4 Mini + +Effort levels for gpt-5.4 + low Low + medium Medium (selected) + high High +----- post-test output end ----- + CX2: the text a person reads is the agent's own order and grouping ... ok (1s) + CX3: --model is applied, verified, and its own effort choices reported ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +{ + "version": 1, + "agent": "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-216faa21-1e6f-4939-8d2c-4a1511806712/acp-agent", + "model": { + "selected": "gpt-5.4-mini", + "options": [ + { + "id": "gpt-5.4", + "name": "GPT-5.4", + "description": "the current one", + "group": null + }, + { + "id": "gpt-5.4-mini", + "name": "GPT-5.4 Mini", + "description": null, + "group": { + "id": "mini", + "name": "Small" + } + } + ] + }, + "effort": { + "selected": "low", + "options": [ + { + "id": "low", + "name": "Low", + "description": null, + "group": null + } + ] + } +} +----- post-test output end ----- + CX3: --model is applied, verified, and its own effort choices reported ... ok (1s) + CX4: with no agent named, the one an `xmd run` would use is asked ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-8c734a86-d009-4528-8684-69570e678031/acp-agent +Selected model: gpt-5.4 + +Models + gpt-5.4 GPT-5.4 — the current one (selected) + Group mini Small + gpt-5.4-mini GPT-5.4 Mini + +Effort levels for gpt-5.4 + low Low + medium Medium (selected) + high High +----- post-test output end ----- + CX4: with no agent named, the one an `xmd run` would use is asked ... ok (1s) + CX5: an agent that advertises nothing says so rather than printing nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-460f0e90-981d-490b-a93e-dd8a085d761f/acp-agent + +Model choices are unavailable for /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-460f0e90-981d-490b-a93e-dd8a085d761f/acp-agent. + +Effort choices are unavailable for the current model. +----- post-test output end ----- + CX5: an agent that advertises nothing says so rather than printing nothing ... ok (1s) + CX6: a model this agent does not offer is refused, and nothing is printed ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Unknown model "gpt-x" for agent "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-5ad51377-8906-4274-82b0-3371e8b24f26/acp-agent". +Available options are: gpt-5.4, gpt-5.4-mini +----- post-test output end ----- + CX6: a model this agent does not offer is refused, and nothing is printed ... ok (1s) + CX7: the help says what asking costs before anyone asks ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd agent [OPTIONS] [action] [agent] + +Arguments: + [action] the one action: `options` + [agent] agent to ask (default: the agent `xmd run` would use) + +Options: + --model [MODEL] read effort choices for this exact model id instead of the current one + --json write the choices as version-1 JSON instead of text [default: false] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Inspecting an agent reads the choices it advertises for a session, so xmd +creates one, reads it, and closes it without sending a prompt. The provider +may keep that empty conversation in its own history. + +The command runs no document, spends no model turn, writes no xmd journal and +creates no durable xmd session. + + xmd agent options + xmd agent options codex + xmd agent options codex --model gpt-5.4 + xmd agent options codex --model gpt-5.4 --json + +Ids are exact provider ids, and they are what a writes: + +----- post-test output end ----- + CX7: the help says what asking costs before anyone asks ... ok (1s) + CX8: a malformed answer is refused whole, and says nothing the agent sent ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +this agent's model selector advertises no list of choices +----- post-test output end ----- + CX8: a malformed answer is refused whole, and says nothing the agent sent ... ok (1s) +Tier CX — xmd agent options against an agent ... ok (12s) +running 2 tests from ./packages/cli/tests/agent-options.test.ts +Tier AG — the agent-options grammar ... + AG1: the accepted forms read as themselves ... ok (4ms) + AG2: everything else is refused, and says what is accepted ... ok (1ms) +Tier AG — the agent-options grammar ... ok (12ms) +Tier AG — what the command prints ... + AG3: a person reads ids first, in the provider's own order ... ok (1ms) + AG4: absent choices say so rather than printing an empty list ... ok (1ms) + AG5: the JSON is version 1, in its settled order, with null for absence ... ok (0ms) + AG6: neither rendering carries a path, a session identity or a credential ... ok (1ms) +Tier AG — what the command prints ... ok (5ms) +running 1 test from ./packages/cli/tests/agent-session-coordinator.test.ts +Tier HC — host session ownership ... + HC1: only a host with advisory locking builds a coordinator ... ok (2ms) + HC2: the coordination namespace is the machine-wide one, not a run's ... ok (1ms) + HC3: a provider with no coordinator refuses before contacting the agent ... ok (3ms) + HC4: a coordinator this host can build gets past the ownership question ... ok (17ms) + HC6: an agent that names its own sessions needs a route store too ... ok (2ms) + HC7: a provider-returned agent performs no route work at all ... ok (14ms) + HC8: the shipped default advertises exactly the adapters that were proven ... ok (1ms) + HC9: a default Claude launch reaches the launcher here, and refuses elsewhere ... ok (37ms) + HC10: an unadvertised agent keeps ordinary behavior on every runtime ... ok (1ms) + HC5: the Deno and compiled entrypoints assemble machine sessions; Node and Bun do not ... ok (2ms) + HC11: an agent that names its own sessions needs an observer too ... ok (1ms) + HC12: the two advertised sets are separate, and this host states both ... ok (0ms) +Tier HC — host session ownership ... ok (90ms) +running 1 test from ./packages/cli/tests/cli-help.test.ts +Tier CH — xmd help ... + CH1: program help lists the commands ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH1: program help lists the commands ... ok (678ms) + CH2: xmd run --help prints run help instead of a missing-argument error ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + CH2: xmd run --help prints run help instead of a missing-argument error ... ok (590ms) + CH3: xmd test --help prints test help ... +------- post-test output ------- +Usage: xmd test [OPTIONS] [path] + +Arguments: + [path] markdown document or directory to test (defaults to the current directory) [default: .] + +Options: + --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH3: xmd test --help prints test help ... ok (565ms) + CH12: program help lists syntax, and syntax help lists only its two options ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +Usage: xmd syntax [OPTIONS] [component] + +Arguments: + [component] component to describe in full — `xmd syntax Elicit` renders its catalog metadata and long-form documentation instead of the compact catalog + +Options: + --include ... component search directory [default: components,.] + --json write the symbols as version-2 JSON instead of markdown [default: false] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH12: program help lists syntax, and syntax help lists only its two options ... ok (1s) + CH13: run and test help are unchanged by the syntax command ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +Usage: xmd test [OPTIONS] [path] + +Arguments: + [path] markdown document or directory to test (defaults to the current directory) [default: .] + +Options: + --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH13: run and test help are unchanged by the syntax command ... ok (1s) + CH14: program help lists upgrade, and its help performs no upgrade ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +Usage: xmd upgrade [OPTIONS] [tag] + +Arguments: + [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) + +Options: + --status report how the selected release compares, and change nothing [default: false] + --allow-downgrade consent to installing a release older than the installed one [default: false] + --allow-prerelease consent to installing the exact prerelease tag named [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +With no tag, xmd upgrade installs the latest published stable release. Name +an exact tag instead to select one release and only that release: + xmd upgrade + xmd upgrade v1.2.3 + xmd upgrade v1.3.0-rc.1 --allow-prerelease + + --status + Report the installed version, the selected release, how the two + compare and the exact release URL. It downloads no binary, locks + nothing and changes no files, and it accepts any published exact tag + without consent — so neither consent option may be written with it. + + --allow-downgrade + Consent to installing a release older than the installed one. It is + refused when the selected release is not older. + + --allow-prerelease + Consent to installing the exact prerelease tag named. It is refused + without one, because no implicit selection ever chooses a prerelease. + + --journal , -j + Write a diagnostic JSONL trace of this run to a new file. The path + must not exist. The trace is evidence only: it is never read back, it + resumes nothing, and it changes no output, release choice or consent. + With --status it is the one file the command writes. + +Only a compiled xmd on macOS or Linux can replace itself: + + compiled binary macOS or Linux: self-upgrade + Windows: use the installer or a release asset + npm or Node update with npm + Bun update with Bun + Deno or repository source update the package version or the checkout + +Every other combination stops with instructions for that installation before +the command reads release metadata or changes any files. + +An install downloads the release binary for this platform, checks it against +the published SHA-256 checksum, runs the verified candidate and requires it +to report the selected version, and only then replaces the binary that ran +this command with one atomic rename. Anything that fails before that rename +leaves the installed xmd exactly as it was. +----- post-test output end ----- + CH14: program help lists upgrade, and its help performs no upgrade ... ok (1s) + CH4: --version prints the version ... +------- post-test output ------- +0.13.1 +----- post-test output end ----- + CH4: --version prints the version ... ok (578ms) + CH5: a missing document still fails, so help detection does not mask errors ... +------- post-test output ------- +xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` +----- post-test output end ----- + CH5: a missing document still fails, so help detection does not mask errors ... ok (618ms) + CH6: no command named targets is registered ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH6: no command named targets is registered ... ok (569ms) + CH7: a document named targets gets ordinary shorthand run help ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by targets + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in targets + + targets#Prepare + Install what the later sections read from. + + targets#Verify +----- post-test output end ----- + CH7: a document named targets gets ordinary shorthand run help ... ok (581ms) + CH15: run help states the standard-input form and the pipeline it serves ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + CH15: run help states the standard-input form and the pipeline it serves ... ok (571ms) + CH8: run help teaches the document-reference grammar ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + CH8: run help teaches the document-reference grammar ... ok (562ms) + CH10: generic run help reads no document and shows neither section ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + CH10: generic run help reads no document and shows neither section ... ok (556ms) + CH11: a file-backed form adds both contextual sections to the same run help ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by doc.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in doc.md + + doc.md#Prepare + Install what the later sections read from. + + doc.md#Verify +----- post-test output end ----- + CH11: a file-backed form adds both contextual sections to the same run help ... ok (606ms) + CH9: test help is unchanged by the reference grammar ... +------- post-test output ------- +Usage: xmd test [OPTIONS] [path] + +Arguments: + [path] markdown document or directory to test (defaults to the current directory) [default: .] + +Options: + --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + CH9: test help is unchanged by the reference grammar ... ok (582ms) + CH12: program help lists repl, and its own help describes the one entry ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +Usage: xmd repl [OPTIONS] [location] + +Arguments: + [location] a location this REPL printed earlier — `xmd://repl//...` — to reopen that retained history and the exact view it names + +Options: + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +ONE ENTRY + + xmd repl opens an empty draft in a full-screen terminal. Type or paste one + XMD entry and submit it; the REPL runs it, and you can pause its expansion, + look at an earlier point in its history, answer a question it asks and read + what it produced. + + An execution admits exactly one entry. The screen always shows a location + of the form xmd://repl//..., and when the command ends it + prints the whole xmd repl that reopens the one it ended at. Running + it reopens the same retained history and selects the same view — in this + process or another one, from the history file alone. +----- post-test output end ----- + CH12: program help lists repl, and its own help describes the one entry ... ok (1s) + CH13: xmd repl refuses a bad command line before it opens anything ... +------- post-test output ------- +xmd repl takes at most one location. This REPL admits one entry per execution, so there is no second document to name. +unrecognized option for xmd repl: --json — xmd repl takes one optional location and the agent options --agent-provider, --default-agent, --approve-all, --approve-reads and --deny-all +xmd repl: a REPL location begins with xmd://repl/ +----- post-test output end ----- + CH13: xmd repl refuses a bad command line before it opens anything ... ok (1s) + C1: repl states the same five Agent options as run, described the same way ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +Usage: xmd repl [OPTIONS] [location] + +Arguments: + [location] a location this REPL printed earlier — `xmd://repl//...` — to reopen that retained history and the exact view it names + +Options: + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +ONE ENTRY + + xmd repl opens an empty draft in a full-screen terminal. Type or paste one + XMD entry and submit it; the REPL runs it, and you can pause its expansion, + look at an earlier point in its history, answer a question it asks and read + what it produced. + + An execution admits exactly one entry. The screen always shows a location + of the form xmd://repl//..., and when the command ends it + prints the whole xmd repl that reopens the one it ended at. Running + it reopens the same retained history and selects the same view — in this + process or another one, from the history file alone. +----- post-test output end ----- + C1: repl states the same five Agent options as run, described the same way ... ok (1s) + C1: each Agent option is accepted, and a wrong line refuses before the terminal ... +------- post-test output ------- +xmd repl: the REPL runs where a terminal is: it is not available over a pipe. +xmd repl: the REPL runs where a terminal is: it is not available over a pipe. +xmd repl: the REPL runs where a terminal is: it is not available over a pipe. +xmd repl: the REPL runs where a terminal is: it is not available over a pipe. +xmd repl: the REPL runs where a terminal is: it is not available over a pipe. +--approve-all, --approve-reads, and --deny-all are mutually exclusive +Unknown agent provider "nope" +xmd repl: --default-agent requires a value +xmd repl takes at most one location. This REPL admits one entry per execution, so there is no second document to name. +----- post-test output end ----- + C1: each Agent option is accepted, and a wrong line refuses before the terminal ... ok (5s) +Tier CH — xmd help ... ok (20s) +running 1 test from ./packages/cli/tests/command.test.ts +Tier XC — the xmd command ... + XC1: with no adapter installed, command reports that rather than guessing ... ok (2ms) + XC2: an adapter appends the arguments it is given ... ok (1ms) + XC3: ordinary middleware wraps the entrypoint's base provider ... ok (0ms) + XC4: this runtime's entrypoint relaunches a worker from another directory ... +------- post-test output ------- +# Test-agent smoke + +One complete availability/session/prompt/text/teardown path through the +real ACPX runtime and a real `xmd test-agent` worker. + + + + + + + + + + + + +> ✅ **AssertStringIncludes** passed +> actual: "\n\nThe review of **packages/core** at `abc123` passed.\n\n" +> expected: "The review of **packages/core** at `abc123` passed." + + +> ✅ **AssertStringIncludes** passed +> actual: "\n\nThe review of **packages/core** passed.\n" +> expected: "The review of **packages/core** passed." + + + + `` has a second placement. Written as a declaration inside an + `` it scripts the agent a *child* document reaches, and + `` says what the child's elicitations are answered with. The child + below is written the way an ordinary document is — it asks an agent to review + a change, then asks a person whether to accept the answer — and nothing in it + knows it is under test. The declarations are what make it deterministic. + + The child is written here rather than referenced, because a target resolves + from the working directory and this document is run from several. + + + + + A bound execution keeps its assertion body to itself, so what the child + produced is shown here, where the person running this can read it: + + +The review is one conversation, so it is sent inside a named session. + + + + + + + +The review of **packages/core** at `abc123` passed. + + + +Now the decision, which only a person can make. + + + +You chose to approve the review. + + + +----- post-test output end ----- + XC4: this runtime's entrypoint relaunches a worker from another directory ... ok (7s) +Tier XC — the xmd command ... ok (7s) +running 1 test from ./packages/cli/tests/compiled-upgrade.test.ts +Tier UH — the compiled upgrade host ... + UH1: every platform maps to the exact artifact the release publishes ... ok (2ms) + UH2: only an eligible compiled host carries the components at all ... ok (0ms) + UH3: a successful upgrade replaces the bytes once and reports the facts ... ok (325ms) + UH4: --status reads metadata and touches the installation not at all ... ok (41ms) + UH5: an exact tag reads the tag endpoint and installs that release ... ok (152ms) + UH6: a tag GitHub does not publish is a missing release, not a broken read ... ok (40ms) + UH7: a draft never reaches installation, however it is selected ... ok (172ms) + UH8: metadata that is malformed, oversized or incomplete is refused as such ... ok (152ms) + UH9: a release missing this target's binary or its checksums is refused ... ok (70ms) + UH10: a checksum set must name this binary exactly once ... ok (98ms) + UH11: a checksum mismatch stops before the candidate is made executable ... ok (45ms) + UH12: a candidate that does not report the selected version never replaces anything ... ok (248ms) + UH13: stdout is the version only after its own terminal line ending ... ok (174ms) + UH14: a download that leaves the GitHub boundary is refused, however it leaves ... ok (212ms) + UH15: GitHub's own signed delivery host is followed, and only so far ... ok (185ms) + UH16: a download that is short, oversized or interrupted never installs ... ok (189ms) + UH17: a failed replacement leaves the original byte-identical ... ok (131ms) + UH18: an invoked symbolic link is refused rather than followed ... ok (25ms) + UH19: a destination that is not a regular file is refused ... ok (24ms) + UH20: an unwritable installation directory is refused before the network ... ok (22ms) + UH21: a second upgrade of the same installation waits for nobody ... +------- post-test output ------- +held +----- post-test output end ----- + UH21: a second upgrade of the same installation waits for nobody ... ok (211ms) + UH22: cancelling before the commit keeps the original and leaves no candidate ... ok (48ms) + UH23: cancelling after the commit keeps the new binary ... ok (145ms) + UH24: the request never carries a credential or a caller's header ... ok (144ms) + UH25: only this invocation's own identities authorize a phase ... ok (3ms) + UH27: a redirect inside this repository is still bound to this exact download ... ok (82ms) + UH28: a release page URL that names another tag is not a release fact ... ok (157ms) + UH29: a host operation that throws becomes an answer, not a stack trace ... ok (249ms) + UH30: a lock this host cannot open is refused, not raised ... ok (27ms) + UH31: staging is owned only once its exclusive create has succeeded ... ok (52ms) + UH32: a chunk is written completely, however many writes that takes ... ok (0ms) + UH33: a sink that stops accepting bytes fails rather than truncating ... ok (0ms) + UH34: a candidate write that fails reaches the approved refusal, not a throw ... ok (37ms) + UH35: a probe name that belongs to somebody else is neither deleted nor replaced ... ok (41ms) + UH36: a healthy probe leaves neither name behind ... ok (133ms) + UH37: a cancelled download closes the candidate rather than only unlinking it ... ok (49ms) + UH39: a phase cannot be skipped, repeated or run out of order ... ok (100ms) + UH38: the command's own exit status follows the outcome ... +------- post-test output ------- +# Upgrade XMD + +Compares the installed XMD version with the selected release without downloading +a binary or changing the installation. + +## Select a release + +Reads release information from `taras/executable.md`. Ignores drafts and +releases with invalid tags. + +## Release status + +The installed and selected versions were compared using semantic version +precedence. + +Installed version: 0.10.2 +Selected release: v0.11.0 (newer) +Release notes: https://github.com/taras/executable.md/releases/tag/v0.11.0 +No files were changed. +# Upgrade XMD + +Compares the installed XMD version with the selected release without downloading +a binary or changing the installation. + +## Select a release + +Reads release information from `taras/executable.md`. Ignores drafts and +releases with invalid tags. + +## Release status + +The installed and selected versions were compared using semantic version +precedence. + +Installed version: 0.10.2 +Selected release: v0.11.0 (newer) +Release notes: https://github.com/taras/executable.md/releases/tag/v0.11.0 +No files were changed. +# Upgrade XMD +----- post-test output end ----- + UH38: the command's own exit status follows the outcome ... ok (106ms) +Tier UH — the compiled upgrade host ... ok (3s) +running 1 test from ./packages/cli/tests/document-suites/inline/inline-markdown.test.ts +Tier IE — checked-in Markdown suite ... + runs Inline.test.md once under the production run host ... ok (949ms) +Tier IE — checked-in Markdown suite ... ok (950ms) +running 1 test from ./packages/cli/tests/document-suites/plan/plan-markdown.test.ts +Tier PMT — checked-in Markdown suite ... + runs Plan.test.md once under the production run host ...'Tier PMT — checked-in Markdown suite' has been running for over (1m0s) + ok (1m41s) +Tier PMT — checked-in Markdown suite ... ok (1m41s) +running 1 test from ./packages/cli/tests/document-suites/props/props-markdown.test.ts +Tier PC — checked-in Markdown suite ... + runs Props.test.md once under the production run host ... ok (731ms) +Tier PC — checked-in Markdown suite ... ok (733ms) +running 1 test from ./packages/cli/tests/document-suites/syntax/syntax-markdown.test.ts +Tier SM — checked-in Markdown suite ... + runs Syntax.test.md once under the production run host ... ok (4s) +Tier SM — checked-in Markdown suite ... ok (4s) +running 1 test from ./packages/cli/tests/document-suites/targets/targets-markdown.test.ts +Tier CT — checked-in Markdown suite ... + runs Targets.test.md once under the production run host ... ok (1s) +Tier CT — checked-in Markdown suite ... ok (1s) +running 1 test from ./packages/cli/tests/document-suites/verbose/verbose-markdown.test.ts +Tier VB — checked-in Markdown suite ... + runs Verbose.test.md once under the production run command ... ok (6s) +Tier VB — checked-in Markdown suite ... ok (6s) +running 3 tests from ./packages/cli/tests/evaluate-component.test.ts +Tier FE — the ordinary run profile ... + FE21: `xmd run` states a profile, and a fragment reads the caller's files ... +------- post-test output ------- + + +"the retained note\n\n" +----- post-test output end ----- + FE21: `xmd run` states a profile, and a fragment reads the caller's files ... ok (818ms) + FE5: the ordinary profile admits writes and deletions, and nothing else ... +------- post-test output ------- + + + +done +----- post-test output end ----- + FE5: the ordinary profile admits writes and deletions, and nothing else ... ok (826ms) + FE21: a fragment searches and reads through the profile's own operations ... +------- post-test output ------- + + +"\n[\n \"doc.md\",\n \"notes.md\"\n]\n" +----- post-test output end ----- + FE21: a fragment searches and reads through the profile's own operations ... ok (834ms) + FE21: a fragment cannot reach an operation the ordinary profile withheld ... +------- post-test output ------- +a generated fragment names a component this host did not admit. +----- post-test output end ----- + FE21: a fragment cannot reach an operation the ordinary profile withheld ... ok (1s) +Tier FE — the ordinary run profile ... ok (3s) +Tier FE — the one spelling this host accepts ... + FE19: every profile refuses `source`, which is no longer a spelling ... +------- post-test output ------- +Prop validation failed for : + - "/source" must NOT have additional properties +----- post-test output end ----- + FE19: every profile refuses `source`, which is no longer a spelling ... ok (828ms) + FE19: every profile refuses `program`, which was never released ... +------- post-test output ------- +Prop validation failed for : + - "/program" must NOT have additional properties +----- post-test output end ----- + FE19: every profile refuses `program`, which was never released ... ok (833ms) +Tier FE — the one spelling this host accepts ... ok (1s) +Tier FE — what the source symbols report ... + FE28: source symbols carry `Evaluate` with a protected origin ... ok (159ms) + FE28: no host bootstrap is needed to make the name available ... ok (88ms) +Tier FE — what the source symbols report ... ok (247ms) +running 1 test from ./packages/cli/tests/evaluate-workflow.test.ts +Tier FE — the workflow host's profile ... + FE22: the directory capability is the host's, and Git is what supplies it ... ok (17ms) + FE23: Git's directory entry is the exact identity retained history holds ... ok (1ms) + FE19: `source` and `text` behave identically here, and neither warns ... ok (131ms) + FE19: `program` is a spelling no profile has ... ok (26ms) + FE21: the workflow fragment reaches the run's Workspace, not the caller's disk ... ok (42ms) + FE20: a request outside the stated ceiling is refused, and none is admitted by default ... ok (40ms) +Tier FE — the workflow host's profile ... ok (263ms) +running 1 test from ./packages/cli/tests/fetch-cli.test.ts +Tier FT — diagnostic retention of a Fetch ... + FTC1: a run without --journal performs the request and keeps nothing ... +------- post-test output ------- +# Reads + + +----- post-test output end ----- + FTC1: a run without --journal performs the request and keeps nothing ... ok (855ms) + FTC2: a run with --journal retains the normalized request and the response ... +------- post-test output ------- +# Reads + + +----- post-test output end ----- + FTC2: a run with --journal retains the normalized request and the response ... ok (850ms) +Tier FT — diagnostic retention of a Fetch ... ok (1s) +running 1 test from ./packages/cli/tests/file-stream.test.ts +FileStream ... + writes exactly the bytes the shared serializer produces ... ok (6ms) + reads back every appended event in append order ... ok (2ms) +FileStream ... ok (15ms) +running 1 test from ./packages/cli/tests/github-zero-effect.test.ts +describing the bundled profile costs nothing ... + renders the syntax catalog without reading GitHub configuration ... ok (186ms) + validates a Plan draft without reading GitHub configuration ... ok (244ms) + refuses the same draft when the Git Plugin is not in the profile ... ok (79ms) +describing the bundled profile costs nothing ... ok (513ms) +running 1 test from ./packages/cli/tests/inline-cli.test.ts +Tier IE — inline root documents ... + IE1: both command forms run the same document ... +------- post-test output ------- +# Hello# Hello----- post-test output end ----- + IE1: both command forms run the same document ... ok (1s) + IE2: a path and --eval together name two root documents ... +------- post-test output ------- +README.md and --eval both supply a root document — a run takes exactly one, either `xmd run README.md` or `xmd run -e ''` +----- post-test output end ----- + IE2: a path and --eval together name two root documents ... ok (672ms) + IE3: --eval given twice fails ... +------- post-test output ------- +--eval was given more than once — a run has exactly one root document +----- post-test output end ----- + IE3: --eval given twice fails ... ok (604ms) + IE4: --eval with no value fails ... +------- post-test output ------- +--eval requires a markdown document — write `-e ''` +----- post-test output end ----- + IE4: --eval with no value fails ... ok (613ms) + IE5: `-e -` does not read stdin ... ok (598ms) + IE6: the alias has no inline value form ... +------- post-test output ------- +-e takes a separate value — write `-e ` or `--eval=` +----- post-test output end ----- + IE6: the alias has no inline value form ... ok (607ms) + IE7: no source at all fails, in both command forms ... +------- post-test output ------- +xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` +xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` +----- post-test output end ----- + IE7: no source at all fails, in both command forms ... ok (1s) + IE8: a numeric document is text, not a number ... +------- post-test output ------- +42----- post-test output end ----- + IE8: a numeric document is text, not a number ... ok (815ms) + IE9: a document that reads like an option is still a document ... +------- post-test output ------- +--props-h----- post-test output end ----- + IE9: a document that reads like an option is still a document ... ok (1s) + IE10: the token after --eval is taken verbatim ... +------- post-test output ------- +--verbose- item----- post-test output end ----- + IE10: the token after --eval is taken verbatim ... ok (1s) + IE11a: --eval accepts an explicitly empty value ... ok (815ms) + IE12: inline frontmatter declares properties ... +------- post-test output ------- + +Hello Ada +Hello Grace +Hello Alan----- post-test output end ----- + IE12: inline frontmatter declares properties ... ok (2s) + IE13: help describes the inline source and the document's properties ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + IE13: help describes the inline source and the document's properties ... ok (640ms) + IE14: an inline value root prints only its JSON result ... +------- post-test output ------- +{"ok":true} +[yield] import_component:__root__ → ok { path: '' } + +rendered body + +[close] root → ok +{"ok":true} +----- post-test output end ----- + IE14: an inline value root prints only its JSON result ... ok (1s) + IE17: repository components resolve from the invocation directory ... +------- post-test output ------- +Hello from a component + +Hello from a component + +----- post-test output end ----- + IE17: repository components resolve from the invocation directory ... ok (1s) + IE25: repeated includes are searched in caller order, replacing the defaults ... +------- post-test output ------- +from the first include + +----- post-test output end ----- + IE25: repeated includes are searched in caller order, replacing the defaults ... ok (829ms) + IE18: running an inline document leaves the directory as it was ... +------- post-test output ------- +Hello from a component + +----- post-test output end ----- + IE18: running an inline document leaves the directory as it was ... ok (841ms) + IE19: --journal records the supplied identity and text ... +------- post-test output ------- +# Hello +----- post-test output end ----- + IE19: --journal records the supplied identity and text ... ok (831ms) + IE20: ordinary run flags apply to an inline document ... +------- post-test output ------- +[yield] import_component:__root__ → ok { path: '' } +[close] root → ok +# Hello----- post-test output end ----- + IE20: ordinary run flags apply to an inline document ... ok (826ms) + IE21: inline documents are exclusive to xmd run ... +------- post-test output ------- +unrecognized option for xmd test: --eval — inline documents are exclusive to xmd run +----- post-test output end ----- + IE21: inline documents are exclusive to xmd run ... ok (594ms) + IE22: inline help describes properties and offers no target section ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + IE22: inline help describes properties and offers no target section ... ok (639ms) + IE29: the shorthand form runs the file named `-`, not stdin ... ok (1s) + IE30: a reference selects a section of that file, not stdin ... ok (794ms) + IE31: another command's `-` keeps that command's meaning ... ok (618ms) + IE24: an uncaught failure exits 1 with the prefix kept and one diagnostic ... +------- post-test output ------- +PREFIX-PROSE + +stage classifier failed +----- post-test output end ----- + IE24: an uncaught failure exits 1 with the prefix kept and one diagnostic ... ok (825ms) +Tier IE — inline root documents ... ok (25s) +running 1 test from ./packages/cli/tests/launch-timeout.test.ts +Harness deadline — an abandoned xmd run keeps its account ... + the failure names the deadline and carries both channels ... +------- post-test output ------- +lingering-outlingering-err----- post-test output end ----- + the failure names the deadline and carries both channels ... ok (10s) +Harness deadline — an abandoned xmd run keeps its account ... ok (10s) +running 1 test from ./packages/cli/tests/packaged-document.test.ts +packaged documents ... + reads the plan command document from beside its module, whatever the cwd is ... ok (9ms) + reads the packaged Component from beside its module, whatever the cwd is ... ok (5ms) + reads the upgrade command document from beside its module too ... ok (3ms) + says which build is missing a document rather than behaving differently ... ok (1ms) +packaged documents ... ok (19ms) +running 1 test from ./packages/cli/tests/plan-args.test.ts +Tier PR — xmd plan fixed grammar ... + PS1: exactly one request, kept byte for byte ... ok (3ms) + PS1: every retained option is accepted, before and after the request ... ok (1ms) + PS2: every --run spelling reports the migration, and establishes nothing ... ok (1ms) + PS3: every other removed option reports the one generic refusal ... ok (2ms) + PO7: the two authorship options are accepted, and their aliases are not ... ok (1ms) + PO7: an option that reaches this grammar after --journal is that option, not a path ... ok (1ms) + PS2/PS3: the removal is decidable beside --help, in either order ... ok (0ms) + PS3: a name that merely begins like a property option is an unknown one ... ok (1ms) + PS3: an option this command does not define is refused, not dropped ... ok (0ms) +Tier PR — xmd plan fixed grammar ... ok (16ms) +running 2 tests from ./packages/cli/tests/plan-cli.test.ts +Tier PR — the xmd plan command lifecycle ... + PS4: plan help states the retained grammar and both compositions ... +------- post-test output ------- +Usage: xmd plan [OPTIONS] [request] + +Arguments: + [request] the request the coding agent should turn into an XMD Plan + +Options: + --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) + --session [SESSION] logical name for the assistant session (default: unique to this invocation) + --verbose show generated drafts and XMD check diagnostics on stderr [default: false] + --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) + --include ... component search directory [default: components,.] + --agent-provider agent provider for Plan authorship [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one request is required. It describes the program you want the coding +agent to create, rather than a path. Quote it so the shell passes it as one +argument: + xmd plan "Prepare the release program." + +A first-party command document turns the request into an XMD Plan. xmd checks +each draft, and you approve, request changes, or stop before source leaves the +command. + +The approved Plan is the only result. Without --output, stdout contains its +exact source bytes and nothing else. With --output, the path is created +exclusively after approval; an existing path is left unchanged. + +Planning never runs the approved program. Compose planning and execution +explicitly through standard input: + xmd plan "Prepare the release program." | xmd run - + +Or preserve the artifact and run it later: + xmd plan "Prepare the release program." --output release.md && xmd run release.md + +A named --session continues the planning conversation. Without it, this +invocation uses a unique session. + +Secret detection checks journal entries before they are recorded, but it may not +catch every sensitive detail. The journal can contain prompts, drafts, and review +answers. +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + PS4: plan help states the retained grammar and both compositions ... ok (1s) + PS5: xmd run --help still exposes every option it configures ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by greeter.md + + --props-name + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + PS5: xmd run --help still exposes every option it configures ... ok (1s) + PS2: every --run spelling reports the migration and reaches nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd plan --run was removed because xmd plan only produces approved source. +Run the program explicitly: + xmd plan "..." | xmd run - + xmd plan "..." --output release.md && xmd run release.md +----- post-test output end ----- + PS2: every --run spelling reports the migration and reaches nothing ... ok (12s) + PS3: every other removed option refuses before authorship ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --timeout-exec — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --timeout-fetch — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --approve-all — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --deny-all — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --no-secret-detection — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --props — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --props-name — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --no-props-loud — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --timeout-exec — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --secret-detection — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --propspective +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --no-propspective +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --no-props +----- post-test output end ----- + PS3: every other removed option refuses before authorship ... ok (22s) + PS1: exactly one request, and an unknown option is refused not dropped ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized argument for xmd plan: second — the command takes exactly one request +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --not-a-thing +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --save — the approved Plan goes to stdout, and --output writes it to a file +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--session needs a name — write `--session ` or leave it out for a session unique to this invocation +----- post-test output end ----- + PS1: exactly one request, and an unknown option is refused not dropped ... ok (5s) + PS1: inline source is refused before any phase begins ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --eval — inline documents are exclusive to xmd run +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --eval — inline documents are exclusive to xmd run +----- post-test output end ----- + PS1: inline source is refused before any phase begins ... ok (2s) + PS1: the retired spelling names no command and reaches no authorship ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd prompt is not a command — use `xmd plan ""` to create a Plan, or `xmd run ./prompt` to run a document named `prompt` +----- post-test output end ----- + PS1: the retired spelling names no command and reaches no authorship ... ok (1s) + PS1: the retired token is refused before it can be read as a document path ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd prompt is not a command — use `xmd plan ""` to create a Plan, or `xmd run ./prompt` to run a document named `prompt` +# Retired token probe + + +----- post-test output end ----- + PS1: the retired token is refused before it can be read as a document path ... ok (2s) + PS6: approval writes the exact source once to stdout, and runs none of it ... ok (289ms) + PS7: --output creates the artifact after teardown, and never replaces one ... ok (362ms) + PS8: a Plan declaring a required root property is produced with no value ... ok (184ms) + PS9: every ending but approval delivers nothing at all ... ok (1s) + PS10: a named session continues the conversation and still starts no program ... ok (325ms) + PS12: the shipped documentation states what each command does ... ok (8ms) + PS9: --timeout bounds the whole invocation, and it is the only deadline ... +------- post-test output ------- +--timeout must be a duration like 500ms, 30s, or 5min, got "abc" +the run exceeded its --timeout of 1ms and was cancelled +----- post-test output end ----- + PS9: --timeout bounds the whole invocation, and it is the only deadline ... ok (1s) +Tier PR — the xmd plan command lifecycle ... ok (53s) +Tier PO — observable xmd plan authorship ... + PO6: progress is stderr's and the approved bytes are stdout's ... ok (525ms) + PO7: both authorship options work either side of the request; the aliases do not ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + +## Preparing the Plan + +Getting the available XMD components and constructs and setting up the planning session. +agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-08bd3bde-7a97-4245-84b1-9942aefa9678/home/.xmd/plan/sessions/480ca01eacebf92e5130376305a1bc81d95f3ffffb9c285ae6afdcf3d0c46417; Failed to spawn agent command: xmd-nonexistent-agent) + +## Preparing the Plan + +Getting the available XMD components and constructs and setting up the planning session. +agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-08bd3bde-7a97-4245-84b1-9942aefa9678/home/.xmd/plan/sessions/b3cf9845c7a6aa797a0f4d107681890ec8d3da0a2abb93a96942e403f934e407; Failed to spawn agent command: xmd-nonexistent-agent) +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: -V — write `--verbose` +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: -j — write `--journal ` +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd plan: --trace +----- post-test output end ----- + PO7: both authorship options work either side of the request; the aliases do not ... ok (6s) + PO7: a retained option written where the journal path goes refuses before any phase ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +--journal needs a path — write `--journal ` or leave it out to record no journal +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd plan [OPTIONS] [request] + +Arguments: + [request] the request the coding agent should turn into an XMD Plan + +Options: + --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) + --session [SESSION] logical name for the assistant session (default: unique to this invocation) + --verbose show generated drafts and XMD check diagnostics on stderr [default: false] + --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) + --include ... component search directory [default: components,.] + --agent-provider agent provider for Plan authorship [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one request is required. It describes the program you want the coding +agent to create, rather than a path. Quote it so the shell passes it as one +argument: + xmd plan "Prepare the release program." + +A first-party command document turns the request into an XMD Plan. xmd checks +each draft, and you approve, request changes, or stop before source leaves the +command. + +The approved Plan is the only result. Without --output, stdout contains its +exact source bytes and nothing else. With --output, the path is created +exclusively after approval; an existing path is left unchanged. + +Planning never runs the approved program. Compose planning and execution +explicitly through standard input: + xmd plan "Prepare the release program." | xmd run - + +Or preserve the artifact and run it later: + xmd plan "Prepare the release program." --output release.md && xmd run release.md + +A named --session continues the planning conversation. Without it, this +invocation uses a unique session. + +Secret detection checks journal entries before they are recorded, but it may not +catch every sensitive detail. The journal can contain prompts, drafts, and review +answers. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd plan [OPTIONS] [request] + +Arguments: + [request] the request the coding agent should turn into an XMD Plan + +Options: + --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) + --session [SESSION] logical name for the assistant session (default: unique to this invocation) + --verbose show generated drafts and XMD check diagnostics on stderr [default: false] + --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) + --include ... component search directory [default: components,.] + --agent-provider agent provider for Plan authorship [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one request is required. It describes the program you want the coding +agent to create, rather than a path. Quote it so the shell passes it as one +argument: + xmd plan "Prepare the release program." + +A first-party command document turns the request into an XMD Plan. xmd checks +each draft, and you approve, request changes, or stop before source leaves the +command. + +The approved Plan is the only result. Without --output, stdout contains its +exact source bytes and nothing else. With --output, the path is created +exclusively after approval; an existing path is left unchanged. + +Planning never runs the approved program. Compose planning and execution +explicitly through standard input: + xmd plan "Prepare the release program." | xmd run - + +Or preserve the artifact and run it later: + xmd plan "Prepare the release program." --output release.md && xmd run release.md + +A named --session continues the planning conversation. Without it, this +invocation uses a unique session. + +Secret detection checks journal entries before they are recorded, but it may not +catch every sensitive detail. The journal can contain prompts, drafts, and review +answers. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd plan [OPTIONS] [request] + +Arguments: + [request] the request the coding agent should turn into an XMD Plan + +Options: + --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) + --session [SESSION] logical name for the assistant session (default: unique to this invocation) + --verbose show generated drafts and XMD check diagnostics on stderr [default: false] + --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) + --include ... component search directory [default: components,.] + --agent-provider agent provider for Plan authorship [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one request is required. It describes the program you want the coding +agent to create, rather than a path. Quote it so the shell passes it as one +argument: + xmd plan "Prepare the release program." + +A first-party command document turns the request into an XMD Plan. xmd checks +each draft, and you approve, request changes, or stop before source leaves the +command. + +The approved Plan is the only result. Without --output, stdout contains its +exact source bytes and nothing else. With --output, the path is created +exclusively after approval; an existing path is left unchanged. + +Planning never runs the approved program. Compose planning and execution +explicitly through standard input: + xmd plan "Prepare the release program." | xmd run - + +Or preserve the artifact and run it later: + xmd plan "Prepare the release program." --output release.md && xmd run release.md + +A named --session continues the planning conversation. Without it, this +invocation uses a unique session. + +Secret detection checks journal entries before they are recorded, but it may not +catch every sensitive detail. The journal can contain prompts, drafts, and review +answers. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + +## Preparing the Plan + +Getting the available XMD components and constructs and setting up the planning session. +agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-26a65308-ec39-4715-92fa-3705adeeaf81/home/.xmd/plan/sessions/664798881d1c949818b4f00fe68850eef119e5868e67c557bb7b48b1aa80dcdf; Failed to spawn agent command: xmd-nonexistent-agent) +Journal file already exists: kept.jsonl. Choose a different --journal path. +----- post-test output end ----- + PO7: a retained option written where the journal path goes refuses before any phase ... ok (15s) + PO8: no journal writes no file, and one records authorship as ordinary JSONL ... ok (448ms) + PO9: an existing journal is refused untouched, before anything else happens ... ok (5ms) + PO10: a secret in a draft reaches neither the progress nor the journal ... ok (240ms) + PI12: the journal holds the complete request and its findings, as data ... ok (204ms) + PI12: a secret in the findings stops before they are disclosed ... ok (79ms) + PO11: a secret in a failed check's diagnostics is kept out of both, too ... ok (236ms) + PO12: an entry the journal will not take ends authorship and keeps the prefix ... ok (58ms) + PO16: an ordinary failure leaves a whole, readable journal behind ... ok (59ms) + PO13: a progress destination that fails cancels authorship and delivers nothing ... ok (53ms) + PO14: every existing ending keeps its order, and progress claims no delivery ... ok (217ms) + PO15: the catalog is built once, from inside the command document ... ok (162ms) +Tier PO — observable xmd plan authorship ... ok (24s) +running 4 tests from ./packages/cli/tests/plan-command-document.test.ts +the packaged plan command document ... + C2: returns the approved candidate's exact bytes and never reaches exhaustion ... ok (168ms) + C9: every conditional branch of the review schema declares its own type ... ok (67ms) + PO1: every phase precedes the work it announces, and arrives while it runs ... ok (64ms) + PO1: an early phase reaches the operator while the turn is still blocked ... ok (47ms) + PO2: repair and attempt counters come from the document's own bounds ... ok (123ms) + PO2: the attempt counter reaches the tenth and stops there ... ok (207ms) + PO3: Stop announces itself before teardown and keeps its exact diagnostic ... ok (57ms) + PO3: exhaustion announces itself, explains once, and asks nobody anything ... ok (562ms) + PO5: default progress discloses nothing, and verbose adds exactly two blocks ... ok (133ms) + PO15: the packaged adapter builds the catalog once, and says nothing itself ... ok (52ms) +the packaged plan command document ... ok (1s) +Tier PI — read-only information requests ... + PI2, PI12: findings reach the next turn, and default progress says only how many ... ok (68ms) + PI12: verbose adds the complete request and findings, after they settle ... ok (71ms) + PI10: a refused request is one safe retry, and names no host detail ... ok (61ms) + PI7: successes and refusals share one budget, and the ninth is not evaluated ... ok (132ms) + PI7: requests interleave with the initial, repair and revision turns ... ok (111ms) + PI1: named documentation comes back, then an ordinary Plan ... ok (64ms) + PI10: an unknown documented name is one retry, not a stopped invocation ... ok (62ms) + PI2: an empty match renders as an empty array ... ok (61ms) + PI4: a prohibited operation anywhere in the request refuses before any read ... ok (59ms) + PI6, PI12: nothing is disclosed or asked until the request has settled ... ok (66ms) + PI12: a secret in the findings ends the run before anything is disclosed ... ok (49ms) + PI6: findings and the following turn wait for cleanup to finish ... ok (66ms) + PI6: a recoverable refusal is disclosed, then the following turn begins ... ok (64ms) + PI3: a titled draft is never evaluated ... ok (49ms) +Tier PI — read-only information requests ... ok (988ms) +Tier PI — the ordinary ceiling admits the question with the write ... + EL1: the ordinary write table holds canonical `` once, and the read table none ... ok (1ms) + EL3: a read-only information request that asks a question is refused whole ... ok (57ms) +Tier PI — the ordinary ceiling admits the question with the write ... ok (59ms) +the scripted agent ... + fails loudly on a turn nobody scripted, naming it ... ok (47ms) +the scripted agent ... ok (48ms) +running 3 tests from ./packages/cli/tests/plan-component.test.ts +Tier PC — in an ordinary document ... + PC1: the body is the Prompt, and the approved bytes arrive under `as` ... ok (177ms) + PC1b: the packaged Plan writes the public , and its catalog reaches the first turn once ... ok (79ms) + PC1c: a catalog reference that fails reaches no session, turn, review or Plan ... ok (40ms) + PC2: the Prompt is not emitted, and no Plan source is printed ... ok (60ms) + PC3: an empty Prompt reaches no catalog, session, turn or review ... ok (32ms) + PC4: a body that fails reaches no preparation at all ... ok (29ms) + PC5: a host whose provider gives no Agent context refuses before placement ... ok (32ms) + PC6: the private capabilities resolve nowhere a document can write ... ok (160ms) + PC6b: the two information privates declare the contract they were accepted under ... ok (0ms) + Tier PI — information requests from an embedded ... + PI4: an embedded Plan reads through the document host's own profile ... ok (76ms) + PI12: an embedded request emits no command progress into the document ... ok (70ms) + PI4: a prohibited operation in the request refuses with no effect ... ok (68ms) + PI8: a completed request replays with every live reader tripped ... ok (90ms) + PI8: a partial continuation resumes at the first unrecorded effect ... ok (120ms) + PI8: a retained selection refusal restores without asking the provider again ... ok (125ms) + PI8: a changed request refuses rather than resuming ... ok (90ms) + Tier PI — information requests from an embedded ... ok (640ms) + PC7: the catalog advertises and none of its private names ... ok (76ms) + PC7b: a repository file under a private name answers for nothing anywhere ... ok (133ms) + PC8: two sites are two conversations, and a default directory is handed back ... ok (81ms) + PC9: a completed authorship restores from the enclosing journal ... ok (94ms) + PC10: the turns belong to the enclosing journal, and no private one exists ... ok (50ms) + PC11: a Plan declaring required properties is admitted and returned ... ok (51ms) + PC12: a Plan that is not structurally a program binds nothing ... ok (58ms) + PC13: stopping is the Component's own ending, in its component words ... ok (50ms) + PC15: an omitted session's directory is handed back after teardown ... ok (50ms) + PC16: an authored session's directory is still there afterwards ... ok (47ms) + PC17: the same site and name continue the same placement ... ok (94ms) + PC18: two sites writing one name are two conversations ... ok (77ms) + PC19: the emitted source survives the CLI's own output normalization ... ok (51ms) + PO4: neither ordinary form emits a planning phase, whatever verbosity says ... ok (200ms) + PC20: the retained artifact carries the approved bytes and their digest ... ok (50ms) + PC21: a stopped Plan leaves no artifact for a later evaluation to begin from ... ok (49ms) + PC22: a completed Plan restores without authoring or admitting it again ... ok (90ms) + PC23: a continuation replays the retained root, so a changed body never runs ... ok (89ms) + PC24: instructions that render differently refuse in the frozen inputs ... ok (77ms) + PC25: a retained inputs record this version cannot read produces nothing ... ok (209ms) + PC27: the Plan's syntax record is core's closed record, and a hostile one produces nothing ... ok (179ms) + PC26: a retained artifact this version cannot read produces nothing ... ok (500ms) + PC14: nothing the Component does reaches the caller's filesystem ... ok (45ms) +Tier PC — in an ordinary document ... ok (3s) +Tier FE — Plan produces text, Evaluate runs it ... + FE22: the approved bytes are inert text `` then runs ... ok (51ms) + FE22: an approved program is not run when no `` is written ... ok (45ms) + FE8: a Plan inside `` is told the admitted vocabulary alone ... ok (59ms) + FE8: a fragment naming the wide-only component refuses with no operation ... ok (58ms) + FE9: a deferred Plan keeps its own site's wider vocabulary ... ok (61ms) + FE9: a later narrower Evaluate refuses text the wider site allowed ... ok (57ms) +Tier FE — Plan produces text, Evaluate runs it ... ok (331ms) +Tier MDK — the Plan declarations state their kind ... + MDK2: both constructors state kind component for the same packaged bytes ... ok (9ms) +Tier MDK — the Plan declarations state their kind ... ok (9ms) +running 1 test from ./packages/cli/tests/plan-host-acts.test.ts +Tier PH — the acts xmd plan performs as the host ... + PH1: opening the review form reaches a command the document cannot ... ok (271ms) +Tier PH — the acts xmd plan performs as the host ... ok (273ms) +running 1 test from ./packages/cli/tests/plan.test.ts +Tier PR — xmd plan writing a Plan ... + C2, C3, C14: the packaged program's own words ask for the document ... ok (264ms) + C3, C14: every turn that asks for a Plan states the whole requirement ... ok (196ms) + C4: one Session carries every turn, and --session names it ... ok (727ms) + C4, C13: a default session's directory belongs to its invocation ... +------- post-test output ------- +xmd plan stopped at your request. Nothing was output. +agent prompt failed with stop reason "refusal" +----- post-test output end ----- + C4, C13: a default session's directory belongs to its invocation ... ok (560ms) + C13: a default directory is handed back before final admission ... ok (76ms) + C4, C13: the namespace is the command's own, and the retired one is untouched ... +------- post-test output ------- +xmd plan stopped at your request. Nothing was output. +----- post-test output end ----- + C4, C13: the namespace is the command's own, and the retired one is untouched ... ok (211ms) + C5: the Plan writer profile's ceiling is the host's, and no flag widens it ... +------- post-test output ------- +the agent asked for permission to use a native tool, which this host grants to no agent. The request was denied and the turn it belongs to failed. +----- post-test output end ----- + C5: the Plan writer profile's ceiling is the host's, and no flag widens it ... ok (232ms) + C5: two cases' profile roots cannot see or remove one another ... ok (138ms) + C6: a candidate is inert until the approved document runs ... +------- post-test output ------- +xmd plan stopped at your request. Nothing was output. +----- post-test output end ----- + C6: a candidate is inert until the approved document runs ... ok (67ms) + C7: a candidate defect earns a repair turn ... ok (436ms) + C8: one base draft, three repairs, and ten presentations ... +------- post-test output ------- +xmd plan stopped at your request. Nothing was output. +xmd plan stopped at your request. Nothing was output. +----- post-test output end ----- + C8: one base draft, three repairs, and ten presentations ... ok (481ms) + C9: arbitrary source cannot close the presentation, and stopping is authored ... ok (860ms) + C3, C9: a tenth draft that cannot be repaired is explained automatically ... ok (635ms) + C10, C11: the approved bytes are what the command delivers ... +------- post-test output ------- +xmd plan stopped at your request. Nothing was output. +----- post-test output end ----- + C10, C11: the approved bytes are what the command delivers ... ok (219ms) + C10: the host's own gate refuses after the command document has settled ... ok (142ms) + C14: an interleaved Plan survives approval and delivery byte for byte ... ok (143ms) + C3, C9: what you read says each thing once, however many rounds it took ... ok (433ms) +Tier PR — xmd plan writing a Plan ... ok (5s) +running 9 tests from ./packages/cli/tests/plugin-cli.test.ts +PC1 — selected Plugins compose around the document, in the order written ... + nests two wrappers with the first one written outermost ... +------- post-test output ------- +one open + +two open + +document body + + +two close + + +one close +----- post-test output end ----- + nests two wrappers with the first one written outermost ... ok (733ms) + reverses the composition when the selection is reversed ... +------- post-test output ------- +two open + +one open + +document body + + +one close + + +two close +----- post-test output end ----- + reverses the composition when the selection is reversed ... ok (723ms) + projects the document once for each placeholder a wrapper writes ... +------- post-test output ------- +document body + + +document body + +----- post-test output end ----- + projects the document once for each placeholder a wrapper writes ... ok (717ms) + shows every Plugin the complete list, in the order it was written ... +------- post-test output ------- +active: @executablemd/git, active, wrapper-one + +one open + +document body + + +one close +----- post-test output end ----- + shows every Plugin the complete list, in the order it was written ... ok (718ms) + composes the root's metadata without touching anything else ... +------- post-test output ------- + +badge is authored + +badge is composed +----- post-test output end ----- + composes the root's metadata without touching anything else ... ok (1s) +PC1 — selected Plugins compose around the document, in the order written ... ok (4s) +PC2 — a Plugin declares components, and a checkout cannot answer for them ... + resolves a declared component, and leaves the checkout's own components alone ... +------- post-test output ------- +hello from the selected Plugin + + +the selected declaration, not the checkout's + + +an unrelated checkout component + +----- post-test output end ----- + resolves a declared component, and leaves the checkout's own components alone ... ok (908ms) + refuses two Plugins declaring one component name, before the document runs ... +------- post-test output ------- +"Greeting" was declared as Markdown twice. One execution declares a name once. +----- post-test output end ----- + refuses two Plugins declaring one component name, before the document runs ... ok (842ms) +PC2 — a Plugin declares components, and a checkout cannot answer for them ... ok (1s) +PC3 — a selection that cannot be honored costs nothing ... + refuses a module that exports no Plugin ... +------- post-test output ------- +--plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/no-default.mjs: a Plugin module's default export is a Plugin value; this module exports none +----- post-test output end ----- + refuses a module that exports no Plugin ... ok (813ms) + refuses a default export carrying no name ... +------- post-test output ------- +--plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/unnamed.mjs: a Plugin module's default export carries a non-empty string `name` +----- post-test output end ----- + refuses a default export carrying no name ... ok (592ms) + refuses a default export whose install is not callable ... +------- post-test output ------- +--plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/bad-install.mjs: a Plugin module's default export carries a callable `install`, and bad-install carries string +----- post-test output end ----- + refuses a default export whose install is not callable ... ok (600ms) + refuses a module that is not there ... +------- post-test output ------- +--plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/absent.mjs could not be loaded: Module not found "file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/absent.mjs". +----- post-test output end ----- + refuses a module that is not there ... ok (664ms) + refuses two selections claiming one Plugin name ... +------- post-test output ------- +two selected Plugins are named wrapper-one. A Plugin name identifies one Plugin to this command, so the selection is refused before any of them is installed. +----- post-test output end ----- + refuses two selections claiming one Plugin name ... ok (595ms) + refuses a remote specifier without fetching anything ... +------- post-test output ------- +--plugin https://example.invalid/plugin.mjs could not be loaded: --plugin https://example.invalid/plugin.mjs names a remote module, and xmd loads no code over the network. Name a package installed where this command is running, or a path to a module on this filesystem. +----- post-test output end ----- + refuses a remote specifier without fetching anything ... ok (660ms) + refuses a selection with no value ... +------- post-test output ------- +--plugin names a module to load — write `--plugin ` or `--plugin=` +----- post-test output end ----- + refuses a selection with no value ... ok (656ms) +PC3 — a selection that cannot be honored costs nothing ... ok (4s) +PC4 — nothing is discovered, and nothing unselected runs ... + loads no external module when none was selected ... +------- post-test output ------- +document body +----- post-test output end ----- + loads no external module when none was selected ... ok (778ms) + leaves an unselected module beside a selected one inert ... +------- post-test output ------- +one open + +document body + + +one close +----- post-test output end ----- + leaves an unselected module beside a selected one inert ... ok (761ms) + loads nothing for help or the version ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +0.13.1 +----- post-test output end ----- + loads nothing for help or the version ... ok (1s) + describes the option in its own help ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + describes the option in its own help ... ok (576ms) +PC4 — nothing is discovered, and nothing unselected runs ... ok (3s) +PC5 — a Plugin reads configuration, never document properties ... + reads every Config value the command line settled ... +------- post-test output ------- +verbose: false +timeout: undefined +timeoutExec: undefined +timeoutFetch: undefined + +document body +[yield] import_component:__root__ → ok { path: 'doc.md' } +[close] root → ok +verbose: true +timeout: 30000 +timeoutExec: 10000 +timeoutFetch: 5000 + +document body +----- post-test output end ----- + reads every Config value the command line settled ... ok (1s) + leaves root properties spelled like CLI options out of the configuration ... +------- post-test output ------- +verbose: false +timeout: undefined +timeoutExec: undefined +timeoutFetch: undefined + + +props are yes and 99s +----- post-test output end ----- + leaves root properties spelled like CLI options out of the configuration ... ok (870ms) +PC5 — a Plugin reads configuration, never document properties ... ok (2s) +PC6 — every surface of one command sees one vocabulary ... + describes a selected Plugin's declarations in xmd syntax ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `fixture/declaring/Greeting.md` (declared Markdown) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `fixture/declaring/Shadowed.md` (declared Markdown) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. +----- post-test output end ----- + describes a selected Plugin's declarations in xmd syntax ... ok (800ms) + describes the bundled vocabulary, and no unselected Plugin's, by default ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. +----- post-test output end ----- + describes the bundled vocabulary, and no unselected Plugin's, by default ... ok (805ms) + describes a structural construct a Plugin declared, and expands it in a run ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Frame the lines written inside it. + +**Syntax:** + +```md +… +``` + +**Forms:** `…` + +**Placement:** written wherever a document may write structure. + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The lines this banner frames. + +**Origin:** `fixture/structural` (installed structural syntax) + +### `` + +One line of a banner. + +**Syntax:** + +```md +… +``` + +**Forms:** `…` + +**Placement:** written directly inside ``, and nowhere else. + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The line's own content. + +**Origin:** `fixture/structural` (installed structural syntax) + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. +structural-fixture: expanded framed + +----- post-test output end ----- + describes a structural construct a Plugin declared, and expands it in a run ... ok (1s) + describes none of that construct where the Plugin was not selected ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. +----- post-test output end ----- + describes none of that construct where the Plugin was not selected ... ok (781ms) +PC6 — every surface of one command sees one vocabulary ... ok (3s) +PC9 — the review graph arrives only when it is selected ... + is absent from every command that would run it, until it is named ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. +Failed to import component Finding: Cannot resolve component: Finding (searched: components, .) +----- post-test output end ----- + is absent from every command that would run it, until it is named ... ok (1s) + arrives for run and syntax when it is named ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Flag new files whose names suggest a speculative abstraction. `` reports created TypeScript files named like factories, adapters or helpers, so a reviewer can ask what consumes them. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `pattern` | `string` | no | | +| `severity` | `string` | no | | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "pattern": { + "type": "string", + "default": "factory|abstract|base|provider|strategy|adapter|helper|util" + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string", + "default": "New abstraction files: {names}. Verify 3+ consumers." + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/AbstractionNames.md` (declared Markdown) + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Report structural bloat in a pull request. `` renders a Structural section covering unreferenced type and interface declarations, `any` density, empty function bodies, console statements and the sensor's structural signals. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `diagnostics` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "diagnostics": { + "type": "object" + } + }, + "required": [ + "pr", + "diagnostics" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/policies/BloatPolicy.md` (declared Markdown) + +### `` + +File and retire GitHub issues for the repository's worst cleanup clusters. `` keeps one labelled issue per file in the top five and closes the ones that dropped out. It does nothing without `GITHUB_TOKEN` and `GITHUB_REPOSITORY`. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `cleanupAnalysis` | `object` | yes | | +| `diagnostics` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "cleanupAnalysis": { + "type": "object" + }, + "diagnostics": { + "type": "object" + } + }, + "required": [ + "cleanupAnalysis", + "diagnostics" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/CleanupIssues.md` (declared Markdown) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Review the pull request's code comments for ones that only restate the code. `` asks the model in scope which are redundant, reads replies to earlier suggestions, and renders what remains outstanding. When findings remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/CommentReview.md` (declared Markdown) + +### `` + +Collect the pull request's existing review comments and replies. `` prepares the pairs and prior finding state used by review classification. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**`as`:** The normalized review-comment pairs, previous findings, and reply groups. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "pairs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "comment": { + "type": "string" + }, + "code": { + "type": "string" + }, + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + } + }, + "required": [ + "comment", + "code", + "file", + "lineNumber" + ], + "additionalProperties": false + } + }, + "hasPairs": { + "type": "boolean" + }, + "pairsText": { + "type": "string" + }, + "previousFindings": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + } + }, + "required": [ + "file", + "lineNumber" + ], + "additionalProperties": false + } + }, + "dismissedReplies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "botCommentId": { + "type": "number" + }, + "replyText": { + "type": "string" + }, + "replyId": { + "type": "number" + }, + "alreadyProcessed": { + "type": "boolean" + } + }, + "required": [ + "file", + "lineNumber", + "replyText" + ], + "additionalProperties": false + } + }, + "repliesForClassification": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "botCommentId": { + "type": "number" + }, + "replyText": { + "type": "string" + }, + "replyId": { + "type": "number" + }, + "alreadyProcessed": { + "type": "boolean" + } + }, + "required": [ + "file", + "lineNumber", + "replyText" + ], + "additionalProperties": false + } + }, + "hasRepliesToClassify": { + "type": "boolean" + }, + "repliesText": { + "type": "string" + } + }, + "required": [ + "pairs", + "hasPairs", + "pairsText", + "previousFindings", + "dismissedReplies", + "repliesForClassification", + "hasRepliesToClassify", + "repliesText" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +Build the pending review-comment update from classified review data. `` decides which findings and dismissals remain. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `data` | `object` | yes | | +| `classificationResult` | `string` | yes | | +| `sampleResult` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "data": { + "type": "object" + }, + "classificationResult": { + "type": "string", + "default": "" + }, + "sampleResult": { + "type": "string", + "default": "" + } + }, + "required": [ + "pr", + "data", + "classificationResult", + "sampleResult" + ], + "additionalProperties": false +} +``` + +**`as`:** The checklist text, pending findings, and new dismissal replies. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "hasChecklist": { + "type": "boolean" + }, + "checklistMd": { + "type": "string" + }, + "hasFindings": { + "type": "boolean" + }, + "pendingFindings": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "code": { + "type": "string" + } + }, + "required": [ + "comment", + "code", + "file", + "lineNumber" + ], + "additionalProperties": false + } + }, + "newDismissReplies": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "lineNumber": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "botCommentId": { + "type": "number" + }, + "replyText": { + "type": "string" + }, + "replyId": { + "type": "number" + }, + "alreadyProcessed": { + "type": "boolean" + } + }, + "required": [ + "file", + "lineNumber", + "replyText" + ], + "additionalProperties": false + } + } + }, + "required": [ + "hasChecklist", + "checklistMd", + "hasFindings", + "pendingFindings", + "newDismissReplies" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +Flag a change that mixes configuration and source edits. `` reports when both appear in a pull request larger than `minFiles`. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `minFiles` | `number` | no | | +| `severity` | `string` | no | | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "minFiles": { + "type": "number", + "default": 5 + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string", + "default": "PR mixes config and source changes." + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/ConfigSourceMix.md` (declared Markdown) + +### `` + +Answer this document's `` calls from DeepInfra. `…` handles samples that name that model and samples that name none, and passes the rest outward. It requires `DEEPINFRA_TOKEN`. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `model` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "model": { + "type": "string" + } + }, + "required": [ + "model" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose samples this provider answers. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/DeepInfraProvider.md` (declared Markdown) + +### `` + +Require a pull-request description that explains the change. `` reports a body shorter than `minLength`. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `minLength` | `number` | no | | +| `severity` | `string` | no | | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "minLength": { + "type": "number", + "default": 50 + }, + "severity": { + "type": "string", + "default": "error" + }, + "message": { + "type": "string", + "default": "PR description must explain what and why." + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/DescriptionCheck.md` (declared Markdown) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Inspect whether the checkout is ready for review analysis. `` reports pinned tool availability, TypeScript support, analyzed files, and actionable setup guidance. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `tsconfigPath` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "tsconfigPath": { + "type": "string", + "default": ".reviews/tsconfig.oxlint.json" + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**`as`:** The checkout readiness report used by review and repository analysis. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "oxlintInstalled": { + "type": "boolean" + }, + "oxlintVersion": { + "type": "string" + }, + "tsgolintInstalled": { + "type": "boolean" + }, + "tsgolintVersion": { + "type": "string" + }, + "tsconfigExists": { + "type": "boolean" + }, + "nodeModulesExists": { + "type": "boolean" + }, + "typeAwareAvailable": { + "type": "boolean" + }, + "filesAnalyzed": { + "type": "number" + }, + "filesSkipped": { + "type": "number" + }, + "importErrors": { + "type": "number" + }, + "availableRuleIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "bloatRulesAvailable": { + "type": "array", + "items": { + "type": "string" + } + }, + "bloatRulesMissing": { + "type": "array", + "items": { + "type": "string" + } + }, + "recommendation": { + "type": "string" + }, + "nativeSpecifiers": { + "type": "object", + "properties": { + "count": { + "type": "number" + }, + "files": { + "type": "array", + "items": { + "type": "string" + } + }, + "jsr": { + "type": "number" + }, + "npm": { + "type": "number" + } + }, + "required": [ + "count", + "files", + "jsr", + "npm" + ], + "additionalProperties": false + } + }, + "required": [ + "oxlintInstalled", + "oxlintVersion", + "tsgolintInstalled", + "tsgolintVersion", + "tsconfigExists", + "nodeModulesExists", + "typeAwareAvailable", + "filesAnalyzed", + "filesSkipped", + "importErrors", + "availableRuleIds", + "bloatRulesAvailable", + "bloatRulesMissing", + "recommendation", + "nativeSpecifiers" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Install the review's pinned Oxlint and tsgolint binaries. `` downloads them into the sensor directory and verifies each against a known checksum, so a review measures the version it expects. It fails on a platform it ships no build for. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `dir` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "dir": { + "type": "string", + "default": ".reviews/.oxlint" + } + }, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/EnsureOxlint.md` (declared Markdown) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Review a pull request for code that should not be there. `` asks the model in scope to weigh the sensor's violation density against the specific patterns behind it, and skips changes of twenty lines or fewer. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `diagnostics` | `object` | yes | | +| `doctor` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "diagnostics": { + "type": "object" + }, + "doctor": { + "type": "object" + } + }, + "required": [ + "pr", + "diagnostics", + "doctor" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/policies/ExtraneousCodePolicy.md` (declared Markdown) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Report one review finding. `` renders a severity icon and the message when `when` holds, and nothing when it does not — so a rule can be written unconditionally and stay quiet. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `when` | `boolean` | yes | | +| `severity` | `string` | no | | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "when": { + "type": "boolean" + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string" + } + }, + "required": [ + "when", + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Finding.md` (declared Markdown) + +### `` + +Reformat its content as Markdown. `…` renders the content, normalizes it through remark and trims the result. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown to reformat. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Format.md` (declared Markdown) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Authorize the GitHub requests made inside it. `…` adds a bearer token to requests to `api.github.com` over HTTPS and leaves every other host untouched. Without `GITHUB_TOKEN` it adds nothing and the requests still run. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose GitHub requests are authorized. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/GitHubAuth.md` (declared Markdown) + +### `` + +Publish the review as one comment on the pull request. `…` posts its content the first time and edits that same comment afterwards, so repeated runs leave one comment rather than a thread. It requires `GITHUB_REPOSITORY` and `PR_NUMBER`. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `marker` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "marker": { + "type": "string", + "default": "" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The comment body. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/GitHubComment.md` (declared Markdown) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Add a system prompt to the `` calls inside it. `…` appends to whatever instruction is already in scope, so an enclosing instruction is read first and nesting narrows rather than replaces. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `system` | `string` | yes | System prompt text. When Sample calls are made within this component's children, the text is included in the SampleContext.system field, which providers use as the system prompt. Multiple Instruction components accumulate — instructions from enclosing scopes appear first, inner instructions are appended. | + +```json +{ + "type": "object", + "properties": { + "system": { + "type": "string", + "description": "System prompt text. When Sample calls are made within this component's children, the text is included in the SampleContext.system field, which providers use as the system prompt. Multiple Instruction components accumulate — instructions from enclosing scopes appear first, inner instructions are appended.\n" + } + }, + "required": [ + "system" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose samples carry this instruction. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Instruction.md` (declared Markdown) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask a large change to link an issue. `` reports when the description names no issue and the change is bigger than that. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `whenLinesExceed` | `number` | no | | +| `severity` | `string` | no | | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "whenLinesExceed": { + "type": "number", + "default": 0 + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string", + "default": "Large PR with no linked issue." + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/LinkedIssue.md` (declared Markdown) + +### `` + +Ask a change that edits `package.json` to account for its dependencies. `` reports when the manifest moved and the description never mentions dependencies. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `severity` | `string` | no | | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string", + "default": "package.json changed without dependency justification." + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/NewDependencies.md` (declared Markdown) + +### `` + +Answer this document's `` calls from a local Ollama server. `…` handles samples that name that model and samples that name none, and passes the rest outward. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `model` | `string` | yes | | +| `baseUrl` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "model": { + "type": "string" + }, + "baseUrl": { + "type": "string", + "default": "http://localhost:11434" + } + }, + "required": [ + "model" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose samples this provider answers. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/OllamaProvider.md` (declared Markdown) + +### `` + +Write the TypeScript configuration the Oxlint sensor's type-aware pass reads. `` generates it in the checkout, so a type-aware run has a project to resolve against. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "default": ".reviews/tsconfig.oxlint.json" + } + }, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/OxlintConfig.md` (declared Markdown) + +### `` + +Run the review's pinned Oxlint sensor over selected files. `` returns normalized diagnostics and fails on a sensor crash or unusable output. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `files` | `array` | yes | | +| `typeAware` | `boolean` | no | | +| `tsconfigPath` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "files": { + "type": "array", + "items": { + "type": "string" + } + }, + "typeAware": { + "type": "boolean", + "default": false + }, + "tsconfigPath": { + "type": "string", + "default": ".reviews/tsconfig.oxlint.json" + } + }, + "required": [ + "files" + ], + "additionalProperties": false +} +``` + +**`as`:** The normalized Oxlint diagnostics for the selected files. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "ruleId": { + "type": "string" + }, + "severity": { + "type": "string" + }, + "file": { + "type": "string" + }, + "line": { + "type": "number" + }, + "column": { + "type": "number" + } + }, + "required": [ + "message", + "ruleId", + "severity", + "file", + "line", + "column" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +List one category of Oxlint diagnostics. `` names each rule with how often it fired and the first few files, and renders nothing when the category is empty. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `groups` | `array` | yes | | +| `label` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "groups": { + "type": "array" + }, + "label": { + "type": "string" + } + }, + "required": [ + "groups", + "label" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/OxlintSignals.md` (declared Markdown) + +### `` + +Report what the Oxlint sensor found. `` renders a Static Analysis section that says the sensor was unavailable rather than reporting a clean run it never measured, and notes type- aware rules that could not run. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `diagnostics` | `object` | yes | | +| `doctor` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "diagnostics": { + "type": "object" + }, + "doctor": { + "type": "object" + } + }, + "required": [ + "diagnostics", + "doctor" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/OxlintSummary.md` (declared Markdown) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Report added lines matching a regular expression. `` renders once at least `min` lines match, and substitutes the count into `{count}`. Test files are excluded unless `excludeTests` says otherwise. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `pattern` | `string` | yes | | +| `min` | `number` | no | | +| `excludeTests` | `boolean` | no | | +| `severity` | `string` | no | | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "min": { + "type": "number", + "default": 1 + }, + "excludeTests": { + "type": "boolean", + "default": true + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string" + } + }, + "required": [ + "pr", + "pattern", + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Pattern.md` (declared Markdown) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Compose the whole pull-request review. `` renders the scope, structural, slop, static-analysis and correctness sections under one heading. When redundant comments remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `diagnostics` | `object` | yes | | +| `doctor` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "diagnostics": { + "type": "object" + }, + "doctor": { + "type": "object" + } + }, + "required": [ + "pr", + "diagnostics", + "doctor" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/PrPolicyReport.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Report when one pattern is too common relative to another. `` stays quiet until the denominator has at least `minDenominator` matches, so a small diff cannot trip it on one line. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `numerator` | `string` | yes | | +| `denominator` | `string` | yes | | +| `threshold` | `number` | yes | | +| `minDenominator` | `number` | no | | +| `excludeTests` | `boolean` | no | | +| `severity` | `string` | no | | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "numerator": { + "type": "string" + }, + "denominator": { + "type": "string" + }, + "threshold": { + "type": "number" + }, + "minDenominator": { + "type": "number", + "default": 10 + }, + "excludeTests": { + "type": "boolean", + "default": true + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string" + } + }, + "required": [ + "pr", + "numerator", + "denominator", + "threshold", + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Ratio.md` (declared Markdown) + +### `` + +Warn when release configuration changes without its specification. `` renders a warning if any release file changed and `specs/release-process-spec.md` did not. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `files` | `array` | yes | | + +```json +{ + "type": "object", + "properties": { + "files": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "files" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/ReleaseSpecWarning.md` (declared Markdown) + +### `` + +Explain the repository's top cleanup clusters. `` asks the model in scope why each already-ranked cluster matters and what to do about it, rather than re-ranking them. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `diagnostics` | `object` | yes | | +| `doctor` | `object` | yes | | +| `fileList` | `string` | yes | | +| `cleanupAnalysis` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "diagnostics": { + "type": "object" + }, + "doctor": { + "type": "object" + }, + "fileList": { + "type": "string" + }, + "cleanupAnalysis": { + "type": "object" + } + }, + "required": [ + "diagnostics", + "doctor", + "fileList" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/policies/RepoCleanupPolicy.md` (declared Markdown) + +### `` + +Compose the whole repository analysis. `` renders the static-analysis and cleanup sections. With the configured GitHub environment, it also creates, updates and closes cleanup issues for the five highest-ranked file clusters. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `diagnostics` | `object` | yes | | +| `doctor` | `object` | yes | | +| `fileList` | `string` | yes | | +| `fileCount` | `number` | yes | | +| `lineCount` | `number` | yes | | +| `cleanupAnalysis` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "diagnostics": { + "type": "object" + }, + "doctor": { + "type": "object" + }, + "fileList": { + "type": "string" + }, + "fileCount": { + "type": "number" + }, + "lineCount": { + "type": "number" + }, + "cleanupAnalysis": { + "type": "object" + } + }, + "required": [ + "diagnostics", + "doctor", + "fileList", + "fileCount", + "lineCount" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/RepoPolicyReport.md` (declared Markdown) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Inventory the repository source used by repository analysis. `` returns the selected paths and their file and line totals. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** The selected source paths and their file and line totals. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "fileList": { + "type": "array", + "items": { + "type": "string" + } + }, + "fileCount": { + "type": "number" + }, + "lineCount": { + "type": "number" + } + }, + "required": [ + "fileList", + "fileCount", + "lineCount" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +Build review context for the configured base and head revisions. `` returns pull-request metadata and changed file paths from the local Git checkout. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** The pull-request data and changed file paths for the configured revision range. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "changedFilePaths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "pr", + "changedFilePaths" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/code-review-agent` (reserved registration) + +### `` + +Render one section of a review, or say it found nothing. `…` prints the heading with whatever its content rendered, and prints the `clean` message when the content rendered nothing — so a section of quiet rules reads as a pass rather than as a blank. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `heading` | `string` | yes | | +| `clean` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "heading": { + "type": "string" + }, + "clean": { + "type": "string", + "default": "✅ No issues found." + } + }, + "required": [ + "heading" + ], + "additionalProperties": false +} +``` + +**Body context:** The findings that belong to this section. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/ReviewSection.md` (declared Markdown) + +### `` + +Prepare the checkout for a review run. `` installs the pinned Oxlint sensor and writes its configuration; with `pullModel` it also provisions the local Ollama model first. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pullModel` | `boolean` | no | | +| `model` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "pullModel": { + "type": "boolean", + "default": false + }, + "model": { + "type": "string", + "default": "qwen3:30b-a3b" + } + }, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/ReviewSetup.md` (declared Markdown) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask the model in scope for text. `Summarize what changed.` sends its content, or the `prompt` when written self-closing, to whichever provider is installed — and `model` picks between providers when more than one is. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `prompt` | `string` | no | Text prompt to send to the Sample Api. Used in self-closing mode when no children are provided. If both children and prompt are present, children output takes precedence. | +| `model` | `string` | no | Model routing key. When set, the SampleContext.model field is populated so the Sample Api middleware can route to a specific provider. When unset, the innermost active provider handles the call. | +| `params` | `string` | no | Additional instruction params passed to the Sample Api middleware as SampleContext.params. Providers can use this for custom behavior (e.g., "brief", "json", "classify"). | + +```json +{ + "type": "object", + "properties": { + "prompt": { + "type": "string", + "default": "", + "description": "Text prompt to send to the Sample Api. Used in self-closing mode when no children are provided. If both children and prompt are present, children output takes precedence.\n" + }, + "model": { + "type": "string", + "default": "", + "description": "Model routing key. When set, the SampleContext.model field is populated so the Sample Api middleware can route to a specific provider. When unset, the innermost active provider handles the call.\n" + }, + "params": { + "type": "string", + "default": "", + "description": "Additional instruction params passed to the Sample Api middleware as SampleContext.params. Providers can use this for custom behavior (e.g., \"brief\", \"json\", \"classify\").\n" + } + }, + "additionalProperties": false +} +``` + +**`as`:** The model's reply. + +**Body context:** The prompt. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Sample.md` (declared Markdown) + +### `` + +Report the scope and hygiene of a pull request. `` renders a Scope section covering size, file and directory counts, description length, issue linkage and config/source mixing. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + } + }, + "required": [ + "pr" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/policies/ScopePolicy.md` (declared Markdown) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Report verbosity indicators in a pull request. `` renders a Slop section covering comment ratio, comments that restate the code, and the sensor's verbosity signals. When redundant comments remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `diagnostics` | `object` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "diagnostics": { + "type": "object" + } + }, + "required": [ + "pr", + "diagnostics" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/policies/SlopPolicy.md` (declared Markdown) + +### `` + +Reconcile the review's removal suggestions on the pull request. `` deletes previous bot reviews when GitHub permits it, acknowledges declined suggestions and resolves their threads, then posts pending findings as a new review. It does nothing without the required GitHub environment. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `findings` | `array` | yes | | +| `dismissedReplies` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "findings": { + "type": "array" + }, + "dismissedReplies": { + "type": "array", + "default": [] + } + }, + "required": [ + "findings" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/SuggestRemoval.md` (declared Markdown) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Drop a model's reasoning from its answers. `…` removes `` blocks from every `` reply inside it, including an unterminated one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose samples are filtered. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/ThinkFilter.md` (declared Markdown) + +### `` + +Report when a pull-request metric crosses a limit. `` compares one of `totalChanges`, `totalFiles`, `additions`, `deletions` or `directories`, and substitutes `{actual}` and `{value}` into the message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `metric` | `string` | yes | | +| `op` | `string` | yes | | +| `value` | `number` | yes | | +| `severity` | `string` | no | | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "metric": { + "type": "string" + }, + "op": { + "type": "string" + }, + "value": { + "type": "number" + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string" + } + }, + "required": [ + "pr", + "metric", + "op", + "value", + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/Threshold.md` (declared Markdown) + +### `` + +Report declarations the change adds and nothing references. `` scans added TypeScript for that keyword where a declaration starts, so an import specifier naming the same keyword is not mistaken for one. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `pr` | `object` | yes | | +| `construct` | `string` | yes | | +| `severity` | `string` | no | | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "pr": { + "type": "object" + }, + "construct": { + "type": "string" + }, + "severity": { + "type": "string", + "default": "warning" + }, + "message": { + "type": "string" + } + }, + "required": [ + "pr", + "construct", + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/code-review-agent/components/UnusedInDiff.md` (declared Markdown) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +No components were found in the configured includes. + + + + +🔴 probe + + + +----- post-test output end ----- + arrives for run and syntax when it is named ... ok (1s) + names itself by its own name, however it was reached ... +------- post-test output ------- +active: @executablemd/git, @executablemd/code-review-agent, active + +document body +----- post-test output end ----- + names itself by its own name, however it was reached ... ok (819ms) +PC9 — the review graph arrives only when it is selected ... ok (4s) +PC7 — a package is selected by name, from where the command runs ... + loads a bare package from the invocation directory, named by its own name ... +------- post-test output ------- +selected-package: loaded +selected-package: installed for run +active: @executablemd/git, renamed-by-its-author, active + +document body +----- post-test output end ----- + loads a bare package from the invocation directory, named by its own name ... ok (774ms) + leaves an installed package inert until it is named ... +------- post-test output ------- +document body +----- post-test output end ----- + leaves an installed package inert until it is named ... ok (973ms) + loads a relative path inside the directory the command runs in ... +------- post-test output ------- +project-local: loaded +project-local: installed for run +document body +----- post-test output end ----- + loads a relative path inside the directory the command runs in ... ok (760ms) + loads a relative path inside this repository, written from its root ... +------- post-test output ------- +external-fixture: loaded +external-fixture: installed for run +external-fixture: argv ["run","--plugin","./packages/cli/tests/fixtures/plugins/external.mjs","--eval","document body\n"] +document body +----- post-test output end ----- + loads a relative path inside this repository, written from its root ... ok (776ms) +PC7 — a package is selected by name, from where the command runs ... ok (3s) +PC8 — an Api built under the bare public name intercepts nothing ... + leaves the document unwrapped and the run unchanged ... +------- post-test output ------- +document body +----- post-test output end ----- + leaves the document unwrapped and the run unchanged ... ok (739ms) + still composes with a Plugin that reached the canonical key ... +------- post-test output ------- +one open + +document body + + +one close +----- post-test output end ----- + still composes with a Plugin that reached the canonical key ... ok (761ms) +PC8 — an Api built under the bare public name intercepts nothing ... ok (1s) +running 9 tests from ./packages/cli/tests/plugin-host.test.ts +PH1 — the list installs once, in order ... + calls each install in selection order ... ok (3ms) + skips a Plugin that installs nothing without disturbing the order ... ok (0ms) + shows every Plugin the complete list, including the first one ... ok (1ms) + carries the command and the original argv into every request ... ok (0ms) +PH1 — the list installs once, in order ... ok (7ms) +PH2 — one name, one Plugin ... + refuses two selections claiming one name ... ok (1ms) + refuses before the first install rather than after the second ... ok (1ms) + admits distinct names loaded from anywhere ... ok (0ms) +PH2 — one name, one Plugin ... ok (1ms) +PH3 — an installation has the command's lifetime ... + unwinds the Plugins installed before one that failed ... ok (1ms) +PH3 — an installation has the command's lifetime ... ok (1ms) +PH3b — cancellation unwinds what was installed ... + releases the Plugins already installed when the command is halted ... ok (1ms) + leaves the established teardown-failure precedence exactly as it was ... ok (1ms) +PH3b — cancellation unwinds what was installed ... ok (1ms) +PH4 — what an installation contributes crosses as one execution installation ... + carries components, structural syntax, its bound expand and admissions on one ... ok (1ms) + contributes no installation for a Plugin that returned nothing ... ok (0ms) + contributes nothing at all where no Plugin was selected ... ok (1ms) +PH4 — what an installation contributes crosses as one execution installation ... ok (1ms) +PH5 — a Plugin reads the command's typed configuration ... + sees the parsed verbosity the command installed, through runtime's /api ... ok (0ms) +PH5 — a Plugin reads the command's typed configuration ... ok (737µs) +PH6 — the selected review Plugin claims the commands that run a review ... + declares the thirty-five Markdown components for run, syntax and plan ... ok (133ms) + declares them for a workflow action that executes a document ... ok (94ms) + declares none for the test root, upgrade, or a workflow management action ... ok (1ms) + reads an option's value as a value, never as the action ... ok (112ms) + contributes nothing at all when it is not in the list ... ok (1ms) + registers the six reserved names where it claims the graph ... ok (28ms) + registers none of them where no Plugin was selected ... ok (1ms) + registers none of them for the test root ... ok (0ms) +PH6 — the selected review Plugin claims the commands that run a review ... ok (371ms) +PH7 — a structural-only Plugin reaches every consumer of the catalog ... + retains both arms of what it declared, not the Markdown half ... ok (0ms) + describes the construct in the symbols xmd syntax renders ... ok (87ms) + accepts a candidate that writes the construct, under Plan validation ... ok (61ms) + refuses the same candidate when nothing declared the construct ... ok (54ms) +PH7 — a structural-only Plugin reaches every consumer of the catalog ... ok (202ms) +PH8 — an incomplete structural half never reaches a command ... + refuses structural declarations with no handler, at installation ... ok (1ms) + refuses a handler with no structural declarations, at installation ... ok (0ms) + stops before xmd syntax can advertise the construct ... ok (74ms) + stops before Plan validation can accept the construct ... ok (0ms) + unwinds the Plugins installed before the incomplete one ... ok (0ms) +PH8 — an incomplete structural half never reaches a command ... ok (75ms) +running 3 tests from ./packages/cli/tests/plugin-modules.test.ts +PM1 — a Windows path is a path, on every host ... + reads a drive prefix as a filesystem path rather than a scheme ... ok (2ms) + does not refuse one as remote ... ok (0ms) + still reads a bare drive letter with no separator as a scheme ... ok (0ms) +PM1 — a Windows path is a path, on every host ... ok (8ms) +PM2 — every other specifier keeps the answer it had ... + classifies relative paths ... ok (1ms) + classifies POSIX absolute paths and UNC shares ... ok (0ms) + classifies file URLs apart from paths, because they resolve differently ... ok (0ms) + classifies bare package specifiers ... ok (0ms) + classifies real remote schemes as remote ... ok (1ms) +PM2 — every other specifier keeps the answer it had ... ok (2ms) +PM3 — resolution follows the classification ... + resolves a relative path from the invocation directory ... ok (0ms) + keeps a file URL as it was written ... ok (0ms) + refuses a remote specifier, naming the remedy ... ok (1ms) + refuses nothing that classified as a path ... ok (0ms) +PM3 — resolution follows the classification ... ok (2ms) +running 5 tests from ./packages/cli/tests/plugin-selection.test.ts +PS1 — both spellings, in the order they were written ... + reads the separated and the assigned form alike ... ok (3ms) + keeps occurrence order rather than sorting or deduplicating ... ok (0ms) + retains the original argv, frozen, whatever it removed from the rest ... ok (1ms) +PS1 — both spellings, in the order they were written ... ok (9ms) +PS2 — the separator ends the scan ... + leaves every token after `--` exactly where it was written ... ok (0ms) + still reads what was written before the separator ... ok (1ms) +PS2 — the separator ends the scan ... ok (1ms) +PS3 — a selection that names nothing is refused before anything loads ... + refuses a trailing --plugin with no value ... ok (1ms) + refuses an empty assigned value ... ok (0ms) + refuses a separated value that reads as another option, and says how to write it ... ok (0ms) +PS3 — a selection that names nothing is refused before anything loads ... ok (1ms) +PS4 — the command a Plugin is told about ... + normalizes the shorthand document form to run ... ok (0ms) + reports each public command by its own name ... ok (1ms) + PS4: the REPL is its own command, and its name is not left as a positional ... ok (0ms) +PS4 — the command a Plugin is told about ... ok (1ms) +PS5 — describing a command line loads nothing ... + installs no Plugin for help, version or the internal worker mode ... ok (1ms) + installs them for every command that can run a document ... ok (0ms) + reads a help flag written after the separator as an ordinary token ... ok (0ms) +PS5 — describing a command line loads nothing ... ok (941µs) +running 1 test from ./packages/cli/tests/process-retention.test.ts +Tier FG — host retention ... + FG20: xmd run without --journal keeps the status and neither channel ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +[yield] import_component:__root__ → ok { path: 'prints.md' } +to-outto-err[yield] exec:exec:printf 'to-out'; printf 'to-err' >&2 → ok { exitCode: 0, stdout: undefined, stderr: undefined } +[close] root → ok +# Prints + +----- post-test output end ----- + FG20: xmd run without --journal keeps the status and neither channel ... ok (1s) + FG21: xmd run with --journal keeps both channels ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +[yield] import_component:__root__ → ok { path: 'prints.md' } +to-outto-err[yield] exec:exec:printf 'to-out'; printf 'to-err' >&2 → ok { exitCode: 0, stdout: 'to-out', stderr: 'to-err' } +[close] root → ok +# Prints + +----- post-test output end ----- + FG21: xmd run with --journal keeps both channels ... ok (1s) +Tier FG — host retention ... ok (3s) +running 1 test from ./packages/cli/tests/props-cli.test.ts +Tier PC — xmd run document properties ... + PC1: individual command-line options supply properties ... +------- post-test output ------- + +Hello, Ada! loud=true count=3 tags= +----- post-test output end ----- + PC1: individual command-line options supply properties ... ok (750ms) + PC2: individual environment variables supply properties ... +------- post-test output ------- + +Hello, Ada! loud=false count= tags= +----- post-test output end ----- + PC2: individual environment variables supply properties ... ok (756ms) + PC3: aggregate JSON supplies properties from either source ... +------- post-test output ------- + +Hello, Ada! loud=false count=7 tags= + +Hello, Env! loud=false count=9 tags= +----- post-test output end ----- + PC3: aggregate JSON supplies properties from either source ... ok (1s) + PC4: the documented precedence resolves per property ... +------- post-test output ------- + +Hello, ind-cli! loud=false count=2 tags=t +----- post-test output end ----- + PC4: the documented precedence resolves per property ... ok (786ms) + PC5: an invalid higher-priority source fails instead of falling through ... +------- post-test output ------- +--props-count: Invalid input: expected number, received string +----- post-test output end ----- + PC5: an invalid higher-priority source fails instead of falling through ... ok (664ms) + PC6: booleans accept bare and explicit forms, never a negated one ... +------- post-test output ------- + +Hello, x! loud=true count= tags= + +Hello, x! loud=false count= tags= +unrecognized option: --no-props-loud — document properties have no negated form, use --props-loud=false +----- post-test output end ----- + PC6: booleans accept bare and explicit forms, never a negated one ... ok (2s) + PC7: arrays repeat on the command line and are JSON in the environment ... +------- post-test output ------- + +Hello, x! loud=false count= tags=a, b + +Hello, x! loud=false count= tags=alpha, beta +----- post-test output end ----- + PC7: arrays repeat on the command line and are JSON in the environment ... ok (1s) + PC8: text keeps its exact value while aggregate JSON keeps its exact type ... +------- post-test output ------- + +Hello, 007! loud=false count= tags= +--props: Invalid input: expected number, received string +----- post-test output end ----- + PC8: text keeps its exact value while aggregate JSON keeps its exact type ... ok (1s) + PC10: additionalProperties governs aggregate objects at every level ... +------- post-test output ------- +Prop validation failed for <__root__ />: + - "/user/extra" must NOT have additional properties + +name=Ada +----- post-test output end ----- + PC10: additionalProperties governs aggregate objects at every level ... ok (1s) + PC11: an unknown individual option names the aggregate as the way in ... +------- post-test output ------- +unrecognized option: --props-extra — the document declares no such property; supply additional properties with --props +----- post-test output end ----- + PC11: an unknown individual option names the aggregate as the way in ... ok (674ms) + PC12: document help describes the declared properties in every position ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by hello.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props-loud[=] + Environment: XMD_PROPS_LOUD + Default: false + + --props-count + Environment: XMD_PROPS_COUNT + + --props-tags ... + Environment: XMD_PROPS_TAGS + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by hello.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props-loud[=] + Environment: XMD_PROPS_LOUD + Default: false + + --props-count + Environment: XMD_PROPS_COUNT + + --props-tags ... + Environment: XMD_PROPS_TAGS + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by hello.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props-loud[=] + Environment: XMD_PROPS_LOUD + Default: false + + --props-count + Environment: XMD_PROPS_COUNT + + --props-tags ... + Environment: XMD_PROPS_TAGS + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + PC12: document help describes the declared properties in every position ... ok (1s) + PC12a: help describes properties and targets together in every position ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by described.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in described.md + + described.md#Greeting + Greet the person this run names, once. + + described.md#Farewell +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by described.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in described.md + + described.md#Greeting + Greet the person this run names, once. + + described.md#Farewell +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by described.md + + --props-name + Person to greet + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in described.md + + described.md#Greeting + Greet the person this run names, once. + + described.md#Farewell +----- post-test output end ----- + PC12a: help describes properties and targets together in every position ... ok (1s) + PC13: help reports no current values and runs no document ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by doc.md + + --props-name + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + PC13: help reports no current values and runs no document ... ok (675ms) + PC14: help without a document, and a document without properties, show no section ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + PC14: help without a document, and a document without properties, show no section ... ok (1s) + PC15: document-derived options must follow the document ... +------- post-test output ------- +unrecognized option: --props-name — document properties follow the document, as in `xmd run --props-name …` +----- post-test output end ----- + PC15: document-derived options must follow the document ... ok (652ms) + PC16: xmd test does not accept document properties ... +------- post-test output ------- +unrecognized option for xmd test: --props-name — document properties are exclusive to xmd run +----- post-test output end ----- + PC16: xmd test does not accept document properties ... ok (607ms) + PC19: a referenced scalar gets bindings, decoding, and a rendered value form ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by ref.md + + --props-count + Environment: XMD_PROPS_COUNT + + --props-counts ... + Environment: XMD_PROPS_COUNTS + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +count=12 counts=1, 2 +----- post-test output end ----- + PC19: a referenced scalar gets bindings, decoding, and a rendered value form ... ok (1s) + PC20: a structured-only document still documents the aggregate ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by nested.md + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +----- post-test output end ----- + PC20: a structured-only document still documents the aggregate ... ok (608ms) + PC18: the default command form accepts properties ... +------- post-test output ------- + +Hello, Ada! loud=false count= tags= +----- post-test output end ----- + PC18: the default command form accepts properties ... ok (772ms) + PC22: property help describes a targeted document by its reference ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Properties declared by sectioned.md + + --props-name + Environment: XMD_PROPS_NAME + Required + + --props + Set document properties as a JSON object + Environment: XMD_PROPS + +Targets in sectioned.md + + sectioned.md#Greeting + + sectioned.md#Farewell + FAREWELL_MARKER +----- post-test output end ----- + PC22: property help describes a targeted document by its reference ... ok (603ms) +Tier PC — xmd run document properties ... ok (22s) +running 1 test from ./packages/cli/tests/props-schema.test.ts +Tier PS — JSON Schema to Standard Schema ... + PS1: converts every scalar form the contract names ... ok (7ms) + PS2: text is not coerced — a number-only property rejects its string form ... ok (1ms) + PS3: required and optional are the schema's, not Zod's ... ok (19ms) + PS4: local references resolve — draft-7 uses definitions ... ok (4ms) + PS5: $defs needs the 2020-12 target, while Ajv resolves either pointer ... ok (5ms) + PS6: Zod would strip and default nested values, so its output is never kept ... ok (5ms) + PS7: a strict nested object rejects unknown keys, so the adapter loosens them for Ajv ... ok (6ms) +Tier PS — JSON Schema to Standard Schema ... ok (52ms) +running 1 test from ./packages/cli/tests/props-sources.test.ts +Tier PR — property source resolution ... + PR1: generates a binding per declared scalar property ... ok (2ms) + PR2: normalizes multi-word names and rejects a collision ... ok (2ms) + PR3: applies the documented precedence per property ... ok (5ms) + PR4: an invalid higher-priority source fails instead of falling through ... ok (2ms) + PR5: an invalid lower-priority source is irrelevant when a higher one wins ... ok (1ms) + PR6: a property nobody supplies is omitted so defaults stay Ajv's ... ok (0ms) + PR7: individual text decodes, aggregate JSON keeps its exact type ... ok (2ms) + PR8: booleans accept a bare flag and an explicit value, never a negated form ... ok (2ms) + PR9: arrays repeat on the command line and are JSON in the environment ... ok (2ms) + PR10: aggregate values reach validation unchanged, nested keys and all ... ok (2ms) + PR11: undeclared aggregate keys survive for whole-object validation ... ok (0ms) + PR12: an unknown individual option names the aggregate as the way in ... ok (1ms) + PR13: malformed aggregate JSON fails before anything runs ... ok (1ms) + PR15: a referenced scalar generates bindings and decodes against its target ... ok (1ms) + PR18: only a scalar enum gets an individual binding ... ok (1ms) + PR19: a structural enum keeps its source-aware diagnostics ... ok (1ms) + PR16: structured properties resolve through Configliere too ... ok (2ms) + PR17: a structured diagnostic names the aggregate that supplied it ... ok (2ms) + PR14: extraction leaves every other argument alone ... ok (0ms) +Tier PR — property source resolution ... ok (35ms) +running 1 test from ./packages/cli/tests/pull-request-read-fork.test.ts +Tier PRR — forking a run that already read a pull request ... + PRR27: an unchanged fork restores the collection, and a changed URL does not ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 + + + +reviews: 2 +workflow status: completed +[{"eventId":"a4cd3e07-7ca1-4728-a0dc-5bf19d1829e7","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d1b95ffd902a07b58797abf6f66c6362c43c7afa81bbd26e7e154f82b9b59f91"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"d1b95ffd902a07b58797abf6f66c6362c43c7afa81bbd26e7e154f82b9b59f91"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ca19874d-c2a2-406a-baea-c5733c529a57","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"review.md","content":"---\nprops:\n url: { type: string, default: \"https://github.com/octo/project/pull/7\" }\n---\n\n\n\nreviews: {reviews.length}\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1aca2406-c8dd-4aae-ab4b-4f79ebd0a037","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"PullRequest.Reviews","executablemd.source-position":{"path":"review.md","offset":91,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"review.md","offset":91,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6e17fec1-9c70-40a6-ace4-bc20f003504b","event":{"type":"yield","coroutineId":"root","description":{"type":"pull_request_read","name":"c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:6af2737ac2d30964","input":{"operation":"read","url":"https://github.com/octo/project/pull/7","provider":null,"kind":"reviews","runId":"source-1","expansionId":"c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc"},"configuration":"6af2737ac2d30964","executablemd.source-position":{"path":"review.md","offset":91,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"reviews","items":[{"id":"700","author":"reviewer","state":"approved","body":"ship it","submittedAt":"2026-08-24T00:00:00Z","commitSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","url":"https://github.com/octo/project/pull/7#r0"},{"id":"701","author":"reviewer","state":"approved","body":"one note","submittedAt":"2026-08-24T00:00:00Z","commitSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","url":"https://github.com/octo/project/pull/7#r1"}]}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"review.md","offset":91,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"576c8aa3-44af-4880-a9b6-753e5ad60f3e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\nreviews: 2\n","value":"\n\n\nreviews: 2\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] +workflow run: control-1 + + + +reviews: 2 +workflow status: completed +the candidate definition diverges from the inherited history after 3 of 4 events, at 6e17fec1-9c70-40a6-ace4-bc20f003504b (pull_request_read): Divergence at root[3]: expected pull_request_read("c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:6af2737ac2d30964") at review.md:6:1, got pull_request_read("c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:615e5f9863cfa384") at review.md:6:1 +----- post-test output end ----- + PRR27: an unchanged fork restores the collection, and a changed URL does not ... ok (4s) +Tier PRR — forking a run that already read a pull request ... ok (4s) +running 1 test from ./packages/cli/tests/repl-admission.test.ts +AD — admission survives an announcement made before the consumer runs ... + AD1: a value announced before the consumer begins is still admitted ... ok (8ms) + AD2: the shape AD1 replaced drops that value — the control for AD1 ... ok (3ms) +AD — admission survives an announcement made before the consumer runs ... ok (16ms) +running 12 tests from ./packages/cli/tests/repl-agent-execution.test.ts +L1 — transparent queued/start/delta/terminal observation ... + L1: queued before the provider is asked, then the turn's own facts ... ok (81ms) +L1 — transparent queued/start/delta/terminal observation ... ok (86ms) +L2 — exact atomic live-to-durable replacement ... + L2: identical concurrent turns replace their own overlays, in reverse order ... ok (66ms) + L2: the turn that finished first is not the turn the first record replaced ... ok (54ms) + L2: a replayed turn consumes its record without creating a live overlay ... ok (60ms) +L2 — exact atomic live-to-durable replacement ... ok (183ms) +L3 — execution owns live work, presentation does not ... + L3: a document with no Agent work publishes nothing and materializes nothing ... ok (32ms) + L3: a turn completes and publishes with nobody subscribed to changes ... ok (30ms) + L3: cancelling the session owner cancels and joins a held turn ... ok (29ms) + L3: a divergence before admission returns no session and leaves nothing alive ... ok (37ms) +L3 — execution owns live work, presentation does not ... ok (130ms) +L4 — an admitted session failure terminates its owner ... + L4: a post-admission correlation failure withdraws authority and join returns it ... ok (28ms) +L4 — an admitted session failure terminates its owner ... ok (28ms) +P1 — exact policy and per-turn suspension ... + P1: approve-all selects allow_once first ... ok (28ms) + P1: approve-all falls back to allow_always ... ok (27ms) + P1: approve-all denies when neither allow kind is offered ... ok (28ms) + P1: deny-all selects reject_once first ... ok (27ms) + P1: deny-all falls back to reject_always ... ok (26ms) + P1: deny-all cancels when no rejection is offered ... ok (27ms) + P1: approve-reads approves a read ... ok (26ms) + P1: approve-reads approves a search with allow_always ... ok (28ms) + P1: approve-reads denies a read with no allow kind ... ok (26ms) + P1: one held request does not suspend its sibling spawn ... ok (41ms) +P1 — exact policy and per-turn suspension ... ok (286ms) +P2 — one live request, one direct settlement ... + P2: an unknown option and a stale key settle nothing; the offered one settles once ... ok (30ms) + P2: dismissal while live denies once and the turn resumes ... ok (30ms) + P2: a cold retained audit has no pending reading and no authority ... ok (61ms) +P2 — one live request, one direct settlement ... ok (122ms) +P3 — whole-session teardown is structured cancellation ... + P3: teardown cancels and joins the held request without claiming a denial ... ok (25ms) + P3: releasing the owning scope retires the agent owner and wakes nobody ... ok (29ms) + P3: retiring the owner wakes nobody who was waiting on its failure ... ok (5ms) +P3 — whole-session teardown is structured cancellation ... ok (60ms) +P4 — a request without one live owner fails the session ... + P4: an unowned request publishes nothing, denies nothing and fails the session ... ok (27ms) +P4 — a request without one live owner fails the session ... ok (27ms) +P5 — the durable audit of a live REPL turn ... + P5: two live turns settle in reverse order, and each record holds only its own ... ok (40ms) + P5: a later request from an earlier turn is still that turn's ... ok (43ms) + P5: two requests from one turn keep the order they were asked, not the order they settled ... ok (27ms) + P5: provider-owned input reaches neither the journal nor the model ... ok (28ms) +P5 — the durable audit of a live REPL turn ... ok (139ms) +P6 — only a canonical Prompt claims a record ... + P6: a direct public prompt neither claims the canonical record nor lingers ... ok (31ms) + P6: concurrent spawns with a direct call each retire only their own turn ... ok (44ms) + P6: a refused publication leaves the turn neither retained nor mounted ... ok (27ms) + P6: a failed canonical Prompt hands off exactly as a completed one does ... ok (29ms) + P6: a cancelled canonical Prompt hands off exactly as a completed one does ... ok (26ms) +P6 — only a canonical Prompt claims a record ... ok (158ms) +EA1 — one chronology of entries, each counting its own Prompts ... + EA1: two entries each retain sequence 0, ordered by entry and then sequence ... ok (72ms) + EA1: two prompts in one entry claiming one sequence refuse the whole projection ... ok (42ms) + EA1: a live turn carries the entry that began it, and keeps it on publication ... ok (53ms) + EA1: one conversation spans two entries, and naming an entry does not narrow it ... ok (50ms) +EA1 — one chronology of entries, each counting its own Prompts ... ok (218ms) +EL2 — an entry's live Agent state is retired with its execution ... + EL2: a cancelled turn is retired with its entry, and the next entry runs clean ... ok (72ms) + EL2: cleanup keeps a published slot and removes only the unpublished one ... ok (78ms) + EL2: a request held by a cancelled entry crosses nothing into its successor ... ok (76ms) +EL2 — an entry's live Agent state is retired with its execution ... ok (228ms) +running 14 tests from ./packages/cli/tests/repl-agent-interface.test.ts +U1 — one chronology, filtered, undisturbed by the background ... + U1: retained, streaming and queued turns show together, in scheduling order ... ok (160ms) + U1: an earlier live turn stays before a later recorded one, and survives its own record ... ok (88ms) + U1: conversations are ordered by their earliest turn, and selecting one changes only the filter ... ok (91ms) + U1: background Agent work changes no route, no filter and not where focus is ... ok (69ms) + U1: a historical prefix shows no live turn and no live request ... ok (69ms) +U1 — one chronology, filtered, undisturbed by the background ... ok (481ms) +U2 — one action path, and one owner for a pending request ... + U2: Enter and a pointer on the same control ask for the same thing ... ok (74ms) + U2: a request arriving opens nothing, moves nothing and claims no focus ... ok (61ms) + U2: activating it opens the drawer, and one choice settles that request once ... ok (87ms) + U2: closing the drawer denies exactly once, through the authority ... ok (65ms) + U2: an unknown request or an unoffered option changes nothing and calls nobody ... ok (57ms) + U2: a recorded permission audit is read, never answered ... ok (49ms) +U2 — one action path, and one owner for a pending request ... ok (394ms) +U3 — what each accepted frame mounts, and nothing else ... + U3: wide keeps Sessions in the sidebar and leaves the other readings alone ... ok (62ms) + U3: narrow Sessions mounts its own outlet and nothing of the other panes ... ok (56ms) + U3: narrow REPL mounts no Sessions row ... ok (65ms) + U3: the permission drawer traps focus, keeps History inside it and hides what is behind ... ok (61ms) + U3: every accepted frame carries one location, and too small carries only its refusal ... ok (62ms) +U3 — what each accepted frame mounts, and nothing else ... ok (308ms) +U2 — the program performs a permission, end to end ... + U2: choosing through the running program settles the request and closes its drawer ... ok (822ms) + U2: Escape on the drawer denies once through the program, and the session runs on ... ok (768ms) +U2 — the program performs a permission, end to end ... ok (1s) +U4 — the loop wakes for Agent work ... + U4: queued, streaming and a waiting request each repaint on their own ... ok (479ms) +U4 — the loop wakes for Agent work ... ok (479ms) +U5 — navigation is outside the outlet it leaves ... + U5: a narrow frame is left in both directions, by key and by pointer ... ok (51ms) + U5: a request arriving on the other surface is still reachable from this one ... ok (52ms) +U5 — navigation is outside the outlet it leaves ... ok (103ms) +U6 — the Sessions reading is windowed ... + U6: a request past the first window is reached by scrolling, and the top comes back ... ok (63ms) + U6: the stored offset is clamped when the reading it was taken against changes ... ok (119ms) + U6: a draft long enough to fill the region still leaves every control placed ... ok (75ms) + U6: a shrinking draft row repaints cleanly, and is a complete row ... ok (61ms) + U6: the first press after a resize moves the window, not the stored number ... ok (98ms) +U6 — the Sessions reading is windowed ... ok (416ms) +U7 — the permission drawer is windowed ... + U7: every offered choice becomes placed and pointable, in the provider's order ... ok (89ms) + U7: closing a scrolled drawer denies exactly once ... ok (54ms) + U7: the first press after a resize moves the drawer, not the stored number ... ok (69ms) +U7 — the permission drawer is windowed ... ok (221ms) +U8 — a target is a control, whatever its key is spelled ... + U8: values named like a turn's facts are still pointer-equivalent to Enter ... ok (48ms) + U8: a fact is read, not activated, wherever it is drawn ... ok (60ms) +U8 — a target is a control, whatever its key is spelled ... ok (113ms) +U1 — a row's rectangle does not bound its text (#875 R1) ... + TL11: a long turn label keeps its state inside the row's own measured cells ... ok (37ms) +U1 — a row's rectangle does not bound its text (#875 R1) ... ok (37ms) +U9 — two entries whose Prompts share one durable name ... + U9: each entry's turn shows once and resolves to its own record ... ok (69ms) +U9 — two entries whose Prompts share one durable name ... ok (70ms) +EU1 — selecting an entry moves the transcript locus and nothing else ... + UI4: a live question belongs to the entry that is still running ... ok (50ms) + EU1: selecting an entry changes the locus, and leaves Sessions global ... ok (68ms) + ER1: a narrow round trip to Sessions keeps the entry, the draft and the filter ... ok (79ms) + EU1: entry keys and mounted nodes survive publication and an outcome change ... ok (68ms) +EU1 — selecting an entry moves the transcript locus and nothing else ... ok (266ms) +U2 — a pending permission announces itself without taking the screen ... + UI14: the frame says a permission waits in Sessions, and changes no route or focus ... ok (48ms) +U2 — a pending permission announces itself without taking the screen ... ok (48ms) +U2 — a draft outlives a permission and is still editable ... + C3: at 160x36 the draft survives settling, edits, and becomes Entry 2 ... ok (11s) + C3: at 72x20 the draft survives settling, edits, and becomes Entry 2 ... ok (11s) +U2 — a draft outlives a permission and is still editable ... ok (22s) +running 7 tests from ./packages/cli/tests/repl-agent-journey.test.ts +J1 — the Story, from one entry to one README ... + J1: the packaged Plan is reviewed in the drawer, and its program asks, previews and writes ... ok (2s) + J1: declining reaches the same preview and writes nothing ... ok (2s) +J1 — the Story, from one entry to one README ... ok (4s) +C1 — the command line this REPL runs under ... + C1: the five options settle into one immutable profile ... ok (13ms) + C1: each permission switch is the mode the profile carries ... ok (0ms) + C1: an entry that asks for no Agent materializes no adapter ... ok (173ms) + C1: `` is unavailable and the REPL keeps the terminal ... ok (183ms) +C1 — the command line this REPL runs under ... ok (370ms) +J3 — durable truth, and a cold process over it ... + J3: a fresh command scope reconstructs the whole Story from the Journal alone ... ok (2s) + EC1: two entries of retained Agent work reopen cold, asking nobody ... ok (1s) + J3: a failed and a cancelled turn restore terminally, with the text they had ... ok (1s) + J3: each marker shows only what its own prefix retains ... ok (1s) + J3: a location this host cannot read refuses before any replay ... ok (45ms) +J3 — durable truth, and a cold process over it ... ok (6s) +J2 — three conversations at once, through the terminal ... + J2: complete, streaming and queued are one frame, and filtering changes only Sessions ... ok (1s) +J2 — three conversations at once, through the terminal ... ok (1s) +J2 — a filter and a draft across a resize (#875 R1) ... + TL10: a conversation filter and a draft survive the round trip, and a cold open restores them ... ok (1s) +J2 — a filter and a draft across a resize (#875 R1) ... ok (1s) +J2 — what filtering Sessions leaves on the screen (#875 R1) ... + TL5: filtering to one conversation blanks the cells the vacated rows were drawn in ... ok (981ms) +J2 — what filtering Sessions leaves on the screen (#875 R1) ... ok (981ms) +X1 — how this command ends, with work still in flight ... + X1: EOF ends the command, joins the turn and appends nothing late ... ok (659ms) + X1: a renderer that fails ends the command the same way ... ok (621ms) + X1: a terminal that fails mid-read ends the command the same way ... ok (661ms) + X1: cancelling the command joins the pending request without answering it ... ok (623ms) + UI2: [exit] while a request is waiting denies nothing and answers nothing ... ok (693ms) +X1 — how this command ends, with work still in flight ... ok (3s) +running 4 tests from ./packages/cli/tests/repl-boundaries.test.ts +REPL boundaries: what production code cannot reach ... + S1: no shared REPL module reaches a runtime global or the environment ... ok (14ms) + S1: the checker reads code and not prose ... ok (1ms) + S1: the checker rejects a module that reaches one ... ok (1ms) + S1: application components import no journal, session or host authority ... ok (1ms) + S1: the terminal, decoder and renderer know no application action name ... ok (1ms) + S1: runtime-specific access lives only in runtime-named modules ... ok (2ms) + S1: no rejected dependency entered production ... ok (0ms) + S1: no production REPL module retains a provider's raw request ... ok (10ms) + S1: the profile installs no readline policy, no launcher and no browser form ... ok (1ms) + S1: the profile check rejects a profile that installed one ... ok (1ms) + S1: no REPL record type exists in production ... ok (8ms) +REPL boundaries: what production code cannot reach ... ok (44ms) +REPL terminal entrypoints: one corrected stream, four installations ... + UI2: every entrypoint installs an owned input stream and none builds its own reader ... ok (2ms) + UI2: nothing on the REPL's exit path ends through a host primitive ... ok (2ms) + UI2: every owned reader registers its release before it acquires anything ... ok (1ms) + UI2: the compiled binary installs the same Deno stream the source entrypoint does ... ok (0ms) + UI2: Node and Bun share one structural reader and detect no runtime ... ok (1ms) +REPL terminal entrypoints: one corrected stream, four installations ... ok (7ms) +REPL documentation: what it says is what the code does ... + D1: every command example in the spec is one the parser accepts ... ok (1ms) + D1: the five options the spec names are the five the parser accepts ... ok (1ms) + D1: the spec's route grammar is the one the codec implements ... ok (0ms) + D1: the spec's sequential-entry claims are the ones the code makes ... ok (1ms) + D1: a drifted example is caught ... ok (0ms) + D1: the spec's Elicit metadata statement matches the real reader ... ok (1ms) + D1: Freedom's recorded provenance still matches its manifest ... ok (1ms) +REPL documentation: what it says is what the code does ... ok (5ms) +REPL command: what runs before the host is reached ... + S1: help describes the command without assembling a REPL ... ok (10ms) + S1: every refusal is decided before the host is asked for anything ... ok (143ms) + S1: the counter is entered when the command really runs ... ok (50ms) +REPL command: what runs before the host is reached ... ok (203ms) +running 9 tests from ./packages/cli/tests/repl-composition.test.ts +REPL composition: reconciling a described tree ... + C1: the same key and component keep the node and its running lifetime ... ok (5ms) + C1: a changed component replaces the node, and the replacement mounts first ... ok (2ms) + C1: a new sibling mounts before an absent one is removed ... ok (1ms) + C1: canonical order is the described order, not the created order ... ok (1ms) + C1: a refused set changes nothing at all ... ok (2ms) + C1: an absent description leaves no node, focus, frame or state ... ok (1ms) + C1: next() returns only after that exact set has been committed ... ok (1ms) + C1: validation reads the whole set, including descendants ... ok (1ms) +REPL composition: reconciling a described tree ... ok (18ms) +REPL composition: a description is issued, not written ... + C1: what the caller keeps mutating is not what the tree holds ... ok (0ms) + C1: a description mutated while its offer waits cannot change the tree ... ok (1ms) + C1: a plain object shaped like a description is refused ... ok (1ms) + C1: an issued handle cannot be shadowed into meaning something else ... ok (1ms) + C1: the records behind a handle are frozen, all the way down ... ok (2ms) + C1: a factory-shaped component is refused before anything attaches ... ok (2ms) + C1: only view data crosses into a description ... ok (1ms) +REPL composition: a description is issued, not written ... ok (12ms) +REPL composition: the vendored snapshot ... + C2: the manifest is an exact inventory of what is vendored ... ok (7ms) + C2: every vendored byte is the byte the manifest recorded ... ok (4ms) + C2: the provenance states both licence declarations and settles neither ... ok (0ms) + C2: every production difference from upstream belongs to one named patch ... ok (1ms) + C2: production imports the patched copy and never the pristine one ... ok (3ms) +REPL composition: the vendored snapshot ... ok (15ms) +REPL composition: what the two patches change ... + C2: a patched root belongs to its caller, and pristine has no such surface ... ok (6ms) + C2: pristine upstream fails the ownership control ... ok (1ms) + C2: removing the branch above the focused control moves focus to a survivor ... ok (1ms) + C2: pristine upstream fails the containment control ... ok (1ms) + C2: the patched sources run on this repository's stable Effection ... ok (0ms) +REPL composition: what the two patches change ... ok (9ms) +REPL composition: where a normalized event goes ... + I1: a key and a click on the same control mean the same thing ... ok (0ms) + I1: the host names a target and an event shape, never an action ... ok (0ms) + I1: Backtab arrives through dispatch, like every other event ... ok (1ms) + I1: Escape closes the drawer and answers nothing ... ok (0ms) + I1: a pointer from an obsolete frame or a removed node is dropped ... ok (0ms) + I1: an event nothing claims is an explicit failure, not a silence ... ok (1ms) +REPL composition: where a normalized event goes ... ok (4ms) +REPL composition: a modal branch owns focus while it is mounted ... + C2: a mounted modal traps focus, and popping it restores the prior one ... ok (1ms) + C2: the same branch without the modal push does not trap focus ... ok (1ms) +REPL composition: a modal branch owns focus while it is mounted ... ok (1ms) +REPL composition: cancellation owns an uncommitted offer ... + C1: cancelling an offer suspended in the real commit path mounts nothing ... ok (12ms) + C1: cancelling the holder cannot release a concurrent commit ... ok (12ms) +REPL composition: cancellation owns an uncommitted offer ... ok (24ms) +REPL composition: the construction surface ... + C1: the only public construction is describe() and component() ... ok (1ms) + C1: an issued handle shows nothing and cannot be changed ... ok (0ms) +REPL composition: the construction surface ... ok (2ms) +REPL composition: a modal stack ... + C2: a current-frame pointer cannot reach the page behind an open drawer ... ok (1ms) + C2: a nested stack pushes outer first and pops inner first ... ok (1ms) + C2: removing an outer drawer pops the stack above it, innermost first ... ok (1ms) + C2: a preserved node whose modal intent changes pushes or pops in place ... ok (1ms) + C2: a focus claim beside a modal is refused before anything mounts ... ok (1ms) + C2: a focus claim in an outer modal but outside the inner one is refused ... ok (1ms) + C2: a focus claim inside the innermost modal is admitted ... ok (1ms) + C2: two modal roots on disjoint branches are refused before anything mounts ... ok (0ms) +REPL composition: a modal stack ... ok (6ms) +running 19 tests from ./packages/cli/tests/repl-entries.test.ts +REPL entries: the segments one physical journal holds ... + ES1: partitions two and three segments in admission order ... ok (113ms) + ES1: each segment view reads only its own events ... ok (40ms) + ES1: a successful append becomes locally visible only after acknowledgement ... ok (28ms) + ES1: a failed physical append does not advance local state ... ok (22ms) + ES1: a settled or non-final segment refuses every append ... ok (22ms) +REPL entries: the segments one physical journal holds ... ok (230ms) +REPL entries: the prefixes it refuses whole ... + ES2: every malformed boundary refuses with no partial entries ... ok (23ms) + ES2: a segment the one-entry reader cannot read refuses the whole prefix ... ok (21ms) + ES2: an earlier selection does not escape a later entry nothing can read ... ok (22ms) +REPL entries: the prefixes it refuses whole ... ok (65ms) +REPL entries: the keys and markers it assigns ... + EM1: keys follow admission order whatever each entry settled to ... ok (37ms) + EM1: the first entry keeps every marker spelling a one-entry history had ... ok (21ms) + EM1: a raw close:root cannot select the second entry's close ... ok (21ms) +REPL entries: the keys and markers it assigns ... ok (80ms) +REPL entries: what each entry owns and what the next one inherits ... + EP1: two successful entries own their own scopes, transcripts and outcomes ... ok (23ms) + EP1: the last durably published value wins, and an unpublished one never appears ... ok (35ms) + EP1: a second entry edits its inherited value, and the first entry's does not move ... ok (22ms) + EP1: a retained `props` is the entry's own and reaches no successor ... ok (19ms) + EP1: a retained export name no binding can have refuses projection ... ok (11ms) + EP1: a failed and a cancelled entry each permit a successor ... ok (38ms) + EP1: an unfinished entry followed by another admission refuses atomically ... ok (12ms) +REPL entries: what each entry owns and what the next one inherits ... ok (159ms) +REPL entries: what a one-entry history still does ... + BC1: a successful one-entry journal projects entry-1 with its own spellings ... ok (11ms) + BC1: a one-entry failure and a one-entry cancellation keep their outcomes ... ok (17ms) + BC1: a one-entry historical prefix keeps its marker and its head reading ... ok (11ms) + BC1: an empty journal and the refusals a one-entry history had are unchanged ... ok (11ms) +REPL entries: what a one-entry history still does ... ok (50ms) +REPL entries: one session, one entry task, in turn ... + EL1: the first entry starts exactly one task ... ok (19ms) + EL1: a submission while an entry is running refuses and starts nothing ... ok (29ms) + EL1: terminal and unjoined still refuses; the join lets the next one start ... ok (34ms) + EL1: a later entry receives only what earlier entries durably published ... ok (34ms) + EL1: a failed entry permits the next one; an interrupted one permits none ... ok (99ms) + EL1: a cancelled close permits a successor once its task has joined ... ok (27ms) + EL1: opening a settled two-entry history executes neither segment ... ok (33ms) + EL1: opening an unfinished final segment resumes only that segment ... ok (46ms) + EL1: teardown racing a submission starts no task and joins the one running ... ok (22ms) + EL1: an append the journal refuses opens no successor and mounts no task ... ok (16ms) +REPL entries: one session, one entry task, in turn ... ok (363ms) +REPL entries: the draft, the gate and the position ... + ER1: the draft stays editable while an entry runs and while history is read ... ok (34ms) + ER1: Run refuses at every closed gate, starts nothing and keeps the exact draft ... ok (22ms) + ER1: the preserved draft becomes the exact next entry, and only then clears ... ok (32ms) + ER1: a prefix before the selected entry clears only that suffix ... ok (19ms) + ER1: returning live restores the catalog and keeps the draft ... ok (25ms) + ER1: submission inherits from the live head, never from the inspected prefix ... ok (30ms) +REPL entries: the draft, the gate and the position ... ok (162ms) +REPL entries: the catalog a person reads and reaches ... + EU1: entries stay in admission order while their outcomes disagree ... ok (39ms) + EU1: wide and narrow keep the input and both surface selectors reachable ... ok (67ms) + EU1: a catalog longer than one window places and targets every row ... ok (91ms) + EU1: Enter and a frame-resolved pointer on one row ask for the same thing ... ok (73ms) + EU1: a row outside the window is unmounted, unplaced and in no target map ... ok (69ms) + EU1: a resize clamps the drawn offset before the first scroll after it ... ok (66ms) +REPL entries: the catalog a person reads and reaches ... ok (406ms) +REPL entries: the transcript belongs to the entry that is selected ... + EU1: each entry shows its own retained transcript, and no other entry's ... ok (13ms) + EU1: a live overlay belongs to the entry running it, not to the one being read ... ok (39ms) +REPL entries: the transcript belongs to the entry that is selected ... ok (52ms) +REPL entries: restoring an answer at a narrow size (#875 R1) ... + EU1: focus returns to the owning entry, revealed through the catalog's own window ... ok (174ms) +REPL entries: restoring an answer at a narrow size (#875 R1) ... ok (174ms) +REPL entries: the catalog keeps its promise at the narrowest sidebar ... + EU1: every outcome stays inside the drawn row, whatever the entry is called ... ok (33ms) +REPL entries: the catalog keeps its promise at the narrowest sidebar ... ok (33ms) +REPL entries: going to Sessions keeps the entry you came from ... + ER1: the selected entry survives both surfaces, and comes back with you ... ok (22ms) +REPL entries: going to Sessions keeps the entry you came from ... ok (22ms) +REPL entries: what each prefix of a two-entry history shows ... + EH1: before an admission, at it, and at the outcome, with the draft throughout ... ok (26ms) +REPL entries: what each prefix of a two-entry history shows ... ok (26ms) +REPL entries: a third entry inherits the file, not the run before it ... + EC1: an edit the entry before it never published reaches no successor ... ok (47ms) +REPL entries: a third entry inherits the file, not the run before it ... ok (47ms) +REPL entries: which refusal the screen may forget ... + UI12: the session's own lifecycle refusal is recognized, and carries its reason ... ok (0ms) + UI12: an ordinary error merely named ReplLifecycleError is not one ... ok (1ms) + UI12: a refusal marked by another loaded copy is recognized ... ok (0ms) + UI12: an inherited mark is not an own mark ... ok (0ms) + UI12: an empty or malformed mark is rejected ... ok (0ms) + UI12: an unmarked error, and a value that is not one, are not refusals ... ok (0ms) + UI12: the reason is the marked one, and rewriting the message cannot change it ... ok (1ms) + UI12: the mark is non-enumerable, so copying and serializing drop it ... ok (0ms) +REPL entries: which refusal the screen may forget ... ok (1ms) +REPL entries: what the screen says the execution is doing ... + UI10: ready, running, waiting, settling, unfinished and complete each read differently ... ok (42ms) +REPL entries: what the screen says the execution is doing ... ok (42ms) +REPL entries: what a frozen position says is unavailable ... + UI15: History says submission is unavailable, hides live-only controls, and keeps the draft ... ok (26ms) +REPL entries: what a frozen position says is unavailable ... ok (31ms) +REPL entries: a retained close while the task is still coming down ... + UI11: settling refuses the next entry, and releasing teardown reads ready with no input ... ok (26ms) +REPL entries: a retained close while the task is still coming down ... ok (26ms) +REPL entries: what a failed entry says it failed with ... + UI13: the recorded reason is on the screen, bounded, and a cold reopen says the same ... ok (19ms) + UI13: the reason is drawn inside its region at every supported size, footer untouched ... ok (20ms) + UI13: an entry that did not fail is given no failure text ... ok (19ms) +REPL entries: what a failed entry says it failed with ... ok (57ms) +running 5 tests from ./packages/cli/tests/repl-execution.test.ts +REPL execution: submitting one entry ... + X1: admits the exact source, binds, generates, asks, and settles ... ok (89ms) + X1: the overlay reports its output as the document prints it ... ok (45ms) + X1: the generated fragment is shown before it is admitted, and follows the binding ... ok (34ms) + X1: shows the generated source before admitting it, then admits and evaluates it ... ok (37ms) + X1: an entry this environment cannot run leaves the history empty ... ok (7ms) + X1: a choice the form does not offer answers nothing and leaves the question open ... ok (50ms) + X1: an entry is refused while the entry before it has not settled ... ok (22ms) +REPL execution: submitting one entry ... ok (293ms) +REPL execution: reopening one history ... + X2: replays what was recorded and goes live at the first unrecorded step ... ok (44ms) + X2: the same counters do register the work a first run really performs ... ok (31ms) + X2: a recorded answer is restored without the provider being reached ... ok (35ms) + X2: a settled history reconstructs the same terminal model and runs nothing ... ok (23ms) + X2: the append observer lives exactly as long as the session ... ok (57ms) + X2: a session clears only the observer it installed ... ok (20ms) + X2: a diverging history refuses atomically ... ok (37ms) + X2: a refused reconstruction leaves nothing of itself behind ... ok (21ms) + X2: a history this version cannot project refuses before anything runs ... ok (19ms) +REPL execution: reopening one history ... ok (288ms) +REPL execution: pausing expansion ... + P1: stops at every boundary it crosses and continues past each one ... ok (40ms) + P1: the Journal advances after pause is requested and before it takes effect ... ok (57ms) + P1: continuing twice releases nothing the second time ... ok (31ms) + P1: a paused expansion is stopped, not cancelled, and the run is still there ... ok (58ms) + P1: tearing the owner down releases nothing that was held ... ok (14ms) + P1: a reconstructed session offers no Continue at all ... ok (19ms) + P1: an execution with no entry yet offers no Continue either ... ok (1ms) +REPL execution: pausing expansion ... ok (220ms) +REPL execution: the boundary inventory ... + P1: every member of every wrapped Api is a walk, a gate, or declared not to be one ... ok (0ms) + P1: the reference entry crosses the boundaries this controller accounts for ... ok (29ms) +REPL execution: the boundary inventory ... ok (29ms) +REPL execution: one execution's file ... + X2: writes each record before acknowledging it, and reads them all back ... ok (25ms) + X2: creating an execution that already exists is refused, not joined ... ok (1ms) + X2: refuses a history it cannot read, without quoting what it holds ... ok (21ms) + X2: an identifier that could address another directory never becomes a path ... ok (1ms) + X2: the kernel reaches the installed host, and refuses when none is installed ... ok (20ms) + X2: an empty file is an execution with no history rather than a refusal ... ok (2ms) +REPL execution: one execution's file ... ok (69ms) +running 2 tests from ./packages/cli/tests/repl-exit-pty.test.ts +REPL exit: the pty child this row owns ... + UI2: leaving the scope signals the child and waits for it to close ... ok (38ms) + UI2: an error is kept, and the owner still waits for the close ... ok (38ms) + UI2: a child that has already closed is not signalled again ... ok (1ms) +REPL exit: the pty child this row owns ... ok (82ms) +REPL exit: a real terminal, and nothing further typed ... + UI2: [exit] finishes the command with no further byte and no closed input ... ok (3s) + UI2: Control-C finishes the command the same way, with no control reached ... ok (1s) +REPL exit: a real terminal, and nothing further typed ... ok (4s) +running 11 tests from ./packages/cli/tests/repl-forms.test.ts +F1 — the bounded language is exact ... + F1: the Plan review schema parses into its complete form ... ok (3ms) + F1: project details and confirmation parse with their annotations ... ok (1ms) + F1: the parsed form is frozen, and the source schema is not ... ok (0ms) + F1: refuses a field keyword it does not model, naming $.properties.feedback.pattern ... ok (0ms) + F1: refuses a root keyword it does not model, naming $.oneOf ... ok (1ms) + F1: refuses an open root, naming $.additionalProperties ... ok (0ms) + F1: refuses a nested object field, naming $.properties.a.type ... ok (0ms) + F1: refuses a numeric field, naming $.properties.a.type ... ok (1ms) + F1: refuses an empty enum, naming $.properties.a.enum ... ok (0ms) + F1: refuses a mixed enum, naming $.properties.a.enum[1] ... ok (1ms) + F1: refuses a required name it does not declare, naming $.required ... ok (0ms) + F1: refuses a duplicate required name, naming $.required[1] ... ok (0ms) + F1: refuses a then with no if, naming $.then ... ok (1ms) + F1: refuses an if with no then, naming $.if ... ok (0ms) + F1: refuses a condition over a field the root does not declare, naming $.if.properties.b ... ok (0ms) + F1: refuses a conditional property the root does not declare, naming $.then.required ... ok (0ms) + F1: refuses a conditional constraint it does not model, naming $.then.properties.b.enum ... ok (0ms) + F1: refuses an if whose type is not object, naming $.if.type ... ok (0ms) + F1: refuses a then whose type is not object, naming $.then.type ... ok (1ms) + F1: refuses a condition that tests a type other than string, naming $.if.properties.a.type ... ok (0ms) + F1: refuses a condition that does not require the field it tests, naming $.if.required ... ok (1ms) + F1: a refused schema publishes nothing and asks nobody ... ok (4ms) +F1 — the bounded language is exact ... ok (22ms) +F2 — invalid stays open; valid is exact ... + F2: choosing Request changes with no feedback keeps the question and says why ... ok (26ms) + F2: entering feedback then submitting resolves with exactly that object ... ok (12ms) + F2: each field edits independently, whichever one the control names ... ok (9ms) + F2: both details are required, and one missing keeps the question open ... ok (7ms) + F2: confirmation returns exactly its offered decision ... ok (7ms) + F2: an option the field does not offer puts nothing into the form ... ok (4ms) + F2: an optional field deliberately emptied is present and empty ... ok (9ms) + F2: closing discards the draft, answers nothing, and reopens empty ... ok (9ms) + F2: an astral scalar survives typing, and one erase removes one scalar ... ok (6ms) +F2 — invalid stays open; valid is exact ... ok (90ms) +F3 — complete content and reachable navigation ... + F3: a field named after a turn's facts is still pointer-targetable ... ok (10ms) + F3: scrolling places every essential control in the narrow frame ... ok (138ms) + F3: the viewport walks the whole message before the form controls ... ok (116ms) + F3: the one History control is inside the drawer while it is open ... ok (23ms) + F3: the footer trigger is one fixed control, and the drawer holds the message ... ok (6ms) +F3 — complete content and reachable navigation ... ok (294ms) +F3 — focus returns to the invocation, not to where the drawer came from ... + F3: focus lands on the record this answer caused, once it appends ... ok (86ms) + F3: closing without answering moves focus to the invocation still asking ... ok (41ms) + F3: without the claim the drawer going leaves focus on an unrelated control ... ok (29ms) +F3 — focus returns to the invocation, not to where the drawer came from ... ok (157ms) +F1 — the form's conditional means exactly what Core validates ... + F1: a numeric tested type is false where a string equality would be true ... ok (3ms) + F1: an if with no required also matches the field being absent ... ok (2ms) +F1 — the form's conditional means exactly what Core validates ... ok (7ms) +F3 — every placed modal control is in the ring ... + UI16: Tab walks one whole cycle and Backtab walks it in reverse, inside the modal ... ok (38ms) +F3 — every placed modal control is in the ring ... ok (38ms) +F2 — an invalid answer is not a lifecycle refusal ... + UI17: the field keeps its own explanation, and the state row still says the state ... ok (31ms) +F2 — an invalid answer is not a lifecycle refusal ... ok (33ms) +F3 — the drawers that show a retained reading (#875 R1) ... + TL3: a binding's value is windowed, and a hidden row is in nothing ... ok (101ms) + TL3: two bindings with one name in two scopes keep separate offsets ... ok (4ms) + TL3: a stored offset past the end is clamped to what the frame shows ... ok (2ms) + TL3: scrolling a retained reading changes that offset and nothing else ... ok (1ms) +F3 — the drawers that show a retained reading (#875 R1) ... ok (110ms) +F3 — the History drawer is a window over every position (#875 R1) ... + TL3: the final position is absent until the window reaches it ... ok (99ms) + TL3: scrolling History selects no position ... ok (3ms) +F3 — the History drawer is a window over every position (#875 R1) ... ok (102ms) +F3 — a narrow frame offers no inspection control (#875 R1) ... + TL11: a recorded binding and answer are in a wide frame and in no part of a narrow one ... ok (27ms) + TL11: dismissing a recorded answer at a narrow size lands focus on a drawn control ... ok (27ms) +F3 — a narrow frame offers no inspection control (#875 R1) ... ok (54ms) +F3 — one committed frame, in the one order this product allows ... + TL9: a held measurement changes no tree, no focus and no committed frame ... ok (9ms) + TL9: a resize under a held measurement abandons the frame before reconciliation ... ok (8ms) + TL9: a measurement that fails commits nothing at all ... ok (1ms) +F3 — one committed frame, in the one order this product allows ... ok (18ms) +running 34 tests from ./packages/cli/tests/repl-journey.test.ts +REPL journey: one entry, from raw bytes ... + J1: pasting the reference entry puts all of it in the draft and the location ... ok (463ms) + J1: submitting admits exactly that source, and the run settles ... ok (1s) + J1: the question is answered through the terminal, and the answer settles ... ok (2s) + J1: a second process reconstructs the view from the URL and the journal alone ... ok (2s) + J1: starting with no location creates one execution and focuses an empty draft ... ok (30ms) +REPL journey: one entry, from raw bytes ... ok (6s) +REPL journey: leaving ... + J1: Control-C ends the command and prints the location ... ok (23ms) + J1: Control-C leaves a refusal, and it is still a refusal ... ok (53ms) + J1: input queued behind Control-C starts nothing and appends nothing ... ok (57ms) + J1: a cold reopen restores the selection, the history position and the draft ... ok (159ms) + J1: no other chord ends it, so what leaves is the key and not the modifier ... ok (98ms) +REPL journey: leaving ... ok (390ms) +REPL journey: what it refuses, and what it leaves alone ... + J1: an invalid navigation leaves the standing route, tree, focus and targets ... ok (2s) + J1: a document that cannot be admitted leaves the draft and an empty journal ... ok (305ms) + J1: a second entry is refused, and history does not change ... ok (1s) + J1: a corrupt history refuses atomically, with no append and no session ... ok (49ms) + J1: a malformed location reaches no path, no file and no terminal ... ok (1ms) + J1: a control chord inserts nothing into the draft ... ok (95ms) + J1: a terminal below the minimum refuses, and recovers when it grows ... ok (124ms) +REPL journey: what it refuses, and what it leaves alone ... ok (4s) +REPL journey: the whole of it, from raw bytes ... + J1: run, hold at a gate, inspect a prefix, return live, continue, answer, settle ... ok (4s) +REPL journey: the whole of it, from raw bytes ... ok (4s) +REPL journey: when a frame counts as applied ... + J1: a frame is not acknowledged until it has been presented ... ok (614ms) +REPL journey: when a frame counts as applied ... ok (614ms) +REPL journey: resizing while a frame is being prepared ... + J2: a window dragged while a frame is being prepared keeps the command ... ok (1s) +REPL journey: resizing while a frame is being prepared ... ok (1s) +REPL journey: the same product at every size ... + J1: a long draft stays exact and usable at medium, and no row crosses its region ... ok (408ms) + J1: a drawer covers what it is in front of, at medium and at wide ... ok (2s) + J1: narrow still routes one surface, with the location above it ... ok (43ms) +REPL journey: the same product at every size ... ok (2s) +REPL journey: what it settles before it acts ... + J1: a piped invocation refuses before a history file exists ... ok (137ms) + J1: a route naming a scope the history never had refuses before anything replays ... ok (558ms) + J1: a stale live-question URL refuses against a finished execution ... ok (769ms) + J1: an answered history with its root still open refuses the same URL ... ok (82ms) + J1: an accepted answer closes the drawer and clears it from the location ... ok (711ms) + J1: Continue is mounted only while a continuation is held ... ok (487ms) + J1: Continue is refused while a pause is still being taken ... ok (0ms) +REPL journey: what it settles before it acts ... ok (2s) +REPL journey: output nothing records still reaches the screen ... + J1: text the Journal has not settled is drawn while the run is held ... ok (727ms) +REPL journey: output nothing records still reaches the screen ... ok (727ms) +REPL journey: a position earlier than the entry being read ... + ER1: the invalid entry clears, and the draft, surface and position stand ... ok (1s) +REPL journey: a position earlier than the entry being read ... ok (1s) +REPL journey: three entries, one command ... + EJ1: a draft survives a refusal, inherits, fails, and is followed ... ok (2s) +REPL journey: three entries, one command ... ok (2s) +REPL journey: what an open drawer covers, through the terminal ... + TL6: narrow from the start, and through a resize round trip, it obscures what it covers ... ok (1s) +REPL journey: what an open drawer covers, through the terminal ... ok (1s) +REPL journey: a selection, a position and a draft across a resize ... + TL10: wide to narrow and back keeps the whole reading, and a cold open restores it ... ok (1s) +REPL journey: a selection, a position and a draft across a resize ... ok (1s) +REPL journey: a cold process over a multi-entry journal ... + EC1: the same catalog and the same selected entry, with no work and no append ... ok (536ms) +REPL journey: a cold process over a multi-entry journal ... ok (536ms) +REPL first use: UI2 ... + UI2: Enter on [exit] ends the command without touching the history ... ok (156ms) +REPL first use: UI2 ... ok (155ms) +REPL first use: UI2 ... + UI2: a pointer on [exit] is the same act as Enter on it ... ok (107ms) +REPL first use: UI2 ... ok (107ms) +REPL first use: UI1 ... + UI1: the guidance teaches the ring that is mounted, at both sizes ... ok (689ms) +REPL first use: UI1 ... ok (689ms) +REPL first use: UI1/UI5 ... + UI1/UI5: the footer holds the actions, the band and the draft, in that order ... ok (247ms) +REPL first use: UI1/UI5 ... ok (247ms) +REPL first use: UI9 ... + UI9: typing at a control never reaches the draft, and the screen says why ... ok (469ms) +REPL first use: UI9 ... ok (468ms) +REPL first use: UI2 too small ... + UI2: below the minimum there is no exit to aim at, and Escape leaves ... ok (149ms) +REPL first use: UI2 too small ... ok (149ms) +REPL first use: UI3 ... + UI3: a question on Sessions moves nothing, and is reached by activating it ... ok (949ms) +REPL first use: UI3 ... ok (949ms) +REPL first use: UI1 selection ... + UI1: the active surface and the selected entry are marked in the frame ... ok (2s) +REPL first use: UI1 selection ... ok (2s) +REPL first use: UI10 narrow guidance ... + UI10: at 72x20 the row says the state, what Enter does, and the way back, whole ... ok (274ms) +REPL first use: UI10 narrow guidance ... ok (274ms) +REPL first use: UI10 narrow drawer guidance ... + UI10: at 72x20 a focused field and a focused drawer control each say state, action, Esc and movement ... ok (690ms) +REPL first use: UI10 narrow drawer guidance ... ok (690ms) +REPL first use: UI15 drawer geometry ... + UI15: guidance saying History does not move what reading the drawer answers ... ok (675ms) +REPL first use: UI15 drawer geometry ... ok (676ms) +REPL first use: UI12 refusal ... + UI12: a lifecycle refusal keeps the draft and goes when the entry it named ends, untouched ... ok (1s) +REPL first use: UI12 refusal ... ok (1s) +REPL first use: UI1 narrow question ... + UI1: the longest question still has a placed, targetable control at 72x20 ... ok (1s) +REPL first use: UI1 narrow question ... ok (1s) +REPL first use: UI2 refusal ... + UI2: a normal-sized refusal is left by its own visible control ... ok (192ms) + UI2: Enter on the refusal's control leaves it too ... ok (172ms) +REPL first use: UI2 refusal ... ok (364ms) +REPL first use: UI3 ... + UI3: a question that disappears takes its drawer, and answers nothing ... ok (774ms) +REPL first use: UI3 ... ok (774ms) +REPL first use: UI4 ... + UI4: a live question's drawer is refused wherever it cannot belong ... +------- post-test output ------- +P0 standing: [" │entry ",">> Draft:"] +P1 after [history]: [" │entry "," > [↑ earlier]"," > Draft:"] +P2 after marker click: [" │entry "," > [↑ earlier]"," > Draft:"] +P3 after close: ["> Sessions │Transcript "," │entry "," > Draft:"] +----- post-test output end ----- + UI4: a live question's drawer is refused wherever it cannot belong ... ok (1s) +REPL first use: UI4 ... ok (1s) +REPL first use: UI6 ... + UI6: the draft stays visible and intact under a drawer, and is not editable through it ... ok (1s) +REPL first use: UI6 ... ok (1s) +REPL first use: UI7 ... + UI7: leaving strips the drawers only this process could mount ... ok (932ms) +REPL first use: UI7 ... ok (932ms) +REPL first use: UI8 ... + UI8: the whole first-use path, using only what the screen says ... ok (2s) +REPL first use: UI8 ... ok (2s) +REPL first use: C1 narrow ... + C1: submit, answer, dismiss, reopen, settle, Sessions, History, live and exit at 72x20 ... ok (2s) +REPL first use: C1 narrow ... ok (2s) +running 5 tests from ./packages/cli/tests/repl-layout-admission.test.ts +REPL layout: what an empty measurement describes ... + TL2: a measured viewport holds no node, no cell and no target ... ok (13ms) + TL2: capacity describes the region, not whatever is overflowing it ... ok (3ms) + TL2: an action label is measured with the focus marker it draws with ... ok (3ms) +REPL layout: what an empty measurement describes ... ok (25ms) +REPL layout: what a window admits ... + TL3: a row outside the window is in no node, cell, target or Tab stop ... ok (9ms) + TL3: no row is drawn outside the viewport it was admitted to ... ok (3ms) + TL3: earlier and later reach every row, including the last ... ok (29ms) + TL3: the first scroll after a resize moves from the clamp that is drawn ... ok (9ms) +REPL layout: what a window admits ... ok (51ms) +REPL layout: what an action row admits ... + TL4: a row too narrow for everything admits a whole prefix only ... ok (5ms) + TL4: every admitted control is drawn whole, inside the row ... ok (2ms) + TL4: a control the row cannot hold does not let a narrower one past it ... ok (1ms) +REPL layout: what an action row admits ... ok (9ms) +REPL layout: what a shrinking reading leaves behind ... + TL5: cells a filtered reading vacates are blank, not merely undescribed ... ok (5ms) + TL5: the rows that remain are still drawn where the frame says ... ok (4ms) +REPL layout: what a shrinking reading leaves behind ... ok (10ms) +REPL layout: the profiles this product supports ... + TL1: every supported size keeps its columns and its seven footer rows ... ok (6ms) +REPL layout: the profiles this product supports ... ok (6ms) +running 1 test from ./packages/cli/tests/repl-lifecycle.test.ts +Tier L — the reading one entry leaves behind ... + L1: a repeated element is two calls, never one overwritten by the other ... ok (71ms) + L1: a nested element is a child of the call that reached it ... ok (38ms) + L2: an element waiting on a question says so, and stops when it is answered ... ok (37ms) + L2: ordinary work is not a wait ... ok (21ms) + L3: an entry that closes takes its reading, and says it is no longer live ... ok (20ms) + L3: observing changes neither the outcome nor what the document rendered ... ok (42ms) +Tier L — the reading one entry leaves behind ... ok (234ms) +running 6 tests from ./packages/cli/tests/repl-model.test.ts +REPL model: what one journal projects ... + M1: projects an empty journal as an execution with no entry ... ok (3ms) + M2: projects the reference entry into the documented scopes ... ok (67ms) + M1: deep-freezes the model and reprojects the same journal identically ... ok (30ms) + M3: holds only frozen copies, and leaves the events exactly as they were ... ok (27ms) + M1: a selected prefix shows only what that prefix admitted ... ok (34ms) + M1: offers a checkpoint for each selectable position, in append order ... ok (27ms) +REPL model: what one journal projects ... ok (195ms) +REPL model: the histories it refuses ... + M1: refuses a marker this journal does not hold, rather than showing the head ... ok (24ms) + M1: refuses work outside an entry boundary, and a repeated close ... ok (23ms) + M1: refuses a payload it cannot read, and exposes no partial model ... ok (24ms) + M2: refuses an owning source position that was removed or points elsewhere ... ok (24ms) + M2: refuses a source position that will not read at all ... ok (27ms) + E1: refuses an answered question that retains no schema ... ok (25ms) + E1: a refused answer leaves no answered question in the projection ... ok (33ms) +REPL model: the histories it refuses ... ok (184ms) +REPL model: the Agent conversations it projects ... + M1: projects each retained Prompt as one turn owned by its exact scope ... ok (49ms) + M1: groups conversations by session key and by nothing else ... ok (46ms) + M1: orders the chronology by sequence where append order disagrees ... ok (46ms) + M1: settlement contributes one semantic transcript row and checkpoint ... ok (42ms) + M3: one retained turn is one object, however it is reached ... ok (39ms) + M3: Agent values are frozen copies, and the events come out unchanged ... ok (32ms) +REPL model: the Agent conversations it projects ... ok (256ms) +REPL model: the Agent histories it refuses ... + M2: a prefix before a Prompt append holds no turn, and after it holds all of it ... ok (34ms) + M2: refuses a Prompt record it cannot read, and exposes no partial model ... ok (36ms) + M2: refuses duplicate Prompt sequences instead of guessing from append order ... ok (33ms) + M2: refuses an audit it cannot read rather than reading it as none ... ok (32ms) + M2: refuses a Prompt whose owner cannot be decided, and never guesses one ... ok (34ms) + M2: a marker this journal does not hold refuses rather than showing the head ... ok (34ms) +REPL model: the Agent histories it refuses ... ok (203ms) +REPL model: the declared sources it owns ... + M3: a declared component's retained origin and bytes become its scope ... ok (0ms) + M3: the optional exact disposition is read, and only as `true` ... ok (1ms) + M3: a missing, malformed, repointed or duplicated source owns nothing ... ok (0ms) + M3: a position naming both a path and a generated fragment is malformed ... ok (0ms) +REPL model: the declared sources it owns ... ok (2ms) +REPL model: which generated fragment owns pathless work ... + GS1: one fragment's own work projects under it ... ok (0ms) + GS2: two sequential fragments become the scopes their own ids name ... ok (0ms) + GS3: sibling admissions keep their own work whatever order they settle in ... ok (1ms) + GS4: a fragment that spawns keeps the work its descendants performed ... ok (0ms) + GS5: every way a history names no one fragment refuses whole ... ok (1ms) + GS6: projecting the same history twice reproduces the same hierarchy ... ok (1ms) +REPL model: which generated fragment owns pathless work ... ok (4ms) +running 12 tests from ./packages/cli/tests/repl-presentation-style.test.ts +REPL presentation: what one row's cells say it is ... + G1: output, metadata and the two outcomes are four different readings ... ok (94ms) + G1: a settled document's recorded result is output, not an outcome ... ok (33ms) + G1: a root that recorded no result shows its outcome and its reason ... ok (43ms) + G1: an entry that never closed reads as waiting, and says so ... ok (45ms) + G1: an empty screen's placeholders are subordinate, and the draft is a surface ... ok (10ms) + G1: the History band keeps its own surface and accent at every size ... ok (45ms) +REPL presentation: what one row's cells say it is ... ok (276ms) +REPL presentation: selection and focus are two different facts ... + G2: a selected entry stays selected while focus is somewhere else ... ok (32ms) + G2: focus moving onto the selected row leaves its selection alone ... ok (34ms) + G2: a pointer and Enter on one row ask for the same thing ... ok (33ms) +REPL presentation: selection and focus are two different facts ... ok (101ms) +REPL presentation: what an updated frame leaves behind ... + G5: a long reading, then a short one, then a closed drawer, is fresh-C ... ok (46ms) + G5: an open drawer's interior is opaque inside the bounds the engine gave it ... ok (37ms) + G5: the grid it all rests on retains the attributes a cell was written under ... ok (0ms) +REPL presentation: what an updated frame leaves behind ... ok (86ms) +REPL presentation: the panes a reading is laid out in ... + P1: each shared column is named, and says so while it is empty ... ok (31ms) + P1: a narrow frame has no pane to name, and names none ... ok (24ms) + P1: a row is built to the inside of its pane, not to the pane ... ok (30ms) + P2: the footer keeps seven rows, and the draft says what it is ... ok (34ms) + P2: the draft is marked unfocused when focus is elsewhere ... ok (26ms) + P3: the dedicated location is drawn nowhere and reserves nothing ... ok (34ms) +REPL presentation: the panes a reading is laid out in ... ok (182ms) +REPL presentation: what a drawer says it is showing ... + D1: a binding drawer names the kind of reading and the binding ... ok (35ms) + D1: a recorded answer says so, and keeps the origin it came from ... ok (54ms) + D1: History names itself, and its rows keep the band's own accent ... ok (26ms) + D2: a drawer's actions sit on their own surface, and only one is focused ... ok (36ms) + D3: a recorded position reads as history, and returning live clears it ... ok (34ms) +REPL presentation: what a drawer says it is showing ... ok (189ms) +REPL presentation: a row stays inside the pane it was measured for ... + R3: long metadata is fitted, and the row beneath it is its own ... ok (20ms) +REPL presentation: a row stays inside the pane it was measured for ... ok (20ms) +REPL presentation: the one guidance row ... + R6: what the row must say fits the room it was measured for, whole ... ok (30ms) +REPL presentation: the one guidance row ... ok (31ms) +REPL presentation: what the characters of a reading are ... + P1-T1: a source row's delimiters, names, values and references are each their own ... ok (30ms) + P1-T1: a binding's JSON is read as JSON, escapes and all ... ok (15ms) + P1-T1: an unfinished draft keeps every character it has ... ok (24ms) +REPL presentation: what the characters of a reading are ... ok (69ms) +REPL presentation: focus marks the row without repainting it ... + P1-T2: a focused draft keeps its token colours while the marker is the cyan ... ok (27ms) +REPL presentation: focus marks the row without repainting it ... ok (27ms) +REPL presentation: the surfaces a reading is drawn on ... + P1-T3: an empty screen's panes, edges and uncovered area are each their own ... ok (27ms) + P1-T3: a question drawer is bounded, named as waiting, and read in groups ... ok (33ms) + P1-T3: a shorter reading and a closed drawer leave nothing behind ... ok (38ms) +REPL presentation: the surfaces a reading is drawn on ... ok (101ms) +REPL presentation: decoration the frame measured ... + P1-T4: the drawer's rule and inset are measured, and every row lands inside them ... ok (24ms) + P1-T4: a reading longer than the decorated window is in no cell and no target ... ok (14ms) +REPL presentation: decoration the frame measured ... ok (39ms) +REPL presentation: a row the frame cannot hold whole ... + P1-T1: an overflowing source row keeps its roles and every character it shows ... ok (31ms) + P1-T2: an overflowing focused row keeps its cue and its roles ... ok (35ms) + P1-T3: a populated field keeps its name and its value apart at 72x20 ... ok (33ms) + P1-T1: a row the drawer does hold is read the same way ... ok (29ms) +REPL presentation: a row the frame cannot hold whole ... ok (128ms) +running 5 tests from ./packages/cli/tests/repl-route.test.ts +REPL route: the grammar ... + R1: decodes equivalent spellings and query orders into one route ... ok (3ms) + R1: round-trips every valid surface through one canonical spelling ... ok (1ms) + R1: refuses what the grammar cannot say ... ok (1ms) + R1: cannot spell a route the grammar would refuse ... ok (2ms) + ER1: one location carries entry, scope, draft, surface, drawer, filter and position ... ok (0ms) +REPL route: the grammar ... ok (14ms) +REPL route: resolving against one model ... + M3: returns the exact objects the model holds ... ok (67ms) + M3: the same view results from a journal read a second time ... ok (29ms) + R2: resolves a historical prefix and refuses a live question inside it ... ok (26ms) + R2: refuses a missing entry, scope, binding or incomplete path ... ok (32ms) + R2: a route selecting another prefix than the model refuses rather than answering ... ok (25ms) + R2: a refused navigation leaves the resolved view it was asked from untouched ... ok (25ms) + R2: the empty Sessions surface selects nothing at all ... ok (23ms) + ER1: a draft resolves beside an admitted entry, its scope and a frozen position ... ok (23ms) + ER1: an entry absent from the selected prefix refuses, whole ... ok (28ms) +REPL route: resolving against one model ... ok (280ms) +REPL route: a live question's drawer belongs to one place ... + UI4: resolution refuses what the grammar refuses, before anything adopts it ... ok (25ms) +REPL route: a live question's drawer belongs to one place ... ok (25ms) +REPL route: the conversation filter ... + R1: encodes session last, after every member that was canonical before it ... ok (1ms) + R1: leaves every location that names no conversation byte-identical ... ok (0ms) + R1: reads query members by name, so order still does not matter ... ok (0ms) + R1: refuses an empty, repeated or unspellable conversation ... ok (0ms) + R1: the permission drawer belongs to Sessions, carries nothing, and is one word ... ok (1ms) +REPL route: the conversation filter ... ok (3ms) +REPL route: resolving a conversation ... + R2: resolves a retained conversation to the exact group the model holds ... ok (39ms) + R2: resolves a live key only at the head, and only when the process says so ... ok (32ms) + R2: a historical prefix answers from its own retained groups and ignores the head ... ok (32ms) + R2: a conversation no turn ever joined cannot be selected ... ok (31ms) + R2: a refused filter leaves the standing route and selection untouched ... ok (33ms) + R2: a live permission drawer is live-only, and independent of a live question ... ok (32ms) + R2: the two live facts stay independent of each other ... ok (20ms) +REPL route: resolving a conversation ... ok (219ms) +running 11 tests from ./packages/cli/tests/repl-terminal.test.ts +REPL terminal: responsive semantic frames ... + F1: a wide frame carries the sidebar, transcript, inspection and fixed footer ... ok (15ms) + F1: a medium frame keeps every region, narrower ... ok (4ms) + F1: a narrow frame routes one content surface and keeps the drawer and footer ... ok (5ms) + F1: narrow shows the routed surface, and no other surface is reachable ... ok (6ms) + F1: below the minimum the frame is an explicit refusal with nothing targetable ... ok (4ms) + F1: Sessions says so when there is nothing in it ... ok (2ms) + F1: compact geometry groups marker labels and keeps every marker's identity ... ok (8ms) + F1: resizing through every profile keeps selection, nodes and action identity ... ok (9ms) + UI5: the History band is placed in the footer, not at the frame's origin ... ok (6ms) + UI5: a refusal has no band to place and no cell to aim at ... ok (1ms) + UI5: every visible action has its own geometry in the frame's target map ... ok (5ms) + F1: a pointer against a control the refusal hides reaches nothing ... ok (3ms) +REPL terminal: responsive semantic frames ... ok (80ms) +REPL terminal: frame and renderer ownership ... + H1: a frame advances only once every subscriber has applied the last one ... ok (45ms) + H1: a subscriber holding a frame holds the whole stream until it applies it ... ok (37ms) + H1: cancelling a holder drops its demand without claiming it applied anything ... ok (36ms) + H1: no demand outlives a subscription, at any turn of its life ... ok (102ms) + H1: a settled tree schedules no timer at all ... ok (36ms) + H1: a cross-component animation belongs to exactly its nearest common ancestor ... ok (15ms) + H1: rendered bytes are copied out before the engine reuses its view ... ok (6ms) + H1: what a caller does to bytes it holds cannot change a later render ... ok (10ms) + H1: a frame drawn after a removal draws only what is still mounted ... ok (3ms) + H1: capacity replacement redraws the identical logical frame ... ok (296ms) +REPL terminal: frame and renderer ownership ... ok (604ms) +REPL terminal: releasing this host's standard input ... + UI2: a cancellation that fails is a terminal failure, not a quiet exit ... ok (4ms) + UI2: a lock that will not release is a terminal failure too ... ok (3ms) + UI2: a release that fails fabricates no end of input, and restores once ... ok (13ms) + UI2: releasing is attempted once, however many times teardown runs ... ok (3ms) +REPL terminal: releasing this host's standard input ... ok (24ms) +REPL terminal: an owned input stream, and what releasing it costs ... + UI2: cleanup cancels the read it was holding, with no further byte ... ok (19ms) + UI2: the owner does not return until the stream's cleanup has finished ... ok (15ms) + UI2: end of input closes the stream and leaves nothing holding the terminal ... ok (18ms) + UI2: a read that fails is a terminal failure, and still releases everything ... ok (18ms) +REPL terminal: an owned input stream, and what releasing it costs ... ok (70ms) +REPL terminal: one suspension per chunk, buffered or not ... + UI2: a ready continuation runs between two chunks that were already waiting ... ok (5ms) +REPL terminal: one suspension per chunk, buffered or not ... ok (6ms) +REPL terminal: giving the terminal back ... + H2: a run that finishes stops the reader, drops every listener and resets once ... ok (19ms) + H2: a refusal restores everything a success would have ... ok (19ms) + H2: a failure restores everything before it propagates ... ok (18ms) + H2: a cancellation restores everything, including a reader mid-read ... ok (15ms) + H2: end of input is a lifecycle outcome, and shuts down like the others ... ok (12ms) + H2: a cancellation during registration leaves no half-taken terminal ... ok (15ms) + H2: no reader and no resize listener outlives a cancellation, at any turn ... ok (159ms) + H2: nothing survives its owner, even the modes it never finished applying ... ok (21ms) +REPL terminal: giving the terminal back ... ok (279ms) +REPL terminal: what the host normalizes, and what it refuses to guess ... + I1: a key becomes a normalized event and a mouse press becomes a position ... ok (4ms) + I1: typed and pasted text arrives as text, in the order the terminal sent it ... ok (32ms) + I1: a chord types nothing, whatever letter it was pressed with ... ok (31ms) + I1: a shifted Tab goes backward, whichever way the terminal spells it ... ok (33ms) + I1: what a shifted Tab normalizes to actually moves focus back ... ok (3ms) + I1: going back inside a drawer stays inside it ... ok (3ms) + I1: text and Backspace reach the draft through the same ancestry as a key ... ok (2ms) + I1: text a row does not claim passes it on the way up ... ok (3ms) + I1: a lone Escape waits for the decoder's latency and then arrives ... ok (19ms) + I1: bytes that follow a pending Escape are rescanned with it, not split ... ok (12ms) + I1: a resize is a size the host reports, not a key anybody claims ... ok (4ms) + I1: a key and a click on one control produce one action ... ok (2ms) + I1: a pointer outside the open drawer reaches nothing ... ok (3ms) + I1: a pointer resolved against a frame the tree has moved past reaches nothing ... ok (2ms) + I1: a pointer naming a node the tree removed reaches nothing ... ok (3ms) +REPL terminal: what the host normalizes, and what it refuses to guess ... ok (158ms) +REPL terminal: what a drawer covers, and what it cannot reach ... + TL6: a drawer obscures the whole of its rectangle, blank cells included ... ok (5ms) + TL6: the footer is never covered, and a narrow start behaves the same ... ok (4ms) + TL6: a resize round trip keeps the drawer covering what it covers ... ok (10ms) + TL7: with engine capture off, dispatch behind the modal is still dropped ... ok (3ms) + TL7: traversal inside an open drawer visits only its own descendants ... ok (2ms) +REPL terminal: what a drawer covers, and what it cannot reach ... ok (26ms) +REPL terminal: committed geometry, and what it promises ... + TL8: every target's bounds are whole cells at every profile ... ok (15ms) + TL8: the trailing edge of a target belongs to whatever is after it ... ok (5ms) + TL8: an older frame's geometry does not move when a later frame is drawn ... ok (8ms) + TL11: exactly two engines are acquired, and reused for every frame ... ok (12ms) +REPL terminal: committed geometry, and what it promises ... ok (42ms) +REPL terminal: a measurement that does not commit ... + TL9: a held measurement mounts nothing, draws nothing and acknowledges nothing ... ok (9ms) + TL9: a measurement that fails mounts nothing and publishes no target ... ok (1ms) +REPL terminal: a measurement that does not commit ... ok (16ms) +REPL terminal: a frame that cannot be placed on cell boundaries ... + TL8: a fractional placement is refused, not rounded into a hit box ... ok (2ms) +REPL terminal: a frame that cannot be placed on cell boundaries ... ok (2ms) +running 3 tests from ./packages/cli/tests/run-composition-deno.test.ts +ORC7 — a Session launched in a managed Worktree ... + hands the launch that worktree's own root and a session key of its own ... ok (570ms) +ORC7 — a Session launched in a managed Worktree ... ok (575ms) +ORC18 — the journal is diagnostic ... + performs the same live work with and without a trace, once each ... ok (3s) +ORC18 — the journal is diagnostic ... ok (3s) +ORC15 — a trace is not evidence ... + refuses a PullRequest handed the trace of an execution that really published ... ok (1s) +ORC15 — a trace is not evidence ... ok (1s) +running 1 test from ./packages/cli/tests/run-composition-nested.test.ts +ORC19 — a nested run profile ... + stands the child where the document is, not where the process is ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + + + + + +----- post-test output end ----- + stands the child where the document is, not where the process is ... ok (2s) + does not let one child's Push authorize its sibling ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + + + + + + + +----- post-test output end ----- + does not let one child's Push authorize its sibling ... ok (3s) + gives a child its own lease owner, and keeps the parent's when it ends ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + + + + + + + + + +----- post-test output end ----- + gives a child its own lease owner, and keeps the parent's when it ends ... ok (2s) + does not let a parent's Push authorize its child ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + + + + + + + +----- post-test output end ----- + does not let a parent's Push authorize its child ... ok (3s) + does not let a child's Push authorize its parent ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + is not authorized by what this execution published: this execution holds no successful result for the branch and commit it would open a pull request from. Write before : a pull request names work this execution published, and publishing it is an explicit act. Nothing was observed at the Git host, and no pull request was created. +----- post-test output end ----- + does not let a child's Push authorize its parent ... ok (3s) + refuses outside a repository when nothing places the child in one ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + +----- post-test output end ----- + refuses outside a repository when nothing places the child in one ... ok (1s) +ORC19 — a nested run profile ... ok (15s) +running 4 tests from ./packages/cli/tests/run-composition.test.ts +ORC1 — describing the vocabulary reaches nothing ... + builds the catalog without a subprocess, a service, a request or a lock ... ok (185ms) + leaves every repository operation unprovided after inspection ... ok (61ms) +ORC1 — describing the vocabulary reaches nothing ... ok (248ms) +ORC2 — one language, described everywhere and operated somewhere ... + registers the same thirteen declarations the syntax catalog describes ... ok (114ms) + reports an absent provider for every repository operation, and mutates nothing ... ok (464ms) + leaves working, because it needs no provider at all ... ok (43ms) +ORC2 — one language, described everywhere and operated somewhere ... ok (623ms) +ORC2 — Dir is operational where the repository provider is not ... + creates the directory and runs its content with no repository provider ... ok (46ms) + refuses a non-directory target without a repository provider ... ok (44ms) +ORC2 — Dir is operational where the repository provider is not ... ok (90ms) +ORC2 — where the managed root is ... + names ~/.xmd/repositories and nothing a document can influence ... ok (41ms) +ORC2 — where the managed root is ... ok (41ms) +running 1 test from ./packages/cli/tests/run-deadline.test.ts +Tier RD — the run deadline ... + RD1: a malformed duration is refused before the run opens anything ... ok (7ms) + RD1a: the same holds for --timeout-exec and --timeout-fetch ... ok (4ms) + RD2: the deadline cancels a run suspended in its first read ... ok (209ms) + RD3: a run cancelled in preparation installs no provider and authors nothing ... ok (207ms) + RD4: an enclosing deadline bounds a run that named none ... ok (207ms) + RD5: an invalid enclosing deadline fails before the first read ... ok (3ms) + RD6: the command line's deadline outranks the enclosing one ... ok (205ms) + RD7: the run resolves its deadline exactly once ... ok (206ms) + RD8: teardown completes before the timeout is reported ... ok (206ms) + RD9: --timeout-fetch bounds a Fetch performed inside the run ... +------- post-test output ------- +# Doc +----- post-test output end ----- + RD9: --timeout-fetch bounds a Fetch performed inside the run ... ok (354ms) +Tier RD — the run deadline ... ok (1s) +running 1 test from ./packages/cli/tests/run-profile.test.ts +the bundled run profile ... + carries the bundled Plugin for the commands that reach a document ... ok (2ms) + carries it for the workflow actions that execute a document ... ok (1ms) + carries it for no workflow action that only reads or manages runs ... ok (1ms) + carries it for neither the test root nor a command that runs nothing ... ok (0ms) + resolves the reserved selector without loading anything ... ok (1ms) + gives a nested run child the bundled prefix without duplicating it ... ok (1ms) + refuses an impostor claiming the bundled name rather than dropping it ... ok (0ms) + leaves the selector's own spelling to the host, not a registry ... ok (1ms) +the bundled run profile ... ok (11ms) +running 1 test from ./packages/cli/tests/run-timeouts.test.ts +Tier TF — run timeout options ... + TF1: every option is absent until it is written ... ok (2ms) + TF2: each option fills its own field and no other ... ok (1ms) + TF3: the three compose without touching one another ... ok (0ms) + TF4: a value that is not a duration fails the invocation and names the option ... ok (2ms) + TF5: --timeout cancels the whole run ... +------- post-test output ------- +the run exceeded its --timeout of 500ms and was cancelled +----- post-test output end ----- + TF5: --timeout cancels the whole run ... ok (1s) + TF6: --timeout-exec bounds the block, and the run deadline is not what fired ... +------- post-test output ------- +exec(bash) timed out after 500ms +----- post-test output end ----- + TF6: --timeout-exec bounds the block, and the run deadline is not what fired ... ok (1s) + TF7: --timeout-fetch is not an exec timeout ... +------- post-test output ------- +SLEPT +----- post-test output end ----- + TF7: --timeout-fetch is not an exec timeout ... ok (1s) + TF8: a block's own duration overrides --timeout-exec for that block alone ... +------- post-test output ------- +DECLARED_FINISHED + +exec(bash) timed out after 500ms +----- post-test output end ----- + TF8: a block's own duration overrides --timeout-exec for that block alone ... ok (2s) + TF9: a longer exec timeout cannot outlive the run deadline ... +------- post-test output ------- +the run exceeded its --timeout of 500ms and was cancelled +----- post-test output end ----- + TF9: a longer exec timeout cannot outlive the run deadline ... ok (1s) + TF10: a bare timeout with no --timeout-exec refuses ... +------- post-test output ------- +`timeout` names no duration and the run configured none — write `timeout=` on the block, or start the run with --timeout-exec= +----- post-test output end ----- + TF10: a bare timeout with no --timeout-exec refuses ... ok (789ms) + TF11: a malformed option value is refused before the document is inspected ... +------- post-test output ------- +--timeout-exec must be a duration like 500ms, 30s, or 5min, got "30 seconds" +invalid props schema: schema is invalid: data/properties/who/type must be equal to one of the allowed values, data/properties/who/type must be array, data/properties/who/type must match a schema in anyOf +----- post-test output end ----- + TF11: a malformed option value is refused before the document is inspected ... ok (1s) +Tier TF — run timeout options ... ok (9s) +running 1 test from ./packages/cli/tests/secret-detection-cli.test.ts +Tier SD — the CLI secret-detection opt-out ... + SD1: xmd run refuses a credential-shaped document by default ... +------- post-test output ------- +secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:207 +Fix the code or data flow that produced it. +----- post-test output end ----- + SD1: xmd run refuses a credential-shaped document by default ... ok (745ms) + SD2: --no-secret-detection runs the same document ... +------- post-test output ------- +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. +----- post-test output end ----- + SD2: --no-secret-detection runs the same document ... ok (726ms) + SD3: the implicit run form honours the option in both directions ... +------- post-test output ------- +secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:207 +Fix the code or data flow that produced it. +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. +----- post-test output end ----- + SD3: the implicit run form honours the option in both directions ... ok (1s) + SD4: the inline form honours the option in both directions ... +------- post-test output ------- +secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:203 +Fix the code or data flow that produced it. +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. +----- post-test output end ----- + SD4: the inline form honours the option in both directions ... ok (1s) + SD5: xmd test on one document is default-on and honours the opt-out ... +------- post-test output ------- +secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:272 +Fix the code or data flow that produced it. +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + + + +> ✅ **Assert** passed +> actual: true + + + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. +----- post-test output end ----- + SD5: xmd test on one document is default-on and honours the opt-out ... ok (1s) + SD6: xmd test on a directory is default-on and honours the opt-out ... +------- post-test output ------- + +# a.test.md + +a.test.md: secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:272 +Fix the code or data flow that produced it. + +# b.test.md + +b.test.md: secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:272 +Fix the code or data flow that produced it. + +2 of 2 documents failed +WARNING: secret detection is disabled; credentials may be persisted. + +# a.test.md + +# Tainted + + + +> ✅ **Assert** passed +> actual: true + + + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. + +# b.test.md + +# Tainted + + + +> ✅ **Assert** passed +> actual: true + + + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. +----- post-test output end ----- + SD6: xmd test on a directory is default-on and honours the opt-out ... ok (1s) + SD7: a directory run warns exactly once, however many documents it holds ... +------- post-test output ------- +WARNING: secret detection is disabled; credentials may be persisted. + +# a.test.md + +# Tainted + + + +> ✅ **Assert** passed +> actual: true + + + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. + +# b.test.md + +# Tainted + + + +> ✅ **Assert** passed +> actual: true + + + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. +----- post-test output end ----- + SD7: a directory run warns exactly once, however many documents it holds ... ok (791ms) + SD8: the warning is stderr's alone and never carries the credential ... +------- post-test output ------- +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. +----- post-test output end ----- + SD8: the warning is stderr's alone and never carries the credential ... ok (759ms) + SD9: help lists the option a caller writes, on both commands ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +Usage: xmd test [OPTIONS] [path] + +Arguments: + [path] markdown document or directory to test (defaults to the current directory) [default: .] + +Options: + --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + SD9: help lists the option a caller writes, on both commands ... ok (1s) + SD10: with detection on, the offending event never reaches the journal ... +------- post-test output ------- +secret detection rejected content before it was persisted: + @secretlint/secretlint-rule-github at 1:207 +Fix the code or data flow that produced it. +----- post-test output end ----- + SD10: with detection on, the offending event never reaches the journal ... ok (800ms) + SD11: with detection off, the same event reaches the journal ... +------- post-test output ------- +WARNING: secret detection is disabled; credentials may be persisted. +# Tainted + +The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. +----- post-test output end ----- + SD11: with detection off, the same event reaches the journal ... ok (804ms) + SD12: the value form is refused rather than silently read as enabled ... +------- post-test output ------- +--secret-detection does not take a value — secret detection is on by default, and `--no-secret-detection` is what turns it off +--no-secret-detection does not take a value — secret detection is on by default, and `--no-secret-detection` is what turns it off +----- post-test output end ----- + SD12: the value form is refused rather than silently read as enabled ... ok (1s) +Tier SD — the CLI secret-detection opt-out ... ok (13s) +running 1 test from ./packages/cli/tests/service-document.test.ts +attached service document integration ... + reconstructs a real attached service on partial replay and skips completed replay ... ok (290ms) + keeps a two-attachment ping-pong chain live across partial replay ... ok (447ms) + supervises an attached service that exits during projected content without restarting it ... ok (130ms) + fails projected content promptly, tears down retained service attachments, and does not restart ... ok (251ms) + tears down nested service attachments from inner lifetime to outer lifetime ... ok (203ms) +attached service document integration ... ok (1s) +running 1 test from ./packages/cli/tests/service-host.test.ts +attached service host adapter ... + forwards split ordinary bytes immediately and suppresses split handshake records ... ok (3ms) + bounds and suppresses an invalid handshake candidate ... ok (0ms) + starts genuinely concurrent service attachments and suppresses handshake records ... ok (111ms) + categorizes startup failures without exposing handshake records ... ok (866ms) + cancels startup and releases the child before the handshake ... ok (95ms) + cancels after the handshake and releases the child listener ... ok (99ms) + forwards unterminated ordinary stdout while the attached service is active ... ok (82ms) + translates an observable process teardown failure ... ok (2ms) + preserves an execution failure beside a translated teardown failure ... ok (2ms) + fails the owning scope when an attached process exits or repeats the handshake ... ok (186ms) +attached service host adapter ... ok (1s) +running 1 test from ./packages/cli/tests/session-launch-cli.test.ts +Tier CL — Session.Launch from the command line ... + CL1: help lists the roles and installs no agent or launcher ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in AGENTS.md + + AGENTS.md#Implementor + The implementor makes changes according to the approved plan. + + AGENTS.md#Architect + The architect reviews settled structural invariants. +----- post-test output end ----- + CL1: help lists the roles and installs no agent or launcher ... ok (1s) + CL2: a piped invocation refuses before any agent is resolved ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +# Repository Agents + +PREAMBLE_MARKER + +## Implementor + +The implementor makes changes according to the approved plan. + + needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. +----- post-test output end ----- + CL2: a piped invocation refuses before any agent is resolved ... ok (1s) + CL3: selecting one role excludes its sibling's preparation ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +# Repository Agents + +PREAMBLE_MARKER + +## Implementor + +The implementor makes changes according to the approved plan. + + needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. +----- post-test output end ----- + CL3: selecting one role excludes its sibling's preparation ... ok (1s) + CL4: nothing changes for a document that launches nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +PLAIN_MARKER + +This document launches nothing. +----- post-test output end ----- + CL4: nothing changes for a document that launches nothing ... ok (1s) + CL5: no behavior is keyed to the filename ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +# Repository Agents + +PREAMBLE_MARKER + +## Architect + +The architect reviews settled structural invariants. + + needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. +----- post-test output end ----- + CL5: no behavior is keyed to the filename ... ok (1s) +Tier CL — Session.Launch from the command line ... ok (7s) +running 1 test from ./packages/cli/tests/stdin-cli.test.ts +Tier SI — standard-input root documents ... + SI1: a piped document reaches end of file and runs once ... ok (730ms) + SI2: the separator form selects standard input too ... ok (718ms) + SI3: the whole input is read, and preflight costs the earlier effect ... ok (703ms) + SI4: empty input is an empty root that emits nothing and does nothing ... ok (734ms) + SI5: the root reports and retains the exact supplied source ... ok (1s) + SI6: relative resolution is the invocation's, and is no file ... ok (726ms) + SI7: the ordinary run options apply to a document read from stdin ... ok (4s) + SI11: a value root read from stdin reserves stdout for its result ... ok (1s) + SI10: only a selected stdin root reads, and reading it executes nothing ... ok (623ms) + SI8: a failed read reports the fixed sentence and reaches nothing after it ... +------- post-test output ------- +READ_ME + + + +----- post-test output end ----- + SI8: a failed read reports the fixed sentence and reaches nothing after it ... ok (211ms) + SI9: cancelling a waiting read tears it down and reports no failure ... ok (44ms) + SI1b: the read waits for end of file and joins every chunk ... ok (6ms) + SI13: two roots refuse in either order, before anything is read ... ok (3s) + SI14: one root written twice refuses, and neither copy runs ... ok (1s) + SI15: an option's value, another command's argument and a typo are not roots ... ok (2s) + SI12: cancelling a stdin run returns only once its child is gone ... ok (2s) + SI12b: what a cancelled child writes while it stops is still captured ... ok (57ms) + SI9b: the stream adapter's listeners belong to the read's own scope ... ok (3ms) +Tier SI — standard-input root documents ... ok (21s) +running 1 test from ./packages/cli/tests/stdout-delivery.test.ts +Tier SDL — the listener lives for one delivery ... + SDL1: a delivery that succeeds leaves the stream as it found it ... ok (2ms) + SDL2: the trailing event still finds the listener, which is gone after it ... ok (4ms) + SDL3: the event may arrive first, and the first arrival is the verdict ... ok (0ms) + SDL4: a failure the stream reports once settles without waiting for a second ... ok (1ms) + SDL5: a write that refuses outright detaches too ... ok (0ms) + SDL6: a delivery that never settles detaches when its scope ends ... ok (1ms) + SDL7: no finished delivery absorbs a later, unrelated failure ... ok (0ms) + SDL8: the real process.stdout is left as it was found ... ok (1ms) +Tier SDL — the listener lives for one delivery ... ok (15ms) +running 4 tests from ./packages/cli/tests/syntax-cli.test.ts +Tier SX — the run profile the command describes ... + SX1: names core, Agent, testing and web defaults, and ... ok (140ms) + SX1b: describes once, as the component canonical core owns ... ok (78ms) + ORC1: names all thirteen repository-composition components, with contracts ... ok (114ms) + ORC1: a repository component of the same name shadows the default ... ok (91ms) + SX2: documents every complete built-in in the profile ... ok (124ms) + SX2b: reports the testing contracts as they actually are ... ok (76ms) + SX2b: publishes no terminal-grid construct, and probes no terminal to say so ... ok (70ms) + SX3: describes without minting an execution claimant ... ok (67ms) +Tier SX — the run profile the command describes ... ok (764ms) +Tier SX — the renderers take a value ... + SX4: renders both formats without reaching the filesystem ... ok (69ms) + SX4b: escapes a table cell that would otherwise shift the columns ... ok (0ms) + SX5: renders the same bytes twice from the same symbols ... ok (70ms) + SX6: renders the fixed category headings in order ... ok (68ms) +Tier SX — the renderers take a value ... ok (207ms) +Tier SX — the command line ... + SX7: explicit includes replace the defaults, in caller order ... +------- post-test output ------- +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Only", + "origin": { + "kind": "repository", + "path": "second/Only.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + } + }, + { + "kind": "component", + "name": "Shared", + "origin": { + "kind": "repository", + "path": "first/Shared.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "from the first include." + } + ] + } + ] +} +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Only", + "origin": { + "kind": "repository", + "path": "second/Only.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + } + }, + { + "kind": "component", + "name": "Shared", + "origin": { + "kind": "repository", + "path": "second/Shared.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "from the second include." + } + ] + } + ] +} +----- post-test output end ----- + SX7: explicit includes replace the defaults, in caller order ... ok (1s) + SX8: falls back to components and . when no include is written ... +------- post-test output ------- +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Default", + "origin": { + "kind": "repository", + "path": "components/Default.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + } + } + ] + } + ] +} +----- post-test output end ----- + SX8: falls back to components and . when no include is written ... ok (731ms) + SX8b: an ordinary run observes its own profile and includes, and agrees with the command ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +the first description. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Local.md` +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +the first description. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Local.md` + +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +the second description. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Local.md` + +----- post-test output end ----- + SX8b: an ordinary run observes its own profile and includes, and agrees with the command ... ok (2s) + SX9: reports an unusable include on stderr, exits 1, and prints no symbols ... +------- post-test output ------- +cannot list the components in --include "components": it is not a directory. +----- post-test output end ----- + SX9: reports an unusable include on stderr, exits 1, and prints no symbols ... ok (727ms) + SX16: `xmd syntax Elicit` renders the same text the named component does ... +------- post-test output ------- +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +**Available in this evaluation:** yes + +Asks a person a structured question and returns their answer. + +```mdx + +Which release should ship first? + +``` + +The content is the request shown to the person. `schema` is a JSON Schema the +answer is validated against, so what comes back is the shape the document said +it needed rather than free text a later step has to interpret. The answer binds +through `as`. + +The question is asked once and retained. A run that resumes after the answer was +given restores it rather than asking again, which is what makes a document with +an elicitation in it safe to interrupt. + +How the question reaches a person is the host's: a terminal prompts, and another +host may route it somewhere else entirely. The document states what it needs to +know, not how to ask. +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `AGENTS.md` + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `CLAUDE.md` + +### `` + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `package` | `string` | no | Workspace package to reserve on npm, e.g. packages/workflow | + +```json +{ + "type": "object", + "properties": { + "package": { + "type": "string", + "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", + "description": "Workspace package to reserve on npm, e.g. packages/workflow" + } + }, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `README.md` + was asked to document Nonexistent, which is not a component available here. +----- post-test output end ----- + SX16: `xmd syntax Elicit` renders the same text the named component does ... ok (2s) + SX17: the command and the component read one index, for every package ... +------- post-test output ------- +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +**Available in this evaluation:** yes + +Sends a prompt and renders the reply. + +```mdx +Summarise these release notes in three bullets. +``` + +The paired form sends its content. The reply is rendered where the element is +written, or bound with `as`. Props naming an agent, session or timeout override +the surrounding scope for this one prompt. + +A failed prompt renders what it got and the document continues, because a +partial answer is usually more useful than none. `throwOnError` stops the +document instead, for a prompt whose answer everything after it depends on. +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +**Available in this evaluation:** yes + +Sends a prompt and renders the reply. + +```mdx +Summarise these release notes in three bullets. +``` + +The paired form sends its content. The reply is rendered where the element is +written, or bound with `as`. Props naming an agent, session or timeout override +the surrounding scope for this one prompt. + +A failed prompt renders what it got and the document continues, because a +partial answer is usually more useful than none. `throwOnError` stops the +document instead, for a prompt whose answer everything after it depends on. +----- post-test output end ----- + SX17: the command and the component read one index, for every package ... ok (1s) + SX10: writes markdown by default and version-2 JSON with --json ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +from the first include. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `first/Shared.md` +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Shared", + "origin": { + "kind": "repository", + "path": "first/Shared.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "from the first include." + } + ] + } + ] +} +----- post-test output end ----- + SX10: writes markdown by default and version-2 JSON with --json ... ok (1s) + SX10b: prints neither terminal-grid name as syntax, and a file claiming one as a component ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Default.md` + +### `` + +a repository terminal. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Terminal.md` + +### `` + +a repository grid. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/Terminal/Grid.md` +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Default", + "origin": { + "kind": "repository", + "path": "components/Default.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + } + }, + { + "kind": "component", + "name": "Terminal", + "origin": { + "kind": "repository", + "path": "components/Terminal.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "a repository terminal." + }, + { + "kind": "component", + "name": "Terminal.Grid", + "origin": { + "kind": "repository", + "path": "components/Terminal/Grid.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "a repository grid." + } + ] + } + ] +} +----- post-test output end ----- + SX10b: prints neither terminal-grid name as syntax, and a file claiming one as a component ... ok (1s) + SX12: succeeds with the defaults in a package tree full of directory links ... +------- post-test output ------- +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + "kind": "structural", + "name": "All", + "origin": { + "kind": "structural", + "construct": "All" + }, + "syntax": [ + "……" + ], + "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", + "context": "The `` children this runs at the same time." + }, + { + "kind": "structural", + "name": "Answer", + "origin": { + "kind": "structural", + "construct": "Answer" + }, + "syntax": [ + "", + "…" + ], + "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", + "context": "A multiline template, in place of the single-line `template` prop." + }, + { + "kind": "structural", + "name": "Answers", + "origin": { + "kind": "structural", + "construct": "Answers" + }, + "syntax": [ + "…" + ], + "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", + "context": "`` matchers, and the body they answer for." + }, + { + "kind": "structural", + "name": "Break", + "origin": { + "kind": "structural", + "construct": "Break" + }, + "syntax": [ + "" + ], + "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." + }, + { + "kind": "structural", + "name": "Case", + "origin": { + "kind": "structural", + "construct": "Case" + }, + "syntax": [ + "…", + "…" + ], + "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", + "context": "Markdown expanded when this case is selected." + }, + { + "kind": "structural", + "name": "Content", + "origin": { + "kind": "structural", + "construct": "Content" + }, + "syntax": [ + "", + "" + ], + "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." + }, + { + "kind": "structural", + "name": "Each", + "origin": { + "kind": "structural", + "construct": "Each" + }, + "syntax": [ + "…" + ], + "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", + "as": "Optional. Captures the whole rendered loop instead of emitting it.", + "context": "Markdown rendered once per element." + }, + { + "kind": "structural", + "name": "Else", + "origin": { + "kind": "structural", + "construct": "Else" + }, + "syntax": [ + "…" + ], + "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", + "context": "The branch taken when the enclosing condition does not hold." + }, + { + "kind": "structural", + "name": "If", + "origin": { + "kind": "structural", + "construct": "If" + }, + "syntax": [ + "…" + ], + "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", + "context": "The branch taken when the condition holds, up to an ``." + }, + { + "kind": "structural", + "name": "Let", + "origin": { + "kind": "structural", + "construct": "Let" + }, + "syntax": [ + "…", + "" + ], + "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", + "as": "Required. The binding name the value is available under.", + "context": "Markdown whose rendered text becomes the binding, in the paired form." + }, + { + "kind": "structural", + "name": "Loop", + "origin": { + "kind": "structural", + "construct": "Loop" + }, + "syntax": [ + "…" + ], + "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", + "context": "Markdown expanded once per iteration." + }, + { + "kind": "structural", + "name": "Output", + "origin": { + "kind": "structural", + "construct": "Output" + }, + "syntax": [ + "…" + ], + "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", + "context": "The rendered output the run presents." + }, + { + "kind": "structural", + "name": "PrintErrors", + "origin": { + "kind": "structural", + "construct": "PrintErrors" + }, + "syntax": [ + "…" + ], + "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", + "context": "The region whose failures are printed rather than raised." + }, + { + "kind": "structural", + "name": "Return", + "origin": { + "kind": "structural", + "construct": "Return" + }, + "syntax": [ + "" + ], + "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." + }, + { + "kind": "structural", + "name": "Spawn", + "origin": { + "kind": "structural", + "construct": "Spawn" + }, + "syntax": [ + "…" + ], + "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", + "context": "Markdown expanded in its own child, beside its siblings." + }, + { + "kind": "structural", + "name": "Switch", + "origin": { + "kind": "structural", + "construct": "Switch" + }, + "syntax": [ + "…" + ], + "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", + "context": "Direct `` branches considered in source order." + } + ] + }, + { + "kind": "built-in", + "entries": [ + { + "kind": "component", + "name": "Agent", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", + "context": "Markdown whose prompts and launches use this agent." + }, + { + "kind": "component", + "name": "AgentProvider", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", + "context": "Markdown expanded with this provider installed." + }, + { + "kind": "component", + "name": "ApproveAll", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", + "context": "Markdown whose permission requests are approved." + }, + { + "kind": "component", + "name": "AskPermission", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", + "context": "Markdown whose permission requests are asked about." + }, + { + "kind": "component", + "name": "Assert", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertExists", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertFalse", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "expr" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreater", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertGreaterOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLess", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertLessOrEqual", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertNotMatch", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." + }, + { + "kind": "component", + "name": "AssertNotStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStrictEquals", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertStringIncludes", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [ + "actual", + "expected" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", + "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", + "context": "The expected value, in place of the `expected` prop." + }, + { + "kind": "component", + "name": "AssertThrows", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "message" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", + "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", + "context": "The Markdown expected to fail." + }, + { + "kind": "component", + "name": "CodeBlock", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", + "as": "Optional. Captures the exact fenced Markdown instead of emitting it." + }, + { + "kind": "component", + "name": "CollectJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", + "as": "Required. The journal snapshot." + }, + { + "kind": "component", + "name": "CollectOutput", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", + "as": "Required. The child's accumulated output." + }, + { + "kind": "component", + "name": "DiagnosticJournal", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." + }, + { + "kind": "component", + "name": "Dir", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a directory. `…` changes the working directory for its content.", + "context": "The Markdown expanded in that directory." + }, + { + "kind": "component", + "name": "Elicit", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Ask a person a structured question. `…` shows the content as the request.", + "as": "Required. The validated answer, as a structured value.", + "context": "The request message the person is shown." + }, + { + "kind": "component", + "name": "Evaluate", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Evaluate program text. `` runs it.", + "as": "Optional. Captures the fragment's rendered output instead of emitting it." + }, + { + "kind": "component", + "name": "Execution", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", + "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", + "context": "The declarations for the child, then the assertions about it." + }, + { + "kind": "component", + "name": "Fail", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stop authored work with an actionable failure. `` raises the message where it is written." + }, + { + "kind": "component", + "name": "Fetch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", + "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." + }, + { + "kind": "component", + "name": "File", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", + "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", + "context": "The text to write, in the writing form." + }, + { + "kind": "component", + "name": "File.Delete", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", + "as": "Optional. Captures the empty string this renders, as for any text component." + }, + { + "kind": "component", + "name": "Git.Add", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." + }, + { + "kind": "component", + "name": "Git.Commit", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", + "as": "Optional. The full object id of the commit.", + "context": "The message body, expanded before the commit is made." + }, + { + "kind": "component", + "name": "Git.Push", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." + }, + { + "kind": "component", + "name": "Git.Switch", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Switch or create a branch. `` starts a missing branch at the specified base." + }, + { + "kind": "component", + "name": "Glob", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", + "as": "Required. The matched paths, as a string array." + }, + { + "kind": "component", + "name": "Issue", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] + }, + "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", + "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", + "context": "The issue's description, for the form that files one." + }, + { + "kind": "component", + "name": "IssueTracker", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", + "context": "The Markdown whose issues are filed there." + }, + { + "kind": "component", + "name": "Json", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [ + "value" + ], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Render a value as JSON text. `` writes the JSON where you put it.", + "as": "Optional. Captures the JSON text instead of emitting it." + }, + { + "kind": "component", + "name": "Parse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#" + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", + "as": "Required. The validated value.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Plan", + "origin": { + "kind": "declared-markdown", + "origin": "@executablemd/cli/Plan.md", + "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" + }, + "sourceKind": "declared-markdown", + "inspectability": "complete", + "forms": [ + "paired" + ], + "props": { + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", + "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", + "context": "The complete prompt, expanded once before authorship." + }, + { + "kind": "component", + "name": "Prompt", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", + "as": "Optional. Captures the reply instead of emitting it.", + "context": "The prompt text, in the paired form." + }, + { + "kind": "component", + "name": "PullRequest", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false + }, + "description": "Open or update a pull request. `…` uses its content as the body after ``.", + "as": "Optional. The pull request's repository, number, url, state and head and base commits.", + "context": "The pull request's body." + }, + { + "kind": "component", + "name": "PullRequest.Checks", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", + "as": "Required. Each check's kind, name, head commit and outcome." + }, + { + "kind": "component", + "name": "PullRequest.Comments", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } + }, + "description": "Read pull request comments. `` reads both conversation and review comments.", + "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." + }, + { + "kind": "component", + "name": "PullRequest.Reviews", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } + }, + "description": "Read pull request reviews. `` reads reviews from the specified pull request.", + "as": "Required. Each review's author, state, body, submission time, commit and url." + }, + { + "kind": "component", + "name": "Repository", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Clone or use a repository. `…` expands its content in the specified checkout.", + "as": "Optional. The path of the selected checkout.", + "context": "The Markdown expanded in that checkout." + }, + { + "kind": "component", + "name": "SafeParse", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": { + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] + }, + "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", + "as": "Required. The result: either the validated value or the issues that rejected it.", + "context": "The JSON text to parse." + }, + { + "kind": "component", + "name": "Session", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", + "context": "Markdown whose prompts and launches run in this session." + }, + { + "kind": "component", + "name": "Session.Launch", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", + "context": "The instructions the native session starts from." + }, + { + "kind": "component", + "name": "Syntax", + "origin": { + "kind": "protected", + "origin": "@executablemd/core" + }, + "sourceKind": "protected", + "inspectability": "complete", + "forms": [ + "self-closing" + ], + "props": { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", + "as": "Optional. Captures the rendered text instead of emitting it." + }, + { + "kind": "component", + "name": "TempDir", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", + "as": "Optional. Captures the rendered directory path instead of emitting it.", + "context": "Markdown expanded with the temporary directory as its working directory." + }, + { + "kind": "component", + "name": "Test", + "origin": { + "kind": "registered", + "origin": "@executablemd/core", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", + "context": "The body of the test: its assertions and the work they judge." + }, + { + "kind": "component", + "name": "Testing", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", + "context": "The Markdown expanded in testing mode." + }, + { + "kind": "component", + "name": "Verbose", + "origin": { + "kind": "registered", + "origin": "@executablemd/cli", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", + "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." + }, + { + "kind": "component", + "name": "WebForm", + "origin": { + "kind": "registered", + "origin": "@executablemd/web", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "value", + "returns": {}, + "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", + "as": "Required. The validated response.", + "context": "The Markdown shown above the form." + }, + { + "kind": "component", + "name": "WorkflowRun", + "origin": { + "kind": "registered", + "origin": "@executablemd/testing", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", + "context": "The workflow-hosted executions this scope owns." + }, + { + "kind": "component", + "name": "Worktree", + "origin": { + "kind": "registered", + "origin": "@executablemd/workflow/composition", + "reserved": false + }, + "sourceKind": "registered", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "Create or use a worktree. `…` expands its content in the worktree.", + "as": "Optional. The path of the linked checkout.", + "context": "The Markdown expanded in that checkout." + } + ] + }, + { + "kind": "user-provided", + "entries": [ + { + "kind": "component", + "name": "Widget", + "origin": { + "kind": "repository", + "path": "components/Widget.md" + }, + "sourceKind": "markdown", + "inspectability": "complete", + "forms": [ + "self-closing", + "paired" + ], + "props": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "captures": [], + "returnMode": "text", + "returns": { + "type": "string" + }, + "description": "a repository widget." + } + ] + } + ] +} +----- post-test output end ----- + SX12: succeeds with the defaults in a package tree full of directory links ... ok (777ms) + SX11: the symbols are inspection, and plan is the command that writes with them ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + SX11: the symbols are inspection, and plan is the command that writes with them ... ok (556ms) +Tier SX — the command line ... ok (13s) +Tier SX — the catalog a pipe receives ... + SX13: the Markdown form arrives whole, and equals a file redirect ... ok (1s) + SX14: the JSON form arrives whole, parses, and equals a file redirect ... ok (1s) + SX18: a run's own output arrives whole, and equals a file redirect ... ok (1s) + SX19: a consumer that closes a run's output early is not raised ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstwrite EPIPE +xmd-exit=1 +----- post-test output end ----- + SX19: a consumer that closes a run's output early is not raised ... ok (813ms) + SX15: a consumer that closes early fails the command ... +------- post-test output ------- +{ + "version": 2, + "categories": [ + { + "kind": "structural", + "entries": [ + { + xmd syntax: stdout did not accept the whole output: write EPIPE +xmd-exit=1 +----- post-test output end ----- + SX15: a consumer that closes early fails the command ... ok (894ms) +Tier SX — the catalog a pipe receives ... ok (6s) +running 3 tests from ./packages/cli/tests/targets-cli.test.ts +Tier CT — CLI document targets ... + CT1: help lists full canonical references in source order ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#Alpha + ALPHA_MARKER + + doc.md#Beta + BETA_MARKER + + doc.md#Beta/Nested + NESTED_MARKER + + doc.md#Gamma + GAMMA_MARKER +----- post-test output end ----- + CT1: help lists full canonical references in source order ... ok (568ms) + CT2: two sections with one canonical path are two rows, described apart ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#Same + The first section under this canonical path. + + doc.md#Same + The second section under the very same path. + + doc.md#Quiet +----- post-test output end ----- + CT2: two sections with one canonical path are two rows, described apart ... ok (727ms) + CT3: a document with no targets has no target section at all ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. +----- post-test output end ----- + CT3: a document with no targets has no target section at all ... ok (617ms) + CT4: help runs no component, block, authored write, or service ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#Work + Describes the work without performing any of it. +----- post-test output end ----- + CT4: help runs no component, block, authored write, or service ... ok (591ms) + CT5b: an unreadable reference and a missing file fail help too ... +------- post-test output ------- +Invalid document reference +ENOENT: no such file or directory, open 'absent.md' +----- post-test output end ----- + CT5b: an unreadable reference and a missing file fail help too ... ok (1s) + CT5e: a schema-invalid document fails help and describes nothing ... +------- post-test output ------- +invalid props schema: schema is invalid: data/properties/who/type must be equal to one of the allowed values, data/properties/who/type must be array, data/properties/who/type must match a schema in anyOf +----- post-test output end ----- + CT5e: a schema-invalid document fails help and describes nothing ... ok (599ms) + CT6a: a literal % is escape syntax, so its raw spelling is not a path ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in pct%zz.md + + pct%25zz.md#Alpha + RAW_PCT_MARKER +# Percent + +## Alpha + +RAW_PCT_MARKER +Invalid document reference +Invalid document reference +----- post-test output end ----- + CT6a: a literal % is escape syntax, so its raw spelling is not a path ... ok (2s) + CT6: a filename holding # or % is read and reprinted canonically ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in we#ird.md + + we%23ird.md#Sec + HASH_FILE_MARKER +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in pct%25.md + + pct%2525.md#Sec + PCT_FILE_MARKER +# Hashed + +## Sec + +HASH_FILE_MARKER +----- post-test output end ----- + CT6: a filename holding # or % is read and reprinted canonically ... ok (1s) + CT8: the default command selects the same target as the explicit one ... +------- post-test output ------- +# Report + +PREAMBLE_MARKER + +## Beta + +BETA_MARKER + +### Nested + +NESTED_MARKER + +# Report + +PREAMBLE_MARKER + +## Beta + +BETA_MARKER + +### Nested + +NESTED_MARKER + +----- post-test output end ----- + CT8: the default command selects the same target as the explicit one ... ok (1s) + CT10: no match fails before expansion and lists every available reference ... +------- post-test output ------- +"Delta" matches no document target. +Available targets: + doc.md#Alpha + doc.md#Beta + doc.md#Beta/Nested + doc.md#Gamma +----- post-test output end ----- + CT10: no match fails before expansion and lists every available reference ... ok (630ms) + CT10a: an invalid selector reports the whole catalog too ... +------- post-test output ------- +"%zz" is not a valid document target selector. +Available targets: + doc.md#Alpha + doc.md#Beta + doc.md#Beta/Nested + doc.md#Gamma +----- post-test output end ----- + CT10a: an invalid selector reports the whole catalog too ... ok (622ms) + CT10b: a document with no targets says so instead of listing none ... +------- post-test output ------- +"Any" matches no document target. +The document has no targets. +----- post-test output end ----- + CT10b: a document with no targets says so instead of listing none ... ok (626ms) + CT11: several matches fail and list every matching reference ... +------- post-test output ------- +"Same" matches more than one document target. +Matched targets: + doc.md#Same + doc.md#Same +----- post-test output end ----- + CT11: several matches fail and list every matching reference ... ok (621ms) + CT13: exotic headings are listed as canonical references ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#a%2Fb + SLASH_MARKER + + doc.md#star%2A + STAR_MARKER + + doc.md#hash%23tag + HASH_MARKER + + doc.md#pct%25value + PCT_MARKER + + doc.md#two%20words + SPACE_MARKER + + doc.md#%C3%9Cn%C3%AFc%C3%B8d%C3%A9 + UNICODE_MARKER +----- post-test output end ----- + CT13: exotic headings are listed as canonical references ... ok (573ms) + CT17: a valid exact or glob selector reports the whole catalog ... +------- post-test output ------- +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#Alpha + ALPHA_MARKER + + doc.md#Beta + BETA_MARKER + + doc.md#Beta/Nested + NESTED_MARKER + + doc.md#Gamma + GAMMA_MARKER +Usage: xmd run [OPTIONS] [path] + +Arguments: + [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead + +Options: + -e, --eval [EVAL] inline markdown document to execute, in place of a path + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --agent-provider agent provider for agent components [default: acpx] + --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) + --approve-all approve every agent permission request [default: false] + --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] + --deny-all deny every agent permission request [default: false] + --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) + --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) + --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. +Quote the document so the shell passes it as a single argument: + xmd -e '# Hello' + +`xmd run -` reads standard input to end of file and runs what it read, so a +command that writes a complete document composes with a run: + xmd plan "prepare the release" | xmd run - + +Only that exact spelling reads it. A bare `xmd -` names a file called `-`, +`xmd run -#Section` selects a section of that file, and --eval takes +its document as the value. + +A path is a document reference, and everything after its first `#` selects +one section of the document to run: + xmd run README.md#Release/Publish + xmd README.md#Release/* + +A selector must name exactly one section; `xmd run --help` +lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. + +Targets in doc.md + + doc.md#Alpha + ALPHA_MARKER + + doc.md#Beta + BETA_MARKER + + doc.md#Beta/Nested + NESTED_MARKER + + doc.md#Gamma + GAMMA_MARKER +----- post-test output end ----- + CT17: a valid exact or glob selector reports the whole catalog ... ok (1s) + CT18: an unmatched or ambiguous selector fails help and describes nothing ... +------- post-test output ------- +"Delta" matches no document target. +Available targets: + doc.md#Alpha + doc.md#Beta + doc.md#Beta/Nested + doc.md#Gamma +"Same" matches more than one document target. +Matched targets: + dup.md#Same + dup.md#Same +----- post-test output end ----- + CT18: an unmatched or ambiguous selector fails help and describes nothing ... ok (1s) + CT-text: a targeted text root keeps its stdout and printed-error contract ... +------- post-test output ------- +# Report + +PREAMBLE_MARKER + +## Alpha + +ALPHA_MARKER + +----- post-test output end ----- + CT-text: a targeted text root keeps its stdout and printed-error contract ... ok (720ms) +Tier CT — CLI document targets ... ok (16s) +Tier CT — exact target before execution ... + CT12: a replacement seen by preparation is refused before the installer ... ok (148ms) + CT12a: a replacement seen only by execution is refused without starting a service ... ok (129ms) +Tier CT — exact target before execution ... ok (276ms) +Tier CT — contextual help installs nothing ... + CT19: file help exits zero, describes the catalog, and never installs ... ok (12ms) +Tier CT — contextual help installs nothing ... ok (12ms) +running 1 test from ./packages/cli/tests/test-root-profile.test.ts +the profile each command runs with ... + resolves Git's vocabulary for an ordinary run ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +a run resolves this +----- post-test output end ----- + resolves Git's vocabulary for an ordinary run ... ok (1s) + resolves none of it at the test root ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + +> ❌ Test **the root writes Git vocabulary** failed (error): Failed to import component Dir: Cannot resolve component: Dir (searched: components, .) + + + + +tests failed: 1 test(s) failed in +----- post-test output end ----- + resolves none of it at the test root ... ok (1s) + resolves it inside a nested run child ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + + + + + + + + + +----- post-test output end ----- + resolves it inside a nested run child ... ok (1s) +the profile each command runs with ... ok (4s) +running 1 test from ./packages/cli/tests/test-target.test.ts +Tier DT — xmd test targets ... + DT1: a directory runs every test document beneath it ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT1: a directory runs every test document beneath it ... ok (897ms) + DT2: documents are identified and ordered by relative path ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT2: documents are identified and ordered by relative path ... ok (865ms) + DT3: ordinary markdown does not run under the default pattern ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT3: ordinary markdown does not run under the default pattern ... ok (867ms) + DT4: a directory with no matching document fails and names the pattern ... +------- post-test output ------- +no documents matched **/*.test.md in /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/bare +----- post-test output end ----- + DT4: a directory with no matching document fails and names the pattern ... ok (549ms) + DT5: a failing document is attributed, and the run continues and summarizes ... +------- post-test output ------- + +# broken.test.md + +# Broken + + + +> ❌ **Assert** failed — deliberate failure +> actual: false +> deliberate failure + +> ❌ Test **mixed suite failing document** failed (assertion): deliberate failure + + +broken.test.md: tests failed: 1 of 1 tests failed + mixed suite failing document: deliberate failure + +# ok.test.md + +# Ok + + + +> ✅ **Assert** passed +> actual: true + + + +1 of 2 documents failed +----- post-test output end ----- + DT5: a failing document is attributed, and the run continues and summarizes ... ok (743ms) + DT6: each document gets its own testing session ... +------- post-test output ------- + +# a-passes.test.md + +# First + + + +> ✅ **Assert** passed +> actual: true + + + +# b-empty.test.md + +# Second + +This document declares no tests. It fails on its own, because each document +gets its own testing session rather than inheriting the previous document's +count. + +b-empty.test.md: tests failed: no tests were discovered + +# c-passes.test.md + +# Third + + + +> ✅ **Assert** passed +> actual: true + + + +1 of 3 documents failed +----- post-test output end ----- + DT6: each document gets its own testing session ... ok (809ms) + DT7: a binding does not leak into the next document ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT7: a binding does not leak into the next document ... ok (895ms) + DT8: a single document reports exactly as it always has ... +------- post-test output ------- +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT8: a single document reports exactly as it always has ... ok (666ms) + DT9: a failing single document prints one diagnostic ... +------- post-test output ------- +# Broken + + + +> ❌ **Assert** failed — deliberate failure +> actual: false +> deliberate failure + +> ❌ Test **mixed suite failing document** failed (assertion): deliberate failure + + +tests failed: 1 of 1 tests failed + mixed suite failing document: deliberate failure +----- post-test output end ----- + DT9: a failing single document prints one diagnostic ... ok (664ms) + DT10: --journal is rejected for a directory before anything runs ... +------- post-test output ------- +--journal is not supported with a directory target — run a single document to write a trace +----- post-test output end ----- + DT10: --journal is rejected for a directory before anything runs ... ok (527ms) + DT11: run-only options stay exclusive to xmd run ... +------- post-test output ------- +unrecognized option for xmd test: --approve-all — agent options are exclusive to xmd run +unrecognized option for xmd test: --props — document properties are exclusive to xmd run +----- post-test output end ----- + DT11: run-only options stay exclusive to xmd run ... ok (1s) + DT12: a bare xmd test is the current directory ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT12: a bare xmd test is the current directory ... ok (1s) + DT13: a bare xmd test with no matches fails ... +------- post-test output ------- +no documents matched **/*.test.md in . +----- post-test output end ----- + DT13: a bare xmd test with no matches fails ... ok (528ms) + DT14: the default pattern reaches both root-level and nested documents ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT14: the default pattern reaches both root-level and nested documents ... ok (859ms) + DT15: a custom pattern discovers a differently named document ... +------- post-test output ------- + +# one.spec.md + +# One + + + +> ✅ **Assert** passed +> actual: true + + +----- post-test output end ----- + DT15: a custom pattern discovers a differently named document ... ok (670ms) + DT16: an explicit pattern replaces the default ... +------- post-test output ------- + +# one.spec.md + +# One + + + +> ✅ **Assert** passed +> actual: true + + +----- post-test output end ----- + DT16: an explicit pattern replaces the default ... ok (703ms) + DT17: repeated patterns run their union ... +------- post-test output ------- + +# one.spec.md + +# One + + + +> ✅ **Assert** passed +> actual: true + + + +# two.check.md + +# Two + + + +> ✅ **Assert** passed +> actual: true + + +----- post-test output end ----- + DT17: repeated patterns run their union ... ok (732ms) + DT18: a document matched by two patterns runs once ... +------- post-test output ------- + +# one.spec.md + +# One + + + +> ✅ **Assert** passed +> actual: true + + +----- post-test output end ----- + DT18: a document matched by two patterns runs once ... ok (659ms) + DT19: the union is ordered by relative path, not by pattern order ... +------- post-test output ------- + +# one.spec.md + +# One + + + +> ✅ **Assert** passed +> actual: true + + + +# two.check.md + +# Two + + + +> ✅ **Assert** passed +> actual: true + + +----- post-test output end ----- + DT19: the union is ordered by relative path, not by pattern order ... ok (731ms) + DT20: --pattern is rejected against a single document ... +------- post-test output ------- +unrecognized option for xmd test: --pattern — /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/patterns/three.test.md is a single document, so there is nothing to search +----- post-test output end ----- + DT20: --pattern is rejected against a single document ... ok (552ms) + DT21: an empty --pattern is rejected instead of falling back ... +------- post-test output ------- +--pattern requires a glob — an empty pattern matches nothing +----- post-test output end ----- + DT21: an empty --pattern is rejected instead of falling back ... ok (545ms) + DT22: help describes the optional path and the repeatable pattern ... +------- post-test output ------- +Usage: xmd test [OPTIONS] [path] + +Arguments: + [path] markdown document or directory to test (defaults to the current directory) [default: .] + +Options: + --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] + --include ... component search directory [default: components,.] + -V, --verbose log journal entries to stderr [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + DT22: help describes the optional path and the repeatable pattern ... ok (530ms) + DT23: a broad pattern deliberately runs ordinary markdown ... +------- post-test output ------- + +# notes.md + +# Notes + +Ordinary Markdown. Running it fails, which is how a suite proves it was left +alone under the default pattern. + + + +> ❌ **Assert** failed — notes.md should not have executed +> actual: false +> notes.md should not have executed + +> ❌ Test **ordinary markdown ran** failed (assertion): notes.md should not have executed + + +notes.md: tests failed: 1 of 1 tests failed + ordinary markdown ran: notes.md should not have executed + +1 of 1 documents failed +----- post-test output end ----- + DT23: a broad pattern deliberately runs ordinary markdown ... ok (665ms) + DT24: a directory target resolves the components beside its documents ... +------- post-test output ------- + +# Example.test.md + +# Example + + + + +> ✅ **AssertEquals** passed +> actual: "Example component" +> expected: "Example component" + + +----- post-test output end ----- + DT24: a directory target resolves the components beside its documents ... ok (693ms) + DT25: a nested document resolves the component beside it, not a sibling's ... +------- post-test output ------- + +# alpha/Widget.test.md + +# Alpha + + + + +> ✅ **AssertEquals** passed +> actual: "Alpha widget" +> expected: "Alpha widget" + + + +# beta/Widget.test.md + +# Beta + + + + +> ✅ **AssertEquals** passed +> actual: "Beta widget" +> expected: "Beta widget" + + +----- post-test output end ----- + DT25: a nested document resolves the component beside it, not a sibling's ... ok (750ms) + DT32: composition is document directory, target root, then the configured includes ... ok (0ms) + DT26: a --pattern with no value is rejected ... +------- post-test output ------- +--pattern requires a value — write `--pattern `, or `--pattern=` for a glob that begins with "-" +----- post-test output end ----- + DT26: a --pattern with no value is rejected ... ok (536ms) + DT27: another option is not read as the glob ... +------- post-test output ------- +--pattern requires a value — write `--pattern `, or `--pattern=` for a glob that begins with "-" +----- post-test output end ----- + DT27: another option is not read as the glob ... ok (531ms) + DT28: --pattern= expresses a glob that begins with a dash ... +------- post-test output ------- +no documents matched -weird.md in /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/suite +----- post-test output end ----- + DT28: --pattern= expresses a glob that begins with a dash ... ok (531ms) + DT29: argv after -- is not inspected for options ... +------- post-test output ------- + +# a-binds.test.md + +# Binds + + + + + +> ✅ **AssertEquals** passed +> actual: "from-a" +> expected: "from-a" + + + +# b-reads.test.md + +# Reads + +The reference below stays verbatim because the binding belongs to another +document: {leaked} + + + + +> ✅ **AssertEquals** passed +> actual: "{leaked}" +> expected: "{leaked}" + + + +# nested/deep.test.md + +# Nested + + + + +> ✅ **AssertEquals** passed +> actual: "deep" +> expected: "deep" + + + +# passing.test.md + +# Passing + + + + +> ✅ **AssertEquals** passed +> actual: "Hello" +> expected: "Hello" + + +----- post-test output end ----- + DT29: argv after -- is not inspected for options ... ok (862ms) + DT30: a test path keeps its literal # and %, and no fragment is read ... +------- post-test output ------- + + +LITERAL_MARKER + + + + +LITERAL_MARKER + + +ENOENT: no such file or directory, open '/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-dt-044daf94-4742-437b-b0b1-e9b91a8c6467/we%23ird.test.md' +----- post-test output end ----- + DT30: a test path keeps its literal # and %, and no fragment is read ... ok (1s) + DT31: a failing command inside a test fails that test, and the next runs ... +------- post-test output ------- +BEFORE_FAILURE +AFTER_CONTAINMENT +# Commands + +A command that exits nonzero inside a test is that test's outcome, not the +document's: the test after it still runs, and `xmd test` decides the run. + + + + +> ❌ Test **a failing command fails its own test** failed (error): Command failed (exit 3) + + + + + + + +tests failed: 1 of 2 tests failed + a failing command fails its own test: Command failed (exit 3) +----- post-test output end ----- + DT31: a failing command inside a test fails that test, and the next runs ... ok (725ms) +Tier DT — xmd test targets ... ok (24s) +running 1 test from ./packages/cli/tests/testing-activation.test.ts +workflow installation and testing activation ... + refuses a the installation did not activate, before its body runs ... ok (97ms) +workflow installation and testing activation ... ok (101ms) +running 2 tests from ./packages/cli/tests/testing-execution-host.test.ts +nested execution under the production run host ... + runs referenced documents, targets and inline source as real roots ... +------- post-test output ------- +from a command + + + + + + + + + + + + + + + +----- post-test output end ----- + runs referenced documents, targets and inline source as real roots ... ok (1s) + resolves the packaged Component in a run child, and fails at its own first phase ... +------- post-test output ------- + + + +----- post-test output end ----- + resolves the packaged Component in a run child, and fails at its own first phase ... ok (802ms) + creates no authored file for an inline child ... +------- post-test output ------- + + + +----- post-test output end ----- + creates no authored file for an inline child ... ok (781ms) + resolves a child's component only through the outer command's includes ... +------- post-test output ------- + + + + + +> ❌ **AssertStringIncludes** failed +> actual: "" +> expected: "hello from the configured include" +> Expected actual to contain expected + +> ❌ Test **nested resolution** failed (assertion): Expected actual to contain expected + + +tests failed: 1 of 1 tests failed + nested resolution: Expected actual to contain expected +----- post-test output end ----- + resolves a child's component only through the outer command's includes ... ok (1s) + gives a nested run child its own catalog rather than the outer root's ... +------- post-test output ------- + + + +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `elsewhere/Greeting.md` + +----- post-test output end ----- + gives a nested run child its own catalog rather than the outer root's ... ok (1s) + gives a nested run child the documentation for what it registers ... +------- post-test output ------- + + + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +**Available in this evaluation:** yes + +Asks a person a question in a browser form. + +```mdx + +Choose how the release notes should be grouped. + +``` + +Builds the form from `schema` and shows its content above it. `uiSchema` sets +presentation options — ordering, widgets, labels — without changing what the +answer has to be. The validated response binds through `as`, which is required: +the answer is the point. + +Reach for `` instead when the document should not choose the browser. It +asks the same question and lets the host decide how — a terminal prompt, or +whatever else that host arranges. `` is for when the question genuinely +needs a form: several fields, a choice among many, anything awkward to type at a +prompt. + +----- post-test output end ----- + gives a nested run child the documentation for what it registers ... ok (1s) + gives a run child the ordinary read profile: File, Glob and Syntax ... +------- post-test output ------- + + + + + + + +----- post-test output end ----- + gives a run child the ordinary read profile: File, Glob and Syntax ... ok (903ms) + refuses outside a canonical ... +------- post-test output ------- + is valid only inside a canonical . +----- post-test output end ----- + refuses outside a canonical ... ok (729ms) + refuses on a host with no workflow profile ... +------- post-test output ------- + + +> ❌ Test **workflow** failed (error): needs a host that can execute workflow runs, and this one has no workflow profile. + + +tests failed: 1 of 1 tests failed + workflow: needs a host that can execute workflow runs, and this one has no workflow profile. +----- post-test output end ----- + refuses on a host with no workflow profile ... ok (692ms) +nested execution under the production run host ... ok (9s) +deterministic dependencies declared for a nested run ... + gives a declared child the agent defaults, its own session and its answers ... +------- post-test output ------- + + + + + + + + + + + + + +----- post-test output end ----- + gives a declared child the agent defaults, its own session and its answers ... ok (9s) + keeps the outer test's agent and answers out of the child ... +------- post-test output ------- + + + + + + + + + + + +----- post-test output end ----- + keeps the outer test's agent and answers out of the child ... ok (4s) + lets a repository TestAgent end the scan and configure nothing ... +------- post-test output ------- + + + +----- post-test output end ----- + lets a repository TestAgent end the scan and configure nothing ... ok (794ms) + gives each configured child its own Plan root, and keeps none of them ... +------- post-test output ------- + + + + + +----- post-test output end ----- + gives each configured child its own Plan root, and keeps none of them ... ok (5s) + installs the controlled Plan configuration and removes its root after cancellation ... ok (555ms) + stops authorship when a turn fails after emitting part of a candidate ... +------- post-test output ------- + + + +----- post-test output end ----- + stops authorship when a turn fails after emitting part of a candidate ... ok (2s) + supplies no Plan Agent context from a repository TestAgent ... +------- post-test output ------- + + + +----- post-test output end ----- + supplies no Plan Agent context from a repository TestAgent ... ok (837ms) + gives a direct test root no Plan authorship permission ... +------- post-test output ------- + + +> ❌ Test **a test root cannot write a Plan** failed (error): Failed to import component Plan: Cannot resolve component: Plan (searched: components, .) + + +tests failed: 1 of 1 tests failed + a test root cannot write a Plan: Failed to import component Plan: Cannot resolve component: Plan (searched: components, .) +----- post-test output end ----- + gives a direct test root no Plan authorship permission ... ok (682ms) + refuses an unreadable behavior document before the child's root is imported ... +------- post-test output ------- + + +> ❌ Test **an unreadable behavior document** failed (error): cannot read the behavior document "./agents/absent.md": ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-nested-KcvYOC/agents/absent.md' + + +tests failed: 1 of 1 tests failed + an unreadable behavior document: cannot read the behavior document "./agents/absent.md": ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-nested-KcvYOC/agents/absent.md' +----- post-test output end ----- + refuses an unreadable behavior document before the child's root is imported ... ok (690ms) + refuses a scripted agent when this entrypoint cannot re-invoke itself ... ok (132ms) + keeps ordinary resolution and Elicit validation inside a configured child ... +------- post-test output ------- + + + + + + + +----- post-test output end ----- + keeps ordinary resolution and Elicit validation inside a configured child ... ok (937ms) +deterministic dependencies declared for a nested run ... ok (26s) +running 1 test from ./packages/cli/tests/upgrade-cli.test.ts +Tier UC — xmd upgrade ... + UC1: program help lists the command with its settled description ... +------- post-test output ------- +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + UC1: program help lists the command with its settled description ... ok (574ms) + UC2: command help explains the whole command and performs none of it ... +------- post-test output ------- +Usage: xmd upgrade [OPTIONS] [tag] + +Arguments: + [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) + +Options: + --status report how the selected release compares, and change nothing [default: false] + --allow-downgrade consent to installing a release older than the installed one [default: false] + --allow-prerelease consent to installing the exact prerelease tag named [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +With no tag, xmd upgrade installs the latest published stable release. Name +an exact tag instead to select one release and only that release: + xmd upgrade + xmd upgrade v1.2.3 + xmd upgrade v1.3.0-rc.1 --allow-prerelease + + --status + Report the installed version, the selected release, how the two + compare and the exact release URL. It downloads no binary, locks + nothing and changes no files, and it accepts any published exact tag + without consent — so neither consent option may be written with it. + + --allow-downgrade + Consent to installing a release older than the installed one. It is + refused when the selected release is not older. + + --allow-prerelease + Consent to installing the exact prerelease tag named. It is refused + without one, because no implicit selection ever chooses a prerelease. + + --journal , -j + Write a diagnostic JSONL trace of this run to a new file. The path + must not exist. The trace is evidence only: it is never read back, it + resumes nothing, and it changes no output, release choice or consent. + With --status it is the one file the command writes. + +Only a compiled xmd on macOS or Linux can replace itself: + + compiled binary macOS or Linux: self-upgrade + Windows: use the installer or a release asset + npm or Node update with npm + Bun update with Bun + Deno or repository source update the package version or the checkout + +Every other combination stops with instructions for that installation before +the command reads release metadata or changes any files. + +An install downloads the release binary for this platform, checks it against +the published SHA-256 checksum, runs the verified candidate and requires it +to report the selected version, and only then replaces the binary that ran +this command with one atomic rename. Anything that fails before that rename +leaves the installed xmd exactly as it was. +----- post-test output end ----- + UC2: command help explains the whole command and performs none of it ... ok (533ms) + UC3: command help offers nothing a run configures ... +------- post-test output ------- +Usage: xmd upgrade [OPTIONS] [tag] + +Arguments: + [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) + +Options: + --status report how the selected release compares, and change nothing [default: false] + --allow-downgrade consent to installing a release older than the installed one [default: false] + --allow-prerelease consent to installing the exact prerelease tag named [default: false] + -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +With no tag, xmd upgrade installs the latest published stable release. Name +an exact tag instead to select one release and only that release: + xmd upgrade + xmd upgrade v1.2.3 + xmd upgrade v1.3.0-rc.1 --allow-prerelease + + --status + Report the installed version, the selected release, how the two + compare and the exact release URL. It downloads no binary, locks + nothing and changes no files, and it accepts any published exact tag + without consent — so neither consent option may be written with it. + + --allow-downgrade + Consent to installing a release older than the installed one. It is + refused when the selected release is not older. + + --allow-prerelease + Consent to installing the exact prerelease tag named. It is refused + without one, because no implicit selection ever chooses a prerelease. + + --journal , -j + Write a diagnostic JSONL trace of this run to a new file. The path + must not exist. The trace is evidence only: it is never read back, it + resumes nothing, and it changes no output, release choice or consent. + With --status it is the one file the command writes. + +Only a compiled xmd on macOS or Linux can replace itself: + + compiled binary macOS or Linux: self-upgrade + Windows: use the installer or a release asset + npm or Node update with npm + Bun update with Bun + Deno or repository source update the package version or the checkout + +Every other combination stops with instructions for that installation before +the command reads release metadata or changes any files. + +An install downloads the release binary for this platform, checks it against +the published SHA-256 checksum, runs the verified candidate and requires it +to report the selected version, and only then replaces the binary that ran +this command with one atomic rename. Anything that fails before that rename +leaves the installed xmd exactly as it was. +----- post-test output end ----- + UC3: command help offers nothing a run configures ... ok (552ms) + UC4: this entrypoint refuses with its own remedy, and reads nothing first ... +------- post-test output ------- +# Upgrade XMD +This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. +----- post-test output end ----- + UC4: this entrypoint refuses with its own remedy, and reads nothing first ... ok (605ms) + UC5: --status refuses on this entrypoint too, before any release lookup ... +------- post-test output ------- +# Upgrade XMD +This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. +----- post-test output end ----- + UC5: --status refuses on this entrypoint too, before any release lookup ... ok (586ms) + UC6: a command line this command does not define never reaches the policy ... +------- post-test output ------- +xmd upgrade does not recognize --nope. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. +xmd upgrade does not recognize --timeout. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. +xmd upgrade does not recognize --version. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. +xmd upgrade accepts at most one release tag. v1.2.4 is an extra argument. +unrecognized option for xmd upgrade: --props-name — document properties are exclusive to xmd run +unrecognized option for xmd upgrade: --eval — inline documents are exclusive to xmd run +----- post-test output end ----- + UC6: a command line this command does not define never reaches the policy ... ok (3s) + UC7: a value written on a switch is refused rather than read as its default ... +------- post-test output ------- +--status does not take a value. Use --status by itself or omit it. +--status does not take a value. Use --status by itself or omit it. +--allow-downgrade does not take a value. Use --allow-downgrade by itself or omit it. +----- post-test output end ----- + UC7: a value written on a switch is refused rather than read as its default ... ok (1s) + UC8: xmd workflow keeps its own --status ... +------- post-test output ------- +unrecognized value for --status: nonsense — expected one of running, suspended, interrupted, completed, failed, cancelled +----- post-test output end ----- + UC8: xmd workflow keeps its own --status ... ok (541ms) + UC9: --journal writes one new trace and changes nothing a reader sees ... +------- post-test output ------- +# Upgrade XMD +This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. +# Upgrade XMD +This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. +----- post-test output end ----- + UC9: --journal writes one new trace and changes nothing a reader sees ... ok (1s) + UC10: -j is the same option, and both refuse a path that exists ... +------- post-test output ------- +# Upgrade XMD +This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. +Journal trace already exists: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-uc-fd4b95c2-224e-46a4-87c7-c927513f229b/short.jsonl. Remove it or choose another path. +Journal trace already exists: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-uc-fd4b95c2-224e-46a4-87c7-c927513f229b/taken.txt. Remove it or choose another path. +----- post-test output end ----- + UC10: -j is the same option, and both refuse a path that exists ... ok (1s) + UC11: a journal option with no path is refused rather than ignored ... +------- post-test output ------- +--journal needs a path — write `--journal `, and the path must not already exist +-j needs a path — write `--journal `, and the path must not already exist +--journal needs a path — write `--journal `, and the path must not already exist +--journal needs a path — write `--journal `, and the path must not already exist +----- post-test output end ----- + UC11: a journal option with no path is refused rather than ignored ... ok (2s) + UC12: no Upgrade phase is reachable from an ordinary document ... +------- post-test output ------- +## Built-in structural syntax + +### `` + +Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. + +**Syntax:** + +```md +…… +``` + +**Body context:** The `` children this runs at the same time. + +### `` + +Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. + +**Syntax:** + +```md + +… +``` + +**Body context:** A multiline template, in place of the single-line `template` prop. + +### `` + +Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. + +**Syntax:** + +```md +… +``` + +**Body context:** `` matchers, and the body they answer for. + +### `` + +Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. + +**Syntax:** + +```md + +``` + +### `` + +Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. + +**Syntax:** + +```md +… +… +``` + +**Body context:** Markdown expanded when this case is selected. + +### `` + +Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. + +**Syntax:** + +```md + + +``` + +### `` + +Repeat content for each item in an array. `…` binds each one to `item` inside. + +**Syntax:** + +```md +… +``` + +**`as`:** Optional. Captures the whole rendered loop instead of emitting it. + +**Body context:** Markdown rendered once per element. + +### `` + +The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the enclosing condition does not hold. + +### `` + +Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. + +**Syntax:** + +```md +… +``` + +**Body context:** The branch taken when the condition holds, up to an ``. + +### `` + +Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. + +**Syntax:** + +```md +… + +``` + +**`as`:** Required. The binding name the value is available under. + +**Body context:** Markdown whose rendered text becomes the binding, in the paired form. + +### `` + +Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded once per iteration. + +### `` + +Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. + +**Syntax:** + +```md +… +``` + +**Body context:** The rendered output the run presents. + +### `` + +Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. + +**Syntax:** + +```md +… +``` + +**Body context:** The region whose failures are printed rather than raised. + +### `` + +Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. + +**Syntax:** + +```md + +``` + +### `` + +Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. + +**Syntax:** + +```md +… +``` + +**Body context:** Markdown expanded in its own child, beside its siblings. + +### `` + +Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. + +**Syntax:** + +```md +… +``` + +**Body context:** Direct `` branches considered in source order. + +## Built-in components + +### `` + +Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches use this agent. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `defaultAgent` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "defaultAgent": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "name" + ], + "additionalProperties": false +} +``` + +**Body context:** Markdown expanded with this provider installed. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are approved. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose permission requests are asked about. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `msg` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "msg": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. + +**Body context:** The expected value, in place of the `expected` prop. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. + +**Body context:** The Markdown expected to fail. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `value` | `string` | yes | | +| `language` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" + } + }, + "required": [ + "value" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The journal snapshot. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Required. The child's accumulated output. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a directory. `…` changes the working directory for its content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in that directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Ask a person a structured question. `…` shows the content as the request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated answer, as a structured value. + +**Body context:** The request message the person is shown. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Evaluate program text. `` runs it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | +| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." + }, + "allow": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "enum": [ + "read", + "write" + ] + }, + "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `host` | `string` | yes | | +| `target` | `string` | no | | +| `source` | `string` | no | | +| `action` | `string` | no | | +| `props` | `object` | no | | + +```json +{ + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "target": { + "type": "string" + }, + "source": { + "type": "string" + }, + "action": { + "type": "string" + }, + "props": { + "type": "object" + } + }, + "required": [ + "host" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. + +**Body context:** The declarations for the child, then the assertions about it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Stop authored work with an actionable failure. `` raises the message where it is written. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "message" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `method` | `string` | no | | +| `headers` | `object` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string" + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "timeout": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. + +**Body context:** The text to write, in the writing form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `path` | `string` | yes | | + +```json +{ + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the empty string this renders, as for any text component. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Stage paths for commit. `` resolves Git pathspecs from the working directory. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `paths` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "paths": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + ] + } + }, + "required": [ + "paths" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `message` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "message": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. The full object id of the commit. + +**Body context:** The message body, expanded before the commit is made. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Switch or create a branch. `` starts a missing branch at the specified base. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "branch" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `include` | `array` | yes | | +| `exclude` | `array` | no | | + +```json +{ + "type": "object", + "properties": { + "include": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "required": [ + "include" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The matched paths, as a string array. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "string" + } +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | no | | +| `title` | `string` | no | | +| `tags` | `array` | no | | +| `assignee` | `string` | no | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. + +**Body context:** The issue's description, for the form that files one. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "oneOf": [ + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "assignee": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "url", + "title", + "description", + "tags", + "assignee" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Select an issue tracker. `…` expands its content with the specified tracker in scope. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string" + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**Body context:** The Markdown whose issues are filed there. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Render a value as JSON text. `` writes the JSON where you put it. + +**Forms:** `` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. + +**`as`:** Optional. Captures the JSON text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated value. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. + +**Forms:** `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "session": { + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false +} +``` + +**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. + +**Body context:** The complete prompt, expanded once before authorship. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) + +### `` + +Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `text` | `string` | no | | +| `agent` | `string` | no | | +| `session` | `string` | no | | +| `timeout` | `string` | no | | +| `throwOnError` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "session": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "throwOnError": { + "type": "boolean" + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the reply instead of emitting it. + +**Body context:** The prompt text, in the paired form. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Open or update a pull request. `…` uses its content as the body after ``. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `number` | `integer` | no | | +| `title` | `string` | yes | | +| `base` | `string` | no | | +| `draft` | `boolean` | no | | + +```json +{ + "type": "object", + "properties": { + "number": { + "type": "integer", + "minimum": 1 + }, + "title": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + }, + "draft": { + "type": "boolean", + "default": false + } + }, + "required": [ + "title" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. + +**Body context:** The pull request's body. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "object", + "properties": { + "repository": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "locatorFingerprint": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "requestedBase": { + "type": [ + "string", + "null" + ] + }, + "creationCommit": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "primaryBranch": { + "type": "string", + "minLength": 1 + }, + "objectFormat": { + "enum": [ + "sha1", + "sha256" + ] + } + }, + "required": [ + "name", + "locatorFingerprint", + "requestedBase", + "creationCommit", + "primaryBranch", + "objectFormat" + ], + "additionalProperties": false + }, + "providerId": { + "type": "string", + "minLength": 1 + }, + "number": { + "type": "integer", + "minimum": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "state": { + "const": "open" + }, + "headSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + }, + "baseSha": { + "type": "string", + "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" + } + }, + "required": [ + "repository", + "providerId", + "number", + "url", + "state", + "headSha", + "baseSha" + ], + "additionalProperties": false +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request checks. `` reads check runs and commit statuses for its head. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each check's kind, name, head commit and outcome. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "check-run" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "queued", + "in_progress", + "completed", + "waiting", + "requested", + "pending" + ] + }, + "conclusion": { + "enum": [ + "success", + "failure", + "neutral", + "cancelled", + "skipped", + "timed_out", + "action_required", + null + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "startedAt": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "status", + "conclusion", + "url", + "startedAt", + "completedAt", + "title", + "summary", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "commit-status" + }, + "id": { + "type": "string" + }, + "headSha": { + "type": "string" + }, + "name": { + "type": "string" + }, + "state": { + "enum": [ + "error", + "failure", + "pending", + "success" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "headSha", + "name", + "state", + "description", + "url", + "createdAt", + "updatedAt" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request comments. `` reads both conversation and review comments. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "conversation" + }, + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "author", + "body", + "createdAt", + "updatedAt", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "review" + }, + "id": { + "type": "string" + }, + "reviewId": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "body": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "diffHunk": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "originalCommitSha": { + "type": "string" + }, + "line": { + "type": [ + "integer", + "null" + ] + }, + "side": { + "enum": [ + "left", + "right", + null + ] + }, + "startLine": { + "type": [ + "integer", + "null" + ] + }, + "startSide": { + "enum": [ + "left", + "right", + null + ] + }, + "inReplyToId": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "kind", + "id", + "reviewId", + "author", + "body", + "createdAt", + "updatedAt", + "url", + "path", + "diffHunk", + "commitSha", + "originalCommitSha", + "line", + "side", + "startLine", + "startSide", + "inReplyToId" + ], + "additionalProperties": false + } + ] + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Read pull request reviews. `` reads reviews from the specified pull request. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `url` | `string` | yes | | +| `provider` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "url": { + "type": "string", + "minLength": 1 + }, + "provider": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. Each review's author, state, body, submission time, commit and url. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "author": { + "type": [ + "string", + "null" + ] + }, + "state": { + "enum": [ + "approved", + "changes-requested", + "commented", + "dismissed", + "pending" + ] + }, + "body": { + "type": "string" + }, + "submittedAt": { + "type": [ + "string", + "null" + ] + }, + "commitSha": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "author", + "state", + "body", + "submittedAt", + "commitSha", + "url" + ], + "additionalProperties": false + } +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Clone or use a repository. `…` expands its content in the specified checkout. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `url` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "url" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the selected checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +### `` + +Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | + +```json +{ + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The result: either the validated value or the issues that rejected it. + +**Body context:** The JSON text to parse. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "oneOf": [ + { + "type": "object", + "properties": { + "ok": { + "const": true + }, + "value": {} + }, + "required": [ + "ok", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "ok": { + "const": false + }, + "input": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "instancePath": { + "type": "string" + }, + "schemaPath": { + "type": "string" + }, + "keyword": { + "type": "string" + }, + "params": {}, + "message": { + "type": "string" + } + }, + "required": [ + "instancePath", + "schemaPath", + "keyword", + "params", + "message" + ], + "additionalProperties": false + } + } + }, + "required": [ + "ok", + "input", + "errors" + ], + "additionalProperties": false + } + ] +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `model` | `string` | no | | +| `effort` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "effort": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** Markdown whose prompts and launches run in this session. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `agent` | `string` | no | | +| `session` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "session": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The instructions the native session starts from. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. + +**Forms:** `` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | + +```json +{ + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true, + "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." + } + }, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered text instead of emitting it. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (protected component) + +### `` + +Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered directory path instead of emitting it. + +**Body context:** Markdown expanded with the temporary directory as its working directory. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | no | | +| `timeout` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "timeout": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The body of the test: its assertions and the work they judge. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/core` (registered default) + +### `` + +Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Body context:** The Markdown expanded in testing mode. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/cli` (registered default) + +### `` + +Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `schema` | JSON Schema | yes | | +| `uiSchema` | JSON Schema | no | | + +```json +{ + "type": "object", + "properties": { + "schema": {}, + "uiSchema": {} + }, + "required": [ + "schema" + ], + "additionalProperties": false +} +``` + +**`as`:** Required. The validated response. + +**Body context:** The Markdown shown above the form. + +**Returns:** a value — it renders nothing, and `as` binds what it returns. + +```json +{} +``` + +**Origin:** `@executablemd/web` (registered default) + +### `` + +Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `id` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "additionalProperties": false +} +``` + +**Body context:** The workflow-hosted executions this scope owns. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/testing` (registered default) + +### `` + +Create or use a worktree. `…` expands its content in the worktree. + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `name` | `string` | yes | | +| `branch` | `string` | yes | | +| `base` | `string` | no | | + +```json +{ + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "branch": { + "type": "string", + "minLength": 1 + }, + "base": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "branch" + ], + "additionalProperties": false +} +``` + +**`as`:** Optional. The path of the linked checkout. + +**Body context:** The Markdown expanded in that checkout. + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `@executablemd/workflow/composition` (registered default) + +## User-provided components + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `AGENTS.md` + +### `` + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `package` | `string` | yes | Workspace package directory, e.g. packages/workflow | + +```json +{ + "type": "object", + "properties": { + "package": { + "type": "string", + "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", + "description": "Workspace package directory, e.g. packages/workflow" + } + }, + "required": [ + "package" + ], + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `components/BootstrapNpmPackage.md` + +### `` + +**Forms:** ``, `…` + +#### Props + +This component declares no individual props. + +```json +{ + "type": "object", + "properties": {}, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `CLAUDE.md` + +### `` + +**Forms:** ``, `…` + +#### Props + +| Prop | Type | Required | Description | +| --- | --- | --- | --- | +| `package` | `string` | no | Workspace package to reserve on npm, e.g. packages/workflow | + +```json +{ + "type": "object", + "properties": { + "package": { + "type": "string", + "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", + "description": "Workspace package to reserve on npm, e.g. packages/workflow" + } + }, + "additionalProperties": false +} +``` + +**Returns:** text — the markdown this component renders. + +```json +{ + "type": "string" +} +``` + +**Origin:** `README.md` +# Try it + +Failed to import component Upgrade.Replace: Cannot resolve component: Upgrade.Replace (searched: components, .) +----- post-test output end ----- + UC12: no Upgrade phase is reachable from an ordinary document ... ok (1s) +Tier UC — xmd upgrade ... ok (14s) +running 1 test from ./packages/cli/tests/upgrade-command-document.test.ts +Tier UG — the packaged upgrade command document ... + UG1: an authorized install renders its milestones in source order ... ok (109ms) + UG2: an exact tag names itself in the opening ... ok (48ms) + UG3: --status reports the comparison and reaches no install phase ... ok (36ms) + UG4: an already-installed selection downloads nothing and says so ... ok (38ms) + UG5: an untaken branch contributes no prose at all ... ok (73ms) + UG6: a phase failure keeps completed milestones and claims nothing more ... ok (115ms) + UG7: an older release needs --allow-downgrade, and installs with it ... ok (70ms) + UG8: a prerelease needs --allow-prerelease, and installs with it ... ok (66ms) + UG9: an older prerelease is refused with one command carrying both consents ... ok (160ms) + UG10: consent that describes nothing is refused rather than ignored ... ok (64ms) + UG11: --status refuses either consent option, before reading anything ... ok (34ms) + UG12: --status accepts an older or prerelease tag without consent ... ok (59ms) + UG13: an already-installed prerelease needs no prerelease consent ... ok (57ms) + UG14: a draft, a missing tag and an empty listing are each refused by name ... ok (73ms) + UG15: an unsupported entrypoint refuses before it could read anything ... ok (27ms) + UG16: a compiled binary the release does not target refuses too ... ok (8ms) + UG17: every release-read failure code reaches its own answer ... ok (218ms) + UG18: every installation failure code reaches its own answer ... ok (396ms) + UG19: semantic version precedence is exact, past the safe-integer range ... ok (467ms) + UG20: a tag that is not exactly vX.Y.Z is refused before anything is read ... ok (195ms) + UG21: a running binary that reports no release version is refused ... ok (15ms) + UG22: a published release whose own tag is malformed is never selected ... ok (55ms) + UG23: the packaged source is an ordinary streaming text root ... ok (0ms) + UG24: every exact multi-way choice is a , not a lookup table ... ok (1ms) + UG25: each phase answers for the codes it can produce, and no others ... ok (1ms) +Tier UG — the packaged upgrade command document ... ok (2s) +running 1 test from ./packages/cli/tests/upgrade-output.test.ts +Tier UO — the upgrade transcript ... + UO1: each milestone reaches the reader before the next phase begins ... ok (95ms) + UO2: every consumer drains the same stream, and nothing is printed twice ... ok (88ms) + UO3: a consumer that fails cancels the run and reports rather than hanging ... ok (37ms) + UO4: the durable stream records the run and grants it nothing ... ok (79ms) + UO5: nothing in this module reaches the host's own output ... ok (1ms) +Tier UO — the upgrade transcript ... ok (305ms) +running 1 test from ./packages/cli/tests/value-root.test.ts +Tier VR — xmd run value roots ... + VR1: stdout carries only the JSON result ... +------- post-test output ------- +{"passed":true,"summary":"looks good"} +----- post-test output end ----- + VR1: stdout carries only the JSON result ... ok (699ms) + VR2: a string result stays a quoted JSON string ... +------- post-test output ------- +"shipped" +----- post-test output end ----- + VR2: a string result stays a quoted JSON string ... ok (698ms) + VR3: --verbose moves body output and diagnostics to stderr ... +------- post-test output ------- +[yield] import_component:__root__ → ok { path: 'doc.md' } + +BODY_MARKER + + +[close] root → ok +{"passed":true,"summary":"looks good"} +----- post-test output end ----- + VR3: --verbose moves body output and diagnostics to stderr ... ok (701ms) + VR4: a structural failure exits nonzero with empty stdout ... +------- post-test output ------- +A component that declares `returns` renders nothing and produces exactly one value through a its own body executes. Problems found: + - no +----- post-test output end ----- + VR4: a structural failure exits nonzero with empty stdout ... ok (701ms) + VR4a: a selected conditional writes its result ... +------- post-test output ------- +"chosen" +----- post-test output end ----- + VR4a: a selected conditional writes its result ... ok (701ms) + VR4b: an unselected conditional reaches the missing-return failure ... +------- post-test output ------- +The root document declares `returns` but produced no value. +----- post-test output end ----- + VR4b: an unselected conditional reaches the missing-return failure ... ok (711ms) + VR4c: two executed s exit nonzero with the duplicate diagnostic ... +------- post-test output ------- +The root document declares `returns` but executed more than one . +----- post-test output end ----- + VR4c: two executed s exit nonzero with the duplicate diagnostic ... ok (705ms) + RV10e: a document cannot select a value through the named return context ... +------- post-test output ------- +The root document declares `returns` but produced no value. +----- post-test output end ----- + RV10e: a document cannot select a value through the named return context ... ok (737ms) + VR5: a failure after exits nonzero with empty stdout ... +------- post-test output ------- +Failed to import component Missing: Cannot resolve component: Missing (searched: components, .) +----- post-test output end ----- + VR5: a failure after exits nonzero with empty stdout ... ok (718ms) + VR6: a text root still writes its rendering to stdout ... +------- post-test output ------- +TEXT_MARKER +----- post-test output end ----- + VR6: a text root still writes its rendering to stdout ... ok (740ms) + VR7: a targeted value root reserves stdout for its result ... +------- post-test output ------- +[yield] import_component:__root__ → ok { path: 'doc.md' } + +# Sectioned + +## Ready + +READY_MARKER + + +[close] root → ok +{"passed":true} +----- post-test output end ----- + VR7: a targeted value root reserves stdout for its result ... ok (725ms) + VR8: a projection without is the same structural failure ... +------- post-test output ------- +A component that declares `returns` renders nothing and produces exactly one value through a its own body executes. Problems found: + - no +----- post-test output end ----- + VR8: a projection without is the same structural failure ... ok (736ms) + VR10: a command's stdout is shown beside the result, and recorded as stdout ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +to-outto-err{"ok":true} +----- post-test output end ----- + VR10: a command's stdout is shown beside the result, and recorded as stdout ... ok (1s) + VR9: in a projected text root still selects what is emitted ... +------- post-test output ------- + + +SELECTED_MARKER + +----- post-test output end ----- + VR9: in a projected text root still selects what is emitted ... ok (758ms) +Tier VR — xmd run value roots ... ok (10s) +running 1 test from ./packages/cli/tests/verbose-component.test.ts +Tier VB — ... + VB5: the run syntax catalog describes it ... ok (145ms) +Tier VB — ... ok (146ms) +running 2 tests from ./packages/cli/tests/workflow-agent-sessions.test.ts +Tier WSR — a restart reattaches each Session site ... + WSR1: two same-named sites keep their own asserted identities across a restart ... ok (2s) + WSR2: a replayed site asks the provider for nothing ... ok (2s) +Tier WSR — a restart reattaches each Session site ... ok (4s) +Tier WSA — the workflow profile serves Claude over ACP alone ... + WSR3: a Claude session is retained and reattached with no machine-wide account ... ok (3s) +Tier WSA — the workflow profile serves Claude over ACP alone ... ok (3s) +running 1 test from ./packages/cli/tests/workflow-agent.test.ts +Tier WAL — the workflow Agent observation loop ... + WAL1: two observations then a proposal, all in one provider session ... ok (191ms) + WAL1: no Workspace path or caller path reaches the provider ... ok (75ms) + WAL2: a completed replay restores the run and reaches no provider ... ok (117ms) + WAL3: an interrupted run resumes without repeating what it committed ... ok (128ms) + WAL10: a named turn is retained against its Prompt and rendered nowhere ... ok (82ms) + WAL8: an admitted Fetch response reaches the next Prompt, values and all ... ok (83ms) + WAL8: a completed replay restores that response without asking again ... ok (103ms) + WAL4: exhausting the authored bound fails at the document's own gate ... ok (124ms) + WAL5: a mutation-shaped proposal is retained as data and mutates nothing ... ok (64ms) + WAL6: a denied native tool becomes the retained Prompt failure ... ok (63ms) + WAL9: an approved proposal is applied, and a refused one is not ... ok (115ms) + WAL11: the profile materializes the adapter a placement names, and only then ... ok (56ms) + WAL12: two hosts retain and serialize identical Agent identity, launching their own adapters ... ok (4s) + WAL13: an agent this build carries no snapshot for runs through ACPX unchanged ... ok (53ms) + WAL14: a completed and an interrupted run both replay from the stored Prompt ... ok (140ms) + WAL15: its retained identity is the resolved command, as it was before ... ok (44ms) + WAL16: a refusing snapshot refuses its own agent and leaves the others alone ... ok (84ms) + WAL7: a workflow with no Agent starts no provider and allocates no sidecar ... ok (28ms) +Tier WAL — the workflow Agent observation loop ... ok (5s) +running 4 tests from ./packages/cli/tests/workflow-cli.test.ts +Tier WFC — xmd workflow start and resume ... + WFC1: two starts without an id make two runs ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: 4ac4d4f6-5874-4626-872f-9ed57e13cd78 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow run: 4c9771d7-27df-4521-8f4f-f9c78c9f5ec1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +----- post-test output end ----- + WFC1: two starts without an id make two runs ... ok (2s) + WFC2: reusing an id compatibly finds the run, and incompatibly is refused ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +The workflow run "release-1" is already stored with a different props. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +----- post-test output end ----- + WFC2: reusing an id compatibly finds the run, and incompatibly is refused ... ok (3s) + WFC3: generated prop arguments belong to start alone ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: props-1 + +# Release + + + + + +Wrote: channel=beta +workflow status: completed +Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] + +Arguments: + [action] start, resume, fork, answer, status, list, history, cancel, delete or export + [target] markdown definition to start, the run a fork continues, or the run id every other action addresses + [argument] the definition a fork runs, or the wait an answer is delivered to + [value] the answer itself, as one JSON value (answer only) + +Options: + --id [ID] run id to create or address (start and fork only; generated when absent) + --at [AT] the retained event a fork continues from (fork only) + -V, --verbose log journal entries to stderr [default: false] + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + --json write the inspection result as JSON (status, list and history only) [default: false] + --forkable add each event's forkability to the history (history only) [default: false] + --status [STATUS] list only runs retaining this status + --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) + --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. + +Properties declared by release.md + + --props-channel + Environment: XMD_PROPS_CHANNEL + Default: "stable" + + --props + Set document properties as a JSON object + Environment: XMD_PROPS +unrecognized option for xmd workflow resume: --props-channel=stable — document properties belong to the start that created the run, whose props it retained +unrecognized argument for xmd workflow: {"channel":"stable"} — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFC3: generated prop arguments belong to start alone ... ok (3s) + WFC4: the definition is the file's current bytes, committed or not ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: pinned-1 + +# Release + + + + + +Wrote: channel=stable + +UNCOMMITTED +workflow status: completed +----- post-test output end ----- + WFC4: the definition is the file's current bytes, committed or not ... ok (1s) + WFC4b: an untracked file starts, and runs what it says ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: untracked-1 + +# Release + + + + + +Wrote: channel=stable + +UNTRACKED +workflow status: completed +----- post-test output end ----- + WFC4b: an untracked file starts, and runs what it says ... ok (1s) + WFC5: resume names only a run, and finds its definition again ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: resume-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow run: resume-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +unrecognized argument for xmd workflow: flows/release.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFC5: resume names only a run, and finds its definition again ... ok (3s) + WFC6: a failing document reports failed and exits 1, and replays as failed ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: failing-1 +# Refusing + +Failed to import component ComponentBesideTheDefinition: Cannot resolve component: ComponentBesideTheDefinition (searched: ) +workflow status: failed +workflow run: failing-1 +# Refusing + +Failed to import component ComponentBesideTheDefinition: Cannot resolve component: ComponentBesideTheDefinition (searched: ) +workflow status: failed +----- post-test output end ----- + WFC6: a failing document reports failed and exits 1, and replays as failed ... ok (2s) + WFC7: absent, foreign and unreadable storage is reported and left alone ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "never-started". Start the run before looking it up. +workflow run: corrupt-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +Error: file is not a database + at createConnection (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/connections.ts:188:14) + at Object.at (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/connections.ts:428:25) + at at.next () + at beginExecution (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/transitions.ts:135:41) + at beginExecution.next () + at beginRun (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/lifecycle.ts:289:24) + at beginRun.next () + at admit (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/src/workflow.ts:1189:31) + at admit.next () + at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/src/workflow.ts:965:26 { + errcode: 26, + code: "ERR_SQLITE_ERROR", + errstr: "file is not a database" +} +----- post-test output end ----- + WFC7: absent, foreign and unreadable storage is reported and left alone ... ok (2s) + WFC8: the grammar refuses what the command does not have ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd workflow requires a subcommand — `xmd workflow start ` or `xmd workflow resume ` +unrecognized subcommand for xmd workflow: resurrect — expected start, resume, fork, answer, status, list, history, cancel, delete, export +No workflow run is stored under the run id "release-1". Start the run before looking it up. +xmd workflow start requires a markdown definition — `xmd workflow start ` +unrecognized option for xmd workflow resume: --id — it belongs to another workflow action +unrecognized option for xmd workflow: --approve-all — agent options are exclusive to xmd run +unrecognized option for xmd workflow: --eval — inline documents are exclusive to xmd run +----- post-test output end ----- + WFC8: the grammar refuses what the command does not have ... ok (5s) + WFC13: answer takes three arguments, and only its own options ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "release-1". Start the run before looking it up. +xmd workflow answer names the wait it answers — `xmd workflow answer `. `xmd workflow status ` reports the request event the run stopped on. +xmd workflow answer requires the answer itself, as one JSON value — `xmd workflow answer ` +the answer for xmd workflow answer is not JSON: Unexpected token 'a', "approved" is not valid JSON. Quote it so the shell passes it as one argument. +unrecognized argument for xmd workflow: extra — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +unrecognized option for xmd workflow answer: --json — it belongs to another workflow action +unrecognized option for xmd workflow answer: --verbose — it belongs to another workflow action +unrecognized option for xmd workflow answer: --id — it belongs to another workflow action +No workflow run is stored under the run id "release-1". Start the run before looking it up. +unrecognized argument for xmd workflow: wait-1 — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFC13: answer takes three arguments, and only its own options ... ok (6s) + WFC11: `--` ends the options, not the grammar ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized argument for xmd workflow: unexpected.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +unrecognized argument for xmd workflow: second.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +workflow run: 5ec92e5c-8fe9-4fb2-b702-9c90be98d564 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow run: 5ec92e5c-8fe9-4fb2-b702-9c90be98d564 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +----- post-test output end ----- + WFC11: `--` ends the options, not the grammar ... ok (3s) + WFC12: a dash-leading definition and run id are what `--` is for ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: -architect-probe-run + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow run: -architect-probe-run + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +unrecognized argument for xmd workflow: unexpected.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFC12: a dash-leading definition and run id are what `--` is for ... ok (2s) + WFC9: a file outside any repository starts, and one that is not there does not ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +fatal: not a git repository (or any of the parent directories): .git +workflow run: outside-1 + +# Release + + + + + +Wrote: channel=stable + +OUTSIDE +workflow status: completed +the workflow definition could not be read from flows/absent.md: ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-3f936c2f-4fa7-40ee-98b3-a6f962f6aaea/repository/flows/absent.md' +----- post-test output end ----- + WFC9: a file outside any repository starts, and one that is not there does not ... ok (2s) + WFC10: ordinary xmd run is unchanged by any of this ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm + +# Release + + + + + +Wrote: channel=beta +----- post-test output end ----- + WFC10: ordinary xmd run is unchanged by any of this ... ok (1s) + WFC9b: a reference selects one section, and the run is of that section ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: section-1 +# Release + +## Publish + +publishing. + +workflow status: completed +run: section-1 +status: completed +definition: 77e8d415cdbf5acb83eac9647563c22da947c45934294b9d1ca34f06835b10af sections.md#Publish +props: {} +created: 2026-10-09T10:43:51.310Z +updated: 2026-10-09T10:43:51.427Z +retrieval: revision 1 at 2026-10-09T10:43:51.310Z +workspace: 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +journal frontier: 8b25049c-03f1-47c3-b42d-d908f9725aee (Workspace 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30) +executions: 1 + a0de1c17-2ab8-4096-bd33-f34bdf564fd0 started 2026-10-09T10:43:51.312Z, completed at 2026-10-09T10:43:51.426Z +workflow run: section-1 +# Release + +## Publish + +publishing. + +workflow status: completed +----- post-test output end ----- + WFC9b: a reference selects one section, and the run is of that section ... ok (2s) + WFC9c: a whole-document run and a targeted one are two runs ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: whole-1 +# Release + +## Publish + +publishing. + +## Announce + +announcing. +workflow status: completed +The workflow run "whole-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +"Nowhere" matches no document target. +Available targets: + Publish + Announce +----- post-test output end ----- + WFC9c: a whole-document run and a targeted one are two runs ... ok (3s) +Tier WFC — xmd workflow start and resume ... ok (49s) +Tier WFC — a workflow closed over a component bundle ... + WFC14: the five declared stages run from the files beside the root ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: 94cbf601-5984-4a78-b102-ff93806026ec + +# Loop + +discovered. + +instruction files listed. + +EDITED IN THE WORKING TREE + + +EDITED IN THE WORKING TREE + + +checkpoint reached. + +EDITED IN THE WORKING TREE + + +planned. + +EDITED IN THE WORKING TREE + + +implemented. + +EDITED IN THE WORKING TREE + +workflow status: completed +----- post-test output end ----- + WFC14: the five declared stages run from the files beside the root ... ok (1s) + WFC15: a declared component the commit does not hold refuses before the run ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +the component "Planning" is not a file beside the document that declares it at Planning.md. Put the component next to the document, or correct the path it declares. +No workflow run is stored under the run id "loop-1". Start the run before looking it up. +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +the component "Planning" at Planning.md is not a Markdown component this version can read: expected a JSON object, got number +No workflow run is stored under the run id "loop-1". Start the run before looking it up. +----- post-test output end ----- + WFC15: a declared component the commit does not hold refuses before the run ... ok (4s) + WFC16: a declaration that names a directory names no component ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +the path declared for the component "Planning" is not a Markdown file, and a bundled component is Markdown. +----- post-test output end ----- + WFC16: a declaration that names a directory names no component ... ok (1s) + WFC17: the bundle decides compatible reuse ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: loop-2 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +workflow run: loop-2 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +[{"eventId":"8a85f490-8221-4a46-a11e-bda645410cb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-2","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c3f3a2f3-57e8-4fcd-85e2-181626af2765","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"9e810f8d-cd5d-429c-9f5c-150c489c406f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"96f729be-d32a-4a6b-bcbc-7c44fd329747","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24309669-6703-4abc-aa1d-bb95e2c92013","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dc5a79b9-631f-4bf8-9a25-62e941b9e6c7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d2717f66-1431-4502-a7c6-86fd7762b20a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b3626af-b47c-4645-a608-f35dfebaaf80","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] +The workflow run "loop-2" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +[{"eventId":"8a85f490-8221-4a46-a11e-bda645410cb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-2","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c3f3a2f3-57e8-4fcd-85e2-181626af2765","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"9e810f8d-cd5d-429c-9f5c-150c489c406f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"96f729be-d32a-4a6b-bcbc-7c44fd329747","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24309669-6703-4abc-aa1d-bb95e2c92013","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dc5a79b9-631f-4bf8-9a25-62e941b9e6c7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d2717f66-1431-4502-a7c6-86fd7762b20a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b3626af-b47c-4645-a608-f35dfebaaf80","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFC17: the bundle decides compatible reuse ... ok (4s) + WFC18: a resume reads the pinned tree, whatever the checkout now says ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: loop-3 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +[{"eventId":"550721d4-2a11-451b-9011-418ac2ae69af","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-3","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e919132a-00c6-4bb3-965a-b267e3d502fd","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5c3aac01-7834-439e-8a71-f7c7aadcf8aa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"978fdd58-c624-4267-b5d9-2c37ed38c712","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30ec5af1-83b8-42cb-9c0e-05c302e00992","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ff42d1e-f55c-45c4-ae16-4b7de5f30bb3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e83bce2f-927b-486c-a545-8baa62a969ff","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"066eac09-9b12-4f29-a833-539278b40013","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] +workflow run: loop-3 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +[{"eventId":"550721d4-2a11-451b-9011-418ac2ae69af","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-3","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e919132a-00c6-4bb3-965a-b267e3d502fd","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5c3aac01-7834-439e-8a71-f7c7aadcf8aa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"978fdd58-c624-4267-b5d9-2c37ed38c712","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30ec5af1-83b8-42cb-9c0e-05c302e00992","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ff42d1e-f55c-45c4-ae16-4b7de5f30bb3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e83bce2f-927b-486c-a545-8baa62a969ff","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"066eac09-9b12-4f29-a833-539278b40013","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFC18: a resume reads the pinned tree, whatever the checkout now says ... ok (3s) + WFC19: a resume needs no repository, because the run retains its bundle ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: loop-4 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +workflow run: loop-4 + +# Loop + +discovered. + +instruction files listed. + + + +checkpoint reached. + + +planned. + + +implemented. + +workflow status: completed +----- post-test output end ----- + WFC19: a resume needs no repository, because the run retains its bundle ... ok (2s) +Tier WFC — a workflow closed over a component bundle ... ok (17s) +Tier WFX — xmd workflow export ... + WFX1: seals a completed run and reports both digests ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-24098a3d-078d-4eb5-bd4c-b37fda4b4aa1/repository/evidence.xmd +workflow run: release-1 +workflow frontier: 524e9ca4-a2d2-4f69-b357-11b3a00c8e55 +workflow root: cae46153927f0761afa199f22d6ec7c6270046e9e1e63c14deee16e4ea4948e8 +workflow artifact identity: ee3d530372552f25a60e26aa928c6c248cd08df5d43531a2475fee9c7f9e116b +workflow artifact sha256: d8b5e9b3bf02ef108a77775a88afc901807d9ce067e99ce4f8d7ffaa7c471522 +----- post-test output end ----- + WFX1: seals a completed run and reports both digests ... ok (2s) + WFX2: refuses a destination it cannot write, and leaves it alone ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +xmd workflow export writes one file and needs to be told where — `xmd workflow export --output=`. +xmd workflow export writes an XMD artifact, so --output names a .xmd file. "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-dd2ac114-dea1-4036-b006-cbff87c71320/repository/run.db" does not. +xmd workflow export writes a file rather than standard output. Give --output a path ending in .xmd. +xmd workflow export will not replace /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-dd2ac114-dea1-4036-b006-cbff87c71320/repository/taken.xmd. Remove it, or name a path that does not exist yet. +----- post-test output end ----- + WFX2: refuses a destination it cannot write, and leaves it alone ... ok (3s) + WFX3: refuses a run it does not have, without creating the target ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "no-such-run". Start the run before looking it up. +----- post-test output end ----- + WFX3: refuses a run it does not have, without creating the target ... ok (1s) +Tier WFX — xmd workflow export ... ok (7s) +Tier WFX — what xmd workflow export refuses ... + WFX4: refuses a run an executor is holding, and writes nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +The workflow run "release-1" is being executed right now, so there is no settled frontier to export. Nothing was written. Export it once the run stops. +----- post-test output end ----- + WFX4: refuses a run an executor is holding, and writes nothing ... ok (2s) + WFX5: exports after everything the run was started from is gone ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-249700ef-1b4b-4476-9ad1-1ebf012326c5/home/detached.xmd +workflow run: release-1 +workflow frontier: 2e3af032-77ae-4ad4-bdc9-2cd76066d936 +workflow root: fdc8d9aa0c59d503ab947b3bce584df580798f11992cacb37812faa6cf63dd50 +workflow artifact identity: 07aa2d316619a4d6efba7912110bcf8be2031deceb22c216010776d3fc807542 +workflow artifact sha256: 3f0f4cd68f3652fffeee871e87c24558b50487d4073107b6fa0fb27bcf967948 +----- post-test output end ----- + WFX5: exports after everything the run was started from is gone ... ok (2s) + WFX6: refuses when the run's own retained source no longer describes itself ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: corrupt-1 + +# Release + + + + + +Wrote: channel=stable +workflow status: completed +This workflow run's retained source bundle disagrees with its own descriptor: a retained source is not the content it names. No partial source is returned and the run is left unchanged. +----- post-test output end ----- + WFX6: refuses when the run's own retained source no longer describes itself ... ok (2s) +Tier WFX — what xmd workflow export refuses ... ok (6s) +running 1 test from ./packages/cli/tests/workflow-crash.test.ts +Tier WFX — a killed workflow run resumes from its frontier ... + WFX1: SIGKILL mid-run, then resume: every effect exactly once ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: crashed-run +workflow run: crashed-run +# Many effects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +workflow status: completed +----- post-test output end ----- + WFX1: SIGKILL mid-run, then resume: every effect exactly once ... ok (5s) + WFX2: Ctrl-C settles the run itself, releases it, and resumes clean ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: crashed-run +workflow status: interrupted +workflow run: crashed-run +# A run that waits + + + + + + + +workflow status: completed +----- post-test output end ----- + WFX2: Ctrl-C settles the run itself, releases it, and resumes clean ... ok (32s) + WFX3: two processes race one resumable run; exactly one advances it ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: crashed-run +workflow run: crashed-run +workflow run crashed-run is already running: one workflow executor advances a run, and this host reports that executor rather than following it. +'Tier WFX — a killed workflow run resumes from its frontier' has been running for over (1m0s) +# A run that waits + + + + + + + +workflow status: completed +----- post-test output end ----- + WFX3: two processes race one resumable run; exactly one advances it ... ok (32s) +Tier WFX — a killed workflow run resumes from its frontier ... ok (1m10s) +running 3 tests from ./packages/cli/tests/workflow-declaration.test.ts +Tier WFD — reading a workflow's component declaration ... + WFD1: the five-name map normalizes against a nested root ... ok (3ms) + WFD2: the order the author wrote is not the order identity keeps ... ok (1ms) + WFD3: a root at the repository root normalizes without a directory ... ok (0ms) + WFD4: two names may point at one blob on purpose ... ok (1ms) + WFD5: a root that declares nothing declares no bundle ... ok (0ms) + WFD6: an empty map is not a second spelling of no bundle ... ok (0ms) + WFD7: the declaration is one closed member ... ok (0ms) + WFD8: a value that is not a path is not a declaration ... ok (1ms) + WFD9: every path form a declaration may not take ... ok (1ms) + WFD10: a declaration may not claim structural syntax or a core component ... ok (1ms) + WFD11: a key that is not a component name is never printed back ... ok (1ms) + WFD12: a nested name is a name, and normalizes like one ... ok (0ms) +Tier WFD — reading a workflow's component declaration ... ok (14ms) +Tier WFD — establishing a declared bundle ... + WFD40: a root with no declaration retains exactly one source ... +------- post-test output ------- +fatal: not a git repository (or any of the parent directories): .git +----- post-test output end ----- + WFD40: a root with no declaration retains exactly one source ... ok (43ms) + WFD41: a declared component becomes a logical path beside the root ... +------- post-test output ------- +fatal: not a git repository (or any of the parent directories): .git +----- post-test output end ----- + WFD41: a declared component becomes a logical path beside the root ... ok (35ms) + WFD42: a declared component that is not beside the root refuses the start ... ok (5ms) + WFD43: a root that is not well-formed UTF-8 refuses before anything is read ... ok (2ms) +Tier WFD — establishing a declared bundle ... ok (86ms) +Tier WFD — the target a reference resolves ... + WFD44: a selector resolves to one exact target before storage exists ... +------- post-test output ------- +fatal: not a git repository (or any of the parent directories): .git +fatal: not a git repository (or any of the parent directories): .git +----- post-test output end ----- + WFD44: a selector resolves to one exact target before storage exists ... ok (56ms) + WFD45: a glob resolves to the canonical target, not to itself ... +------- post-test output ------- +fatal: not a git repository (or any of the parent directories): .git +----- post-test output end ----- + WFD45: a glob resolves to the canonical target, not to itself ... ok (36ms) + WFD46: a selector naming no section refuses, before anything is retained ... ok (7ms) + WFD47: a filename holding a # is addressable, and is not a logical path ... ok (6ms) +Tier WFD — the target a reference resolves ... ok (105ms) +running 1 test from ./packages/cli/tests/workflow-export-publication.test.ts +Tier WXP — what an export leaves behind ... + WXP1: a racing target is refused by link and survives byte-identical ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +xmd workflow export will not replace /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-85b209e2-9ffa-4b46-afa5-f7142d58af1b/repository/raced.xmd, which something created while the artifact was being written. It is left exactly as it is. +----- post-test output end ----- + WXP1: a racing target is refused by link and survives byte-identical ... ok (1s) + WXP2: a publication failure reports nothing and leaves no target ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +xmd workflow export could not put the artifact at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-be840d91-65f5-41cf-bf81-97df32d90152/repository/unpublished.xmd. Nothing was published. +----- post-test output end ----- + WXP2: a publication failure reports nothing and leaves no target ... ok (1s) + WXP3: a cleanup failure before publication publishes nothing at all ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +xmd workflow export could not remove the temporary directory /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-d8564ade-91f4-450a-8239-53b323ed6ca8/repository/.xmd-export-ZpzWlK, so it stopped before publishing anything. +----- post-test output end ----- + WXP3: a cleanup failure before publication publishes nothing at all ... ok (1s) + WXP4: halting a live export before it commits publishes nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +----- post-test output end ----- + WXP4: halting a live export before it commits publishes nothing ... ok (1s) + WXP5: a cleanup failure after publication keeps the artifact and warns ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +----- post-test output end ----- + WXP5: a cleanup failure after publication keeps the artifact and warns ... ok (1s) + WXP6: nothing an export does is ever aimed at removing its committed output ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +nothing to see here +workflow status: completed +----- post-test output end ----- + WXP6: nothing an export does is ever aimed at removing its committed output ... ok (1s) +Tier WXP — what an export leaves behind ... ok (10s) +running 1 test from ./packages/cli/tests/workflow-fetch.test.ts +Tier FT — a workflow run's Fetch ... + FTW1: commits one response, and a resume restores it without asking again ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: fetch-run +workflow run: fetch-run + + + + +SAID hello + +workflow status: completed +----- post-test output end ----- + FTW1: commits one response, and a resume restores it without asking again ... ok (2s) +Tier FT — a workflow run's Fetch ... ok (2s) +running 1 test from ./packages/cli/tests/workflow-fork.test.ts +Tier WFF — xmd workflow fork ... + WFF1: a compatible checkpoint admits a fork whose history begins as its own ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"b41af5d3-9234-40df-9cbd-fb378417dfda","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"314d022c-0583-404b-8b30-76a22e8c0b48","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0b0f5510-31a3-42b6-bc31-5446f4389176","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6743c2ab-41ba-4c38-91e0-002d82934f76","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +corrected +# Release + + + +workflow status: completed +[{"eventId":"8891fcf2-5197-42dc-8aaf-b1e149a27375","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"55a95cee-6189-4d1c-856b-3068d5f69b37","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc"}},{"eventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8"}},{"eventId":"4bbf5610-3219-4050-b2b2-172733ca1f88","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"87d02160-82ae-4561-9842-07e5e1c7dd69","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","forkability":{"forkable":true,"blockers":[]}}] +{"record":{"runId":"fork-1","definition":{"hashAlgorithm":"sha256","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"1550fcd734f99f4919bdaba9c51d5f638f03cfbc917609238cc4284d5cdd1094","byteLength":79}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:45:56.263Z","updatedAt":"2026-10-09T10:45:56.361Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-a8fd68f1-606a-480a-a2b8-8658777d5b1d/repository","commit":"dda8b31230a66d3bb7c6255077f4e619a94203c7","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:45:56.263Z"},"executions":[{"executionId":"67730872-30ac-47b3-934a-72de7c3283f6","startedAt":"2026-10-09T10:45:56.266Z","stoppedAt":"2026-10-09T10:45:56.361Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"87d02160-82ae-4561-9842-07e5e1c7dd69","workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93"},"currentWorkspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","lineage":{"sourceRunId":"source-1","checkpointEventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","checkpointWorkspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93"}} +----- post-test output end ----- + WFF1: a compatible checkpoint admits a fork whose history begins as its own ... ok (4s) + WFF2: forking changes nothing about the source and takes no lock on it ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"ad4908b8-d08c-4d27-9b05-2f03156d2611","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5dff6fff-a99f-43ac-8839-10b1b98044c6","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c0dc855-5ea9-4cb4-ad79-5def7f2d662e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"89e5bc23-c370-4de3-9c06-6c228aa30af2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +corrected +# Release + + + +workflow status: completed +[{"eventId":"ad4908b8-d08c-4d27-9b05-2f03156d2611","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5dff6fff-a99f-43ac-8839-10b1b98044c6","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c0dc855-5ea9-4cb4-ad79-5def7f2d662e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"89e5bc23-c370-4de3-9c06-6c228aa30af2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] +[{"eventId":"e79df478-d1f2-45fa-be06-f8bf5bd650b6","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"347b1fab-cedb-41fb-a034-3bd0787ff042","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e"}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"189077fe-5776-40ef-afdb-bb4fbcae5389"}},{"eventId":"ac61f166-e950-440d-904e-4f64d6821f8a","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"44c1734b-c9d9-45c0-90fe-88c022cb36d5","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] +workflow run: source-1 +# Release + + + +workflow status: completed +----- post-test output end ----- + WFF2: forking changes nothing about the source and takes no lock on it ... ok (5s) + WFF3: the fork owns its inherited prefix and its own retained source ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"0769d7fa-682f-4bfe-bbaa-fd2a279e0e66","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"3b72347d-c6f7-4530-af54-1fa0e56e01fa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"46d150a8-8481-4e5b-82b1-f5f0db317840","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"475060ea-6e96-481f-90ae-1960b40afa9f","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +corrected +# Release + + + +workflow status: completed +workflow delete: source-1 (run-storage) +No workflow run is stored under the run id "source-1". Start the run before looking it up. +[{"eventId":"d2d1a562-8fa7-468b-a660-d4e015cf129a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"12798a27-3ee4-492e-be80-b6368091e2cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3"}},{"eventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf"}},{"eventId":"99ddfb40-2b5e-4c1c-a120-9209e0d4a162","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0073de75-9037-4809-9147-f3a84b6000a3","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +# Release + + + +workflow status: completed +----- post-test output end ----- + WFF3: the fork owns its inherited prefix and its own retained source ... ok (5s) + WFF4: divergence before the checkpoint leaves no fork at all ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"3497e95f-cd31-4f05-ad1f-b956fae3e123","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ab783f3c-7471-4d58-8798-e65f043e7b0d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"acec416d-617f-4b4f-acab-39fb5c11aa7a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"9c52492a-c990-4649-ade1-ff5fe3ac7a42","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d3e352e0-4b12-4786-a0e4-187e7cc07810","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"36d76882-308e-4995-968f-44b821948f0b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","forkability":{"forkable":true,"blockers":[]}}] +the candidate definition diverges from the inherited history after 3 of 4 events, at 9c52492a-c990-4649-ade1-ff5fe3ac7a42 (workspace_file): Divergence at root[3]: expected workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md") at release.md:3:1, got workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/elsewhere.md") at release.md:3:1 +[{"record":{"runId":"source-1","definition":{"hashAlgorithm":"sha256","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"ade7461d573040f66a9e0cddc1539a691e3f6608296cae1b8f12c2a847afa022","byteLength":78}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:46:09.793Z","updatedAt":"2026-10-09T10:46:09.941Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-4e9ec4b7-ed76-4f78-b450-80161ed52cfd/repository","commit":"45b5b74c0ace973a4c6833e78edd1a9988b07679","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:09.793Z"},"executions":[{"executionId":"147c3a8a-599c-4429-9c0c-f9844aee4eb7","startedAt":"2026-10-09T10:46:09.796Z","stoppedAt":"2026-10-09T10:46:09.940Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"36d76882-308e-4995-968f-44b821948f0b","workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"},"currentWorkspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"}] +the candidate definition diverges from the inherited history after 2 of 4 events, at acec416d-617f-4b4f-acab-39fb5c11aa7a (import_component): Divergence: generator root returned after 2 yields, but journal has 4 yield entries; first unreached entry is import_component("File") at release.md:3:1 +[{"record":{"runId":"source-1","definition":{"hashAlgorithm":"sha256","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"ade7461d573040f66a9e0cddc1539a691e3f6608296cae1b8f12c2a847afa022","byteLength":78}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:46:09.793Z","updatedAt":"2026-10-09T10:46:09.941Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-4e9ec4b7-ed76-4f78-b450-80161ed52cfd/repository","commit":"45b5b74c0ace973a4c6833e78edd1a9988b07679","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:09.793Z"},"executions":[{"executionId":"147c3a8a-599c-4429-9c0c-f9844aee4eb7","startedAt":"2026-10-09T10:46:09.796Z","stoppedAt":"2026-10-09T10:46:09.940Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"36d76882-308e-4995-968f-44b821948f0b","workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"},"currentWorkspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"}] +----- post-test output end ----- + WFF4: divergence before the checkpoint leaves no fork at all ... ok (5s) + WFF5: a reused fork id is compatible only for the same fork identity ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"ef14c02b-ae33-47c4-b18e-8a75a9da27b7","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b9ba0b86-59de-4328-a42c-46b5f0dadd22","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c897af0-9368-4abf-b66f-634900c8141d","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"774ae95b-1702-460d-82f1-27d362d57e4d","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +corrected +# Release + + + +workflow status: completed +[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +# Release + + + +workflow status: completed +[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] +The workflow run "fork-1" is already stored with a different checkpoint. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +The workflow run "fork-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFF5: a reused fork id is compatible only for the same fork identity ... ok (7s) + WFF9: a fork inherits the source's props, and an explicit one overrides ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original + +# Release + + + +workflow status: completed +[{"eventId":"0c3929c2-7d7b-4fe6-8c2e-cb9fc78c27df","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d0b7b601b14938f599b8d20bbc7be1f23ee26a9e8479e986b5d9f7f611145ced"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"d0b7b601b14938f599b8d20bbc7be1f23ee26a9e8479e986b5d9f7f611145ced"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"10536806-91b4-4bc4-9e4c-1f8ca1912cd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"---\nprops:\n type: object\n properties:\n channel: { type: string }\n required: [channel]\n additionalProperties: false\n---\n\n# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"bd20198a-48e5-4df7-a8aa-fe7f6b39ad45","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":138,"line":12,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":138,"line":12,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:5a34d30cb22a20a9ec678331d3d5e2768835d89bf04b9e83e420ff2ec363524b:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":138,"line":12,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","source":{"path":"release.md","offset":138,"line":12,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ba49522-7479-4fec-916d-1bc8ff55b5a7","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":174,"line":14,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","source":{"path":"release.md","offset":174,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b1d4ccdc-3dad-4eb0-8424-f8559c65c065","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Release\n\n\n\n","value":"\n# Release\n\n\n\n"}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-inherited +corrected + +# Release + + + +workflow status: completed +{"record":{"runId":"fork-inherited","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"stable"},"status":"completed","createdAt":"2026-10-09T10:46:24.290Z","updatedAt":"2026-10-09T10:46:24.389Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:24.290Z"},"executions":[{"executionId":"47b4f579-bf9f-4645-9b4c-3684fba4f4b5","startedAt":"2026-10-09T10:46:24.293Z","stoppedAt":"2026-10-09T10:46:24.389Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d8062097-fbc8-4cb7-99c0-b5ac9bbab0ae","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} +{"record":{"runId":"fork-inherited","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"stable"},"status":"completed","createdAt":"2026-10-09T10:46:24.290Z","updatedAt":"2026-10-09T10:46:24.389Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:24.290Z"},"executions":[{"executionId":"47b4f579-bf9f-4645-9b4c-3684fba4f4b5","startedAt":"2026-10-09T10:46:24.293Z","stoppedAt":"2026-10-09T10:46:24.389Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d8062097-fbc8-4cb7-99c0-b5ac9bbab0ae","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} +workflow run: fork-overridden +corrected + +# Release + + + +workflow status: completed +{"record":{"runId":"fork-overridden","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"beta"},"status":"completed","createdAt":"2026-10-09T10:46:26.315Z","updatedAt":"2026-10-09T10:46:26.412Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:26.315Z"},"executions":[{"executionId":"d7a304bf-3d6f-490d-ba3b-86fb0af3a7b4","startedAt":"2026-10-09T10:46:26.317Z","stoppedAt":"2026-10-09T10:46:26.412Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"21d52f25-3239-4d19-af69-4b08ac213a8f","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} +The workflow run "fork-overridden" is already stored with a different props. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +{"record":{"runId":"fork-overridden","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"beta"},"status":"completed","createdAt":"2026-10-09T10:46:26.315Z","updatedAt":"2026-10-09T10:46:26.412Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:26.315Z"},"executions":[{"executionId":"d7a304bf-3d6f-490d-ba3b-86fb0af3a7b4","startedAt":"2026-10-09T10:46:26.317Z","stoppedAt":"2026-10-09T10:46:26.412Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"21d52f25-3239-4d19-af69-4b08ac213a8f","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} +workflow run: fork-overridden + +# Release + + + +workflow status: completed +----- post-test output end ----- + WFF9: a fork inherits the source's props, and an explicit one overrides ... ok (8s) + WFF10: a completed Git-host record is inherited without contacting anything ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original + + + + + + + + +workflow status: completed +[{"eventId":"82759f33-b4c6-48aa-ab70-609c5364939b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"5a653dd59605a21a2f91e84dbbbb3c720e236aa9850188c8aa57cb636bae660b"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"5a653dd59605a21a2f91e84dbbbb3c720e236aa9850188c8aa57cb636bae660b"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"314bfca2-2ac0-4ea2-8763-b8c8624f0c6f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:038dd2fa0c973ecc","configuration":"038dd2fa0c973ecc","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a3b9606e-b46a-4829-8223-bbcd25da6254","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"b39ef7b3a486a43e1bc871e634bac371590a9496127689c05872f0a93c58244b:project:cf7c272765f826fb","configuration":"cf7c272765f826fb","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","before":{"branch":"main","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"052c4ffc-84a5-4657-a401-d3c2cebda988","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f6386d8a-e300-478f-b6ec-4e9805b328de","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:beaa6ffe1048f4f9faea9bac7129201cd64a764be7372f292c2a42e7578bdbbe:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30578737-9110-4137-8cb6-dc0f7a90154c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"4845f6d5f2e4843d7823337bab01e7d51760cffb5c46e89d49374cd3e5e70973:project:6dd00294a0620dd8","configuration":"6dd00294a0620dd8","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"41c525af-3094-40f6-81aa-80cd1e11ec46","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"9d12854b-bae4-408c-993d-88c8606f4fb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"afeb173ca793e853496f51c71022c4ac5626b36cd316c0566af9cd276128e7ff:project:b521adb40dddf440","configuration":"b521adb40dddf440","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"a473534572338297beac5c1772441eab5a55d889","committedAt":1791542792,"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"a473534572338297beac5c1772441eab5a55d889","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"45929a41-df8d-4c53-a6af-7af842174c34","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d488838dfc9eb19aa9532b3eeb5a65776d9baa3e7a6a27d14a9b2480a8733d92","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"request":{"identity":{"runId":"source-1","expansionId":"59f24a464486aa21d07f3dcccc9fe0d0a04b7c0afcbfd30ec544af548ae15a52"},"kind":"git-push","inputs":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889"},"naturalKey":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","destinationRef":"refs/heads/publish/1"}},"preState":{"remoteCommit":null},"observations":{"remoteCommit":"a473534572338297beac5c1772441eab5a55d889"},"decision":"performed","result":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","refspec":"a473534572338297beac5c1772441eab5a55d889:refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889","observedRemoteCommit":"a473534572338297beac5c1772441eab5a55d889"}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fc4717ce-0327-44ba-b274-b415c221757e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":315,"line":11,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":315,"line":11,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fda7ee7b-c87d-4882-ae12-09e7f01d064c","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\n\n\n\n\n\n","value":"\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","forkability":{"forkable":true,"blockers":[]}}] +workflow run: fork-1 +corrected + + + + + + + + +workflow status: completed +[{"eventId":"5e27e07a-adf8-4948-b315-60f797e0516c","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d6dabd8a65421a313f327f8bd50712be6f008d98db54cd328feab32b62f8a5f9"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"d6dabd8a65421a313f327f8bd50712be6f008d98db54cd328feab32b62f8a5f9"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b64bbf28-9dce-4e67-8509-2a2b6fc341eb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552"}},{"eventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:038dd2fa0c973ecc","configuration":"038dd2fa0c973ecc","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f"}},{"eventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e"}},{"eventId":"a3b9606e-b46a-4829-8223-bbcd25da6254","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"b39ef7b3a486a43e1bc871e634bac371590a9496127689c05872f0a93c58244b:project:cf7c272765f826fb","configuration":"cf7c272765f826fb","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","before":{"branch":"main","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a3b9606e-b46a-4829-8223-bbcd25da6254"}},{"eventId":"052c4ffc-84a5-4657-a401-d3c2cebda988","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"052c4ffc-84a5-4657-a401-d3c2cebda988"}},{"eventId":"f6386d8a-e300-478f-b6ec-4e9805b328de","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:beaa6ffe1048f4f9faea9bac7129201cd64a764be7372f292c2a42e7578bdbbe:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"f6386d8a-e300-478f-b6ec-4e9805b328de"}},{"eventId":"30578737-9110-4137-8cb6-dc0f7a90154c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"30578737-9110-4137-8cb6-dc0f7a90154c"}},{"eventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"4845f6d5f2e4843d7823337bab01e7d51760cffb5c46e89d49374cd3e5e70973:project:6dd00294a0620dd8","configuration":"6dd00294a0620dd8","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c"}},{"eventId":"41c525af-3094-40f6-81aa-80cd1e11ec46","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"41c525af-3094-40f6-81aa-80cd1e11ec46"}},{"eventId":"9d12854b-bae4-408c-993d-88c8606f4fb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"afeb173ca793e853496f51c71022c4ac5626b36cd316c0566af9cd276128e7ff:project:b521adb40dddf440","configuration":"b521adb40dddf440","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"a473534572338297beac5c1772441eab5a55d889","committedAt":1791542792,"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"a473534572338297beac5c1772441eab5a55d889","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"9d12854b-bae4-408c-993d-88c8606f4fb5"}},{"eventId":"45929a41-df8d-4c53-a6af-7af842174c34","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"45929a41-df8d-4c53-a6af-7af842174c34"}},{"eventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d488838dfc9eb19aa9532b3eeb5a65776d9baa3e7a6a27d14a9b2480a8733d92","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"request":{"identity":{"runId":"source-1","expansionId":"59f24a464486aa21d07f3dcccc9fe0d0a04b7c0afcbfd30ec544af548ae15a52"},"kind":"git-push","inputs":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889"},"naturalKey":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","destinationRef":"refs/heads/publish/1"}},"preState":{"remoteCommit":null},"observations":{"remoteCommit":"a473534572338297beac5c1772441eab5a55d889"},"decision":"performed","result":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","refspec":"a473534572338297beac5c1772441eab5a55d889:refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889","observedRemoteCommit":"a473534572338297beac5c1772441eab5a55d889"}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc"}},{"eventId":"58aaab70-def7-4070-8103-a43366bf5846","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":315,"line":11,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":315,"line":11,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"08c792b0-389a-4e31-9fbc-9f636e5bef53","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\n\n\n\n\n\n","value":"\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFF10: a completed Git-host record is inherited without contacting anything ... ok (7s) + WFF11: a Git-host effect that established nothing is not forkable ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 + + + + +the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated. +workflow status: failed +[{"eventId":"a643365c-84ca-4357-9c1d-70afd8ec191b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"e61cb725a8bd35d8895c480e397e46ad6d5ae33c5246dba8dae5d54400ef0030"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"e61cb725a8bd35d8895c480e397e46ad6d5ae33c5246dba8dae5d54400ef0030"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"d852d847-6a62-432c-afb6-182890b906fc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n```bash exec\ngit --git-dir=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-320b7f57-0b55-43ce-8a36-9e615c9c6dea/refusing.git update-ref refs/heads/publish/1 refs/heads/diverged\n```\n\n\n\n\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"4481e1f2-f557-4c9f-8943-a858fb33abc7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"8d1caf18-90c9-4eeb-bb2e-a5f54b2c9ef5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:3744ae11fa984bfd","configuration":"3744ae11fa984bfd","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"ecbd3fae3f970d457374cbb69fe7cf5952157b4efb17ca27786bbccb0b6e3427","requestedBase":null,"creationCommit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"ff6439cb75924b6fc9b680a44c6dcbf10a4046d2c19d9a633b697e256fdbbff2","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d74e1c5b-9d73-4b0e-a783-e55f094f10db","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":141,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"ff6439cb75924b6fc9b680a44c6dcbf10a4046d2c19d9a633b697e256fdbbff2","source":{"path":"release.md","offset":141,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2b9bc89d-8317-4536-a1d1-6337263824b4","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"9144de2e81e469b82451f7eb4636b44034a6ea345364d4dc056467fcdcf697a9:project:d903ed564ea3263f","configuration":"d903ed564ea3263f","executablemd.source-position":{"path":"release.md","offset":141,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","before":{"branch":"main","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"6fc85192cc2d2d21342a00df8f86814fd2b40d1a9146eab8a7c1afeff99b8a9d","source":{"path":"release.md","offset":141,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f120203c-e72e-4784-a0ea-d9ae8395ca36","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":175,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"6fc85192cc2d2d21342a00df8f86814fd2b40d1a9146eab8a7c1afeff99b8a9d","source":{"path":"release.md","offset":175,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"03e7ce86-54d8-464f-a980-26f4c0aca632","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:cfcfd308b4e5fbfaa44b760c44546802ad1b7e115912f66a3e31c65a1e547c74:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":175,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"7f9a7d24c33d1a07b9c10adad947a8b6af18bb0aa01fef5952ec91ae01ff831f","source":{"path":"release.md","offset":175,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4211b114-6f5a-4030-8f9c-74539e0f0fb1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":215,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"7f9a7d24c33d1a07b9c10adad947a8b6af18bb0aa01fef5952ec91ae01ff831f","source":{"path":"release.md","offset":215,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d8dc994d-42ec-4146-81f2-7f218a9bfba3","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"0fc63ecec8c78ecdd54d780e2a8e56a89f879f09d27add73ad8ae93c6353c7bd:project:c92cf2916169a903","configuration":"c92cf2916169a903","executablemd.source-position":{"path":"release.md","offset":215,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"66f7e109322476f8f46371b731fcb1a2ecc561e4b33be532efb864d190fa0228","source":{"path":"release.md","offset":215,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"41a0121b-e0b4-42b3-9097-d40bf363a44d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":244,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"66f7e109322476f8f46371b731fcb1a2ecc561e4b33be532efb864d190fa0228","source":{"path":"release.md","offset":244,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"07f75ae8-e002-44aa-9fba-716ac7ba83c9","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"f4b3293bedfd95159f08a2c6e50453351e8a54c0bb0dcd2304d51f628d68cc51:project:8bb0b71c1a33f3ef","configuration":"8bb0b71c1a33f3ef","executablemd.source-position":{"path":"release.md","offset":244,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"31b13e81d57a941428b353ba4b5d32ed59bd4f76","committedAt":1791542799,"before":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"31b13e81d57a941428b353ba4b5d32ed59bd4f76","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":244,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d79583eb-5982-403b-bb9a-01e4fd477c01","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:git --git-dir=/var/folders/6_/pc0hwbg54x","command":["bash","-c","git --git-dir=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-320b7f57-0b55-43ce-8a36-9e615c9c6dea/refusing.git update-ref refs/heads/publish/1 refs/heads/diverged\n"],"executablemd.source-position":{"path":"release.md","offset":304,"line":10,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"","stderr":""}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":304,"line":10,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"c31c6aa0-b597-4df3-9e64-ff1d187617e4","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":495,"line":14,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":495,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d8b07683-7482-48b9-8cc8-86bccfb3d6ba","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"eeaf3ff4d0a484bb0eadb66442e5f3e2e8e5ed7d61550ba8fe2e51e9db2ba8d8:project:3744ae11fa984bfd","configuration":"3744ae11fa984bfd","executablemd.source-position":{"path":"release.md","offset":495,"line":14,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"ecbd3fae3f970d457374cbb69fe7cf5952157b4efb17ca27786bbccb0b6e3427","requestedBase":null,"creationCommit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":495,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"435766a8-4ece-4e3f-957e-6b7a527ebd20","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":636,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":636,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d3e43fd5c7b62167f11ee7246aaef2867deba7428261a9cfd76f60064b977298","executablemd.source-position":{"path":"release.md","offset":636,"line":15,"column":1}},"result":{"status":"err","error":{"message":"the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.","name":"GitHostConflictError","stack":"GitHostConflictError: the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.\n at reconcile (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:469:30)\n at reconcile.next ()\n at Object.run (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:562:48)\n at run.next ()\n at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/durable-streams/effect.ts:412:45\n at Generator.next ()\n at TaskGroup (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/task-group.js:35:27)\n at TaskGroup.next ()\n at Object.with (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/context.js:35:31)\n at with.next ()"}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":636,"line":15,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"external-state-unavailable","eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab"}]}},{"eventId":"617d6713-f6ca-4de2-8ea0-9f77367a4267","event":{"type":"close","coroutineId":"root","result":{"status":"err","error":{"message":"the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.","name":"GitHostConflictError","stack":"GitHostConflictError: the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.\n at GitHostConflictError (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/errors.ts:94:31)\n at gitHostFailure (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/errors.ts:114:42)\n at reconcileGitHostEffect (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:673:11)\n at reconcileGitHostEffect.throw ()\n at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:224:5\n at Generator.throw ()\n at trap (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/trap.js:13:28)\n at trap.throw ()\n at Object.scoped (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/scoped.js:38:44)\n at scoped.throw ()"}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","forkability":{"forkable":false,"blockers":[{"code":"external-state-unavailable","eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab"}]}}] +the prefix ending at "40ec7ce4-00ba-47ae-823e-5c6035c50cab" cannot be forked: external-state-unavailable at 40ec7ce4-00ba-47ae-823e-5c6035c50cab. Select a checkpoint before the earliest of those events. +----- post-test output end ----- + WFF11: a Git-host effect that established nothing is not forkable ... ok (5s) + WFF6: the fork commit is the boundary a crash falls on one side of ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"7139db62-45b8-403d-9ded-1a3158c9bb71","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f45f3816-fe1a-4664-b61f-edbb6181afec","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"21b5038a-4657-4a1e-8cf4-f6ed49e3dca4","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"7b2c02ba-b09a-4e33-aa21-ee39b80694f9","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","forkability":{"forkable":true,"blockers":[]}}] +the candidate definition diverges from the inherited history after 3 of 4 events, at 10ff2695-a681-4436-b8f5-8dea56899899 (workspace_file): Divergence at root[3]: expected workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md") at release.md:3:1, got workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/elsewhere.md") at release.md:3:1 +workflow run: fork-1 +{"record":{"runId":"fork-1","definition":{"hashAlgorithm":"sha256","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"409a785ed4ab316f01bdb8549aed6b0dd3bb35142a39851c66420c32ef4e4a62","byteLength":73}]},"props":{},"status":"running","createdAt":"2026-10-09T10:46:46.150Z","updatedAt":"2026-10-09T10:46:46.150Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-675993b5-2291-4bf2-95a9-2ed00526fdb1/repository","commit":"ac2175d6420999d7b96f358ea4ae7745bd74453b","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:46.150Z"},"executions":[{"executionId":"abb69993-b30d-4311-a961-99bb3f76feff","startedAt":"2026-10-09T10:46:46.153Z"}],"journalFrontier":{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db"},"currentWorkspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","lineage":{"sourceRunId":"source-1","checkpointEventId":"10ff2695-a681-4436-b8f5-8dea56899899","checkpointWorkspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db"}} +[{"eventId":"763a8b72-2d99-494a-a01f-2aad212be349","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"17c5a7e3-c83e-4be9-8a59-982b86c05bd4","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\nsleep 30\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1"}},{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"10ff2695-a681-4436-b8f5-8dea56899899"}}] +workflow cancel: fork-1 (cancelled) +----- post-test output end ----- + WFF6: the fork commit is the boundary a crash falls on one side of ... ok (5s) + WFF7: history forkability is stable, cumulative and free of retained values ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: source-1 +original +# Release + + + +workflow status: completed +[{"eventId":"c29a14bd-5336-4ec7-b174-44058f21c147","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"6a3bd568-8d44-409f-819e-978059c06141","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8269647-cd2d-4705-a215-52e66515c342","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ded0fe31-b5f7-42d4-ac2b-d55a870b4154","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24dd4a56-65f5-4dec-aafc-f38a6435a44e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8bd61eb-a1d1-406c-b3c4-102627c964be","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","forkability":{"forkable":true,"blockers":[]}}] +[{"eventId":"c29a14bd-5336-4ec7-b174-44058f21c147","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"6a3bd568-8d44-409f-819e-978059c06141","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8269647-cd2d-4705-a215-52e66515c342","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ded0fe31-b5f7-42d4-ac2b-d55a870b4154","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24dd4a56-65f5-4dec-aafc-f38a6435a44e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8bd61eb-a1d1-406c-b3c4-102627c964be","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","forkability":{"forkable":true,"blockers":[]}}] +EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS +c29a14bd-5336-4ec7-b174-44058f21c147 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +6a3bd568-8d44-409f-819e-978059c06141 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +a8269647-cd2d-4705-a215-52e66515c342 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +ded0fe31-b5f7-42d4-ac2b-d55a870b4154 workspace_file release.md:3:1 completed 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c yes - +24dd4a56-65f5-4dec-aafc-f38a6435a44e exec release.md:5:1 completed 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c yes - + +Outcome: completed at a8bd61eb-a1d1-406c-b3c4-102627c964be, Workspace 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c +----- post-test output end ----- + WFF7: history forkability is stable, cumulative and free of retained values ... ok (3s) + WFF8: the fork grammar is action-scoped ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +xmd workflow fork requires the checkpoint it continues from — `xmd workflow fork --at= `. `xmd workflow history --forkable` lists the events it may select. +'Tier WFF — xmd workflow fork' has been running for over (1m0s) +xmd workflow fork requires the markdown definition it runs — `xmd workflow fork --at= ` +xmd workflow fork requires the run it continues — `xmd workflow fork --at= ` +unrecognized option for xmd workflow resume: --at — it belongs to another workflow action +unrecognized option for xmd workflow history: --props-channel=stable — document properties belong to the start that created the run, whose props it retained +unrecognized option for xmd workflow status: --forkable — it belongs to another workflow action +unrecognized argument for xmd workflow: flows/release.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFF8: the fork grammar is action-scoped ... ok (5s) +Tier WFF — xmd workflow fork ... ok (1m3s) +running 4 tests from ./packages/cli/tests/workflow-host.test.ts +Tier WFH — workflow host boundary ... + WFH1: an unsupported host refuses before creating or executing anything ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +fatal: not a git repository (or any of the parent directories): .git +workflow run: 493c18ef-e1b0-4995-b380-004b411c9ff8 +# Nothing + +no effects at all +workflow status: completed +----- post-test output end ----- + WFH1: an unsupported host refuses before creating or executing anything ... ok (1s) + WFH2: every host reads the same grammar ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] + +Arguments: + [action] start, resume, fork, answer, status, list, history, cancel, delete or export + [target] markdown definition to start, the run a fork continues, or the run id every other action addresses + [argument] the definition a fork runs, or the wait an answer is delivered to + [value] the answer itself, as one JSON value (answer only) + +Options: + --id [ID] run id to create or address (start and fork only; generated when absent) + --at [AT] the retained event a fork continues from (fork only) + -V, --verbose log journal entries to stderr [default: false] + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + --json write the inspection result as JSON (status, list and history only) [default: false] + --forkable add each event's forkability to the history (history only) [default: false] + --status [STATUS] list only runs retaining this status + --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) + --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + WFH2: every host reads the same grammar ... ok (1s) + WFH4: an unsupported host refuses a delivery, and retains nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "any-run". Start the run before looking it up. +----- post-test output end ----- + WFH4: an unsupported host refuses a delivery, and retains nothing ... ok (1s) + WFH3: an unsupported host refuses a resume too, and reads no store ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "any-run". Start the run before looking it up. +----- post-test output end ----- + WFH3: an unsupported host refuses a resume too, and reads no store ... ok (1s) +Tier WFH — workflow host boundary ... ok (5s) +Tier WFH — GitHub issue handling is adapter configuration ... + installs nothing when nothing is configured ... ok (0ms) + reads a ceiling, and canonicalizes every entry ... ok (1ms) + refuses configuration it cannot use rather than narrowing it ... ok (2ms) +Tier WFH — GitHub issue handling is adapter configuration ... ok (4ms) +Tier WFH — GitHub pull-request reading is adapter configuration ... + authorizes no read when nothing is configured ... ok (0ms) + reads what is allowed, and canonicalizes every entry ... ok (1ms) + refuses configuration it cannot use rather than narrowing it ... ok (1ms) +Tier WFH — GitHub pull-request reading is adapter configuration ... ok (2ms) +Tier WFH — the credential helper is host assembly ... + names the module to Deno from source, and the binary itself when compiled ... ok (0ms) + writes a shell launcher on Unix and a batch launcher on Windows ... ok (0ms) + quotes a path with spaces on either platform ... ok (0ms) + passes Git's operation through, whatever the platform ... ok (0ms) + puts no credential, locator or marker in any launcher ... ok (1ms) + answers as a helper when the real source entrypoint is asked to be one ... ok (528ms) + is an internal mode, dispatched before public parsing and absent from help ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +Usage: xmd [OPTIONS] + +Commands: + run + plan Turn a request into an XMD Plan, review it, and write the approved source. + test + syntax + agent Report the model and effort choices an agent advertises. + upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. + repl Run and reconstruct one XMD entry in an interactive terminal. + test-agent + workflow + +Options: + -h, --help show help + -v, --version show version + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] + +Arguments: + [action] start, resume, fork, answer, status, list, history, cancel, delete or export + [target] markdown definition to start, the run a fork continues, or the run id every other action addresses + [argument] the definition a fork runs, or the wait an answer is delivered to + [value] the answer itself, as one JSON value (answer only) + +Options: + --id [ID] run id to create or address (start and fork only; generated when absent) + --at [AT] the retained event a fork continues from (fork only) + -V, --verbose log journal entries to stderr [default: false] + --raw output raw markdown without normalization or terminal formatting [default: false] + --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] + --json write the inspection result as JSON (status, list and history only) [default: false] + --forkable add each event's forkability to the history (history only) [default: false] + --status [STATUS] list only runs retaining this status + --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) + --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential + -h, --help show help + +PLUGINS + --plugin load a Plugin before the command runs (repeatable) + +A Plugin is a package or a file this invocation names. They install in the +order they are written, and that order is the whole order: xmd ships no +Plugin and installs none unless one is named. + +A selected Plugin is trusted executable code, not a sandboxed extension: +loading one runs its module, and selected Plugin code can execute whatever +the surrounding runtime permits. xmd discovers none on its own — a package +that happens to be installed does nothing until it is named — and loads none +over the network. +----- post-test output end ----- + is an internal mode, dispatched before public parsing and absent from help ... ok (1s) +Tier WFH — the credential helper is host assembly ... ok (2s) +running 2 tests from ./packages/cli/tests/workflow-inspection.test.ts +Tier WFI — xmd workflow status, list and history ... + WFI1: status reports one run, and --json is the same answer structurally ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:06.054Z +updated: 2026-10-09T10:47:06.202Z +retrieval: revision 1 at 2026-10-09T10:47:06.054Z +workspace: 7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25 +journal frontier: 68808a8e-13d1-4762-a5eb-e8d3614ad97f (Workspace 7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25) +executions: 1 + 4d59da7e-9e05-4028-be41-b3710a940751 started 2026-10-09T10:47:06.056Z, completed at 2026-10-09T10:47:06.201Z +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:06.054Z","updatedAt":"2026-10-09T10:47:06.202Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-283326da-44b2-4f91-ae4a-8d958105fddc/repository","commit":"e448eab431b7d285b8205fed7f0e128121849d51","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:06.054Z"},"executions":[{"executionId":"4d59da7e-9e05-4028-be41-b3710a940751","startedAt":"2026-10-09T10:47:06.056Z","stoppedAt":"2026-10-09T10:47:06.201Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"68808a8e-13d1-4762-a5eb-e8d3614ad97f","workspaceRootId":"7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25"},"currentWorkspaceRootId":"7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25"} +----- post-test output end ----- + WFI1: status reports one run, and --json is the same answer structurally ... ok (2s) + WFI1b: a run a lost host left mid-transaction is reported in the same shapes ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +workflow run: healthy-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"} +[{"eventId":"19ba96ab-57be-435d-98eb-443c14f77a2a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b6a649d-f2ec-44ac-8d30-6f4fef639afb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e277fcda-6a39-4ecb-97dc-434616357ac3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ad00b101-9b15-4ae9-939a-51340a6c339e","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4bf9eed5-d4b4-4c8d-87d5-47601cbba5c9","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","forkability":{"forkable":true,"blockers":[]}}] +READY +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"} +[{"eventId":"19ba96ab-57be-435d-98eb-443c14f77a2a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b6a649d-f2ec-44ac-8d30-6f4fef639afb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e277fcda-6a39-4ecb-97dc-434616357ac3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ad00b101-9b15-4ae9-939a-51340a6c339e","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4bf9eed5-d4b4-4c8d-87d5-47601cbba5c9","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","forkability":{"forkable":true,"blockers":[]}}] +[{"record":{"runId":"healthy-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:09.812Z","updatedAt":"2026-10-09T10:47:09.957Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:09.812Z"},"executions":[{"executionId":"dee3c508-0fca-4258-94bf-7ed7c6c020d0","startedAt":"2026-10-09T10:47:09.815Z","stoppedAt":"2026-10-09T10:47:09.956Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"48706d15-bd05-4f62-b353-596377074f05","workspaceRootId":"b4e05c2515bf9435a705d858c5b3b1adda5e338a8d140b5e3733c7e6ea9a0354"},"currentWorkspaceRootId":"b4e05c2515bf9435a705d858c5b3b1adda5e338a8d140b5e3733c7e6ea9a0354"},{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"}] +----- post-test output end ----- + WFI1b: a run a lost host left mid-transaction is reported in the same shapes ... ok (5s) + WFI2: list reports every run newest first and filters by one exact status ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: done-1 +hi +# Release + + + +workflow status: completed +workflow run: failed-1 + + +Failed to import component Missing: Cannot resolve component: Missing (searched: ) +workflow status: failed +[{"record":{"runId":"failed-1","definition":{"hashAlgorithm":"sha256","bundleHash":"9aad8ef9a176eb860b0a47d3415cc9cff806cc909a5fcb57c82bc70681eaddb6","entrypoint":"refusing.md","sources":[{"path":"refusing.md","sourceHash":"0d355040c54205c60287d77fb156cac0546391101891c4bdc7845b6e7dafce1c","byteLength":45}]},"props":{},"status":"failed","createdAt":"2026-10-09T10:47:15.219Z","updatedAt":"2026-10-09T10:47:15.339Z","stopReason":{"kind":"journal","eventId":"7a636c8f-5286-4866-87e1-36dd4e658a5c"}},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:15.219Z"},"executions":[{"executionId":"de846423-5663-4c89-b2f1-25a5831abe09","startedAt":"2026-10-09T10:47:15.221Z","stoppedAt":"2026-10-09T10:47:15.339Z","stopStatus":"failed","stopReason":{"kind":"journal","eventId":"7a636c8f-5286-4866-87e1-36dd4e658a5c"}}],"journalFrontier":{"eventId":"c21b46e9-2868-4ada-87fe-b2ff5d47c623","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},{"record":{"runId":"done-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:14.380Z","updatedAt":"2026-10-09T10:47:14.525Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:14.380Z"},"executions":[{"executionId":"672c5367-8893-4136-bed1-83c3d16b6da9","startedAt":"2026-10-09T10:47:14.383Z","stoppedAt":"2026-10-09T10:47:14.525Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"a3bb63bf-1d16-42e5-8b78-350ca448ec47","workspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"},"currentWorkspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"}] +[{"record":{"runId":"done-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:14.380Z","updatedAt":"2026-10-09T10:47:14.525Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:14.380Z"},"executions":[{"executionId":"672c5367-8893-4136-bed1-83c3d16b6da9","startedAt":"2026-10-09T10:47:14.383Z","stoppedAt":"2026-10-09T10:47:14.525Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"a3bb63bf-1d16-42e5-8b78-350ca448ec47","workspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"},"currentWorkspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"}] +RUN STATUS UPDATED DEFINITION WORKSPACE +failed-1 failed 2026-10-09T10:47:15.339Z 9aad8ef9a176eb860b0a47d3415cc9cff806cc909a5fcb57c82bc70681eaddb6 refusing.md 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +done-1 completed 2026-10-09T10:47:14.525Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad +----- post-test output end ----- + WFI2: list reports every run newest first and filters by one exact status ... ok (4s) + WFI3: history JSON holds every retained event, its root and its authored source ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +[{"eventId":"b2f212a3-6cea-4440-85a1-0fc3c2e08a71","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"8bfc6498-f21d-4d99-ad23-8b8aaa53cd8b","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0f5961a1-1496-422c-b39a-739f2ff1743d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"898f3076-6085-4c93-9ef1-66c69b2c6de0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fdfd947c-51dd-4eda-8fc9-2cc55f6d7a72","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"bbc8708b-6562-4b24-ac4e-78ae91c23417","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","forkability":{"forkable":true,"blockers":[]}}] +EVENT OPERATION SOURCE RESULT WORKSPACE +b2f212a3-6cea-4440-85a1-0fc3c2e08a71 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +8bfc6498-f21d-4d99-ad23-8b8aaa53cd8b import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +0f5961a1-1496-422c-b39a-739f2ff1743d import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +898f3076-6085-4c93-9ef1-66c69b2c6de0 workspace_file release.md:3:1 completed f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 +fdfd947c-51dd-4eda-8fc9-2cc55f6d7a72 exec release.md:5:1 completed f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 + +Outcome: completed at bbc8708b-6562-4b24-ac4e-78ae91c23417, Workspace f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 +----- post-test output end ----- + WFI3: history JSON holds every retained event, its root and its authored source ... ok (2s) + WFI4: a run with no root Close says so rather than inventing an outcome ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: partial-1 +hi +# Release + + + +workflow status: completed +EVENT OPERATION SOURCE RESULT WORKSPACE +76c51517-e869-4294-8ba2-66609e2eb9e7 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +dc37cc8c-fd32-40dc-b4a5-11f82e556c5f import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +f097d5ec-8147-4629-b47e-b13329fa577d import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +7000ec0a-1358-4000-9693-fc7423b8cb90 workspace_file release.md:3:1 completed 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae +24bae7a8-ba9c-4998-bd84-6788729f682c exec release.md:5:1 completed 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae + +Outcome: no canonical document outcome was recorded. +run: partial-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:21.358Z +updated: 2026-10-09T10:47:21.510Z +retrieval: revision 1 at 2026-10-09T10:47:21.358Z +workspace: 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae +journal frontier: 24bae7a8-ba9c-4998-bd84-6788729f682c (Workspace 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae) +executions: 1 + 2f36902f-0d46-4cd5-8114-39d3cfdc5a36 started 2026-10-09T10:47:21.360Z, completed at 2026-10-09T10:47:21.510Z +----- post-test output end ----- + WFI4: a run with no root Close says so rather than inventing an outcome ... ok (2s) + WFI5: reading a run changes nothing about its file ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:24.219Z +updated: 2026-10-09T10:47:24.368Z +retrieval: revision 1 at 2026-10-09T10:47:24.219Z +workspace: 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406 +journal frontier: d56313d2-ca2b-4ef3-9d8b-9d564ce808fa (Workspace 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406) +executions: 1 + 1d6e0a6b-d2e0-49c4-84f0-8c6ff3da4154 started 2026-10-09T10:47:24.221Z, completed at 2026-10-09T10:47:24.368Z +RUN STATUS UPDATED DEFINITION WORKSPACE +release-1 completed 2026-10-09T10:47:24.368Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406 +[{"eventId":"66d91a66-443a-48e4-a4cd-1f317534d3e2","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ce0a9c17-30b5-4659-a746-b5b9fd04d1b5","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"036ae45a-3d11-4645-8c40-271835b908f2","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"87029b17-02fe-4cce-9d88-8280afdb375a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dccd7218-69a5-4010-bab4-16ab3d30ebf3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d56313d2-ca2b-4ef3-9d8b-9d564ce808fa","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFI5: reading a run changes nothing about its file ... ok (3s) + WFI12: a retained Prompt checkpoint reaches no status or history output ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:27.565Z +updated: 2026-10-09T10:47:27.717Z +retrieval: revision 1 at 2026-10-09T10:47:27.565Z +workspace: 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a +journal frontier: 93d7f734-4869-41f7-9957-537e3989db3d (Workspace 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a) +executions: 1 + 94af77ad-fa52-4dbf-9658-ce2378f12bbd started 2026-10-09T10:47:27.567Z, completed at 2026-10-09T10:47:27.716Z +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:27.565Z","updatedAt":"2026-10-09T10:47:27.717Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-42cb3e72-d58c-4ee2-8666-11dd6f6a19d9/repository","commit":"a93cf50640c7b533da9b1fb43d8db06571cc0c9a","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:27.565Z"},"executions":[{"executionId":"94af77ad-fa52-4dbf-9658-ce2378f12bbd","startedAt":"2026-10-09T10:47:27.567Z","stoppedAt":"2026-10-09T10:47:27.716Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"},"currentWorkspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"} +RUN STATUS UPDATED DEFINITION WORKSPACE +release-1 completed 2026-10-09T10:47:27.717Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a +[{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:27.565Z","updatedAt":"2026-10-09T10:47:27.717Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-42cb3e72-d58c-4ee2-8666-11dd6f6a19d9/repository","commit":"a93cf50640c7b533da9b1fb43d8db06571cc0c9a","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:27.565Z"},"executions":[{"executionId":"94af77ad-fa52-4dbf-9658-ce2378f12bbd","startedAt":"2026-10-09T10:47:27.567Z","stoppedAt":"2026-10-09T10:47:27.716Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"},"currentWorkspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"}] +EVENT OPERATION SOURCE RESULT WORKSPACE +19c5ccee-9800-426a-8048-4ab95b82a646 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +b8ac7974-6267-4170-a849-1c3341e1220d import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +60073d09-ad68-4ddc-a229-a0032462455b import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +19fa3181-9bb4-47fc-9cb4-9383de1e6c20 workspace_file release.md:3:1 completed 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a +4dae717a-4c6b-4834-9d38-12f38b4ba813 exec release.md:5:1 completed 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a + +Outcome: completed at 93d7f734-4869-41f7-9957-537e3989db3d, Workspace 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a +[{"eventId":"19c5ccee-9800-426a-8048-4ab95b82a646","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b8ac7974-6267-4170-a849-1c3341e1220d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"60073d09-ad68-4ddc-a229-a0032462455b","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"19fa3181-9bb4-47fc-9cb4-9383de1e6c20","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4dae717a-4c6b-4834-9d38-12f38b4ba813","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","forkability":{"forkable":true,"blockers":[]}}] +----- post-test output end ----- + WFI12: a retained Prompt checkpoint reaches no status or history output ... ok (4s) + WFI6: one unreadable candidate fails the whole list ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-3f94ed0f-a12b-4c5d-863a-a6be16d7003c/runs/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.sqlite is not a workflow-run database: SQLite does not recognize it as a database. It is left unchanged. +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:32.540Z +updated: 2026-10-09T10:47:32.697Z +retrieval: revision 1 at 2026-10-09T10:47:32.540Z +workspace: 8986346d95eb1722be9118d634c96e4b1f425fc6311ed73512363d4fc5609f21 +journal frontier: c177ecd8-9b2e-45a1-9452-85d137848a9c (Workspace 8986346d95eb1722be9118d634c96e4b1f425fc6311ed73512363d4fc5609f21) +executions: 1 + 491f2ca0-fdae-477c-b212-cfd257b66ad5 started 2026-10-09T10:47:32.543Z, completed at 2026-10-09T10:47:32.697Z +----- post-test output end ----- + WFI6: one unreadable candidate fails the whole list ... ok (2s) + WFI7: the grammar is by action, and refuses what an action does not have ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +unrecognized option for xmd workflow status: --forkable — it belongs to another workflow action +unrecognized argument for xmd workflow list: release-1 — list reports every run and names none +xmd workflow list accepts one --status filter, and two name two different lists +unrecognized value for --status: nowhere — expected one of running, suspended, interrupted, completed, failed, cancelled +unrecognized option for xmd workflow cancel: --json — it belongs to another workflow action +unrecognized option for xmd workflow status: --verbose — it belongs to another workflow action +No workflow run is stored under the run id "release-*". Start the run before looking it up. +xmd workflow status needs something to inspect — a run id (`xmd workflow status `) for a retained run, or `xmd workflow status --artifact=` for a sealed artifact. +----- post-test output end ----- + WFI7: the grammar is by action, and refuses what an action does not have ... ok (5s) + WFI8: a dash-leading run id is what `--` is for, and an extra one is refused ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: -inspected-run +hi +# Release + + + +workflow status: completed +run: -inspected-run +status: completed +definition: e6f2040ebc8a3ada51557d4deadbf10c1c39962aef50d3e0991dd1f0293bba1f -release.md +props: {} +created: 2026-10-09T10:47:41.213Z +updated: 2026-10-09T10:47:41.359Z +retrieval: revision 1 at 2026-10-09T10:47:41.213Z +workspace: 4df1d1f1e95b00bab1910d39dfb5980834965cf9a4b247b841fc8b416e663a47 +journal frontier: 08338cd0-399d-49bd-bce9-7e829234fcd2 (Workspace 4df1d1f1e95b00bab1910d39dfb5980834965cf9a4b247b841fc8b416e663a47) +executions: 1 + 8fb98c5f-b71d-461b-a852-888b3af464ae started 2026-10-09T10:47:41.216Z, completed at 2026-10-09T10:47:41.359Z +unrecognized argument for xmd workflow: unexpected — start names one definition, resume names one run, and answer names a run, a wait and one JSON value +----- post-test output end ----- + WFI8: a dash-leading run id is what `--` is for, and an extra one is refused ... ok (2s) + WFI10: an inspection reads no definition, so it answers outside a repository ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:44.026Z +updated: 2026-10-09T10:47:44.179Z +retrieval: revision 1 at 2026-10-09T10:47:44.026Z +workspace: 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 +journal frontier: 72c48853-0793-4e94-91e8-3461fed0ee32 (Workspace 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243) +executions: 1 + a0842304-8c6f-404d-9f6e-619f51a99a18 started 2026-10-09T10:47:44.028Z, completed at 2026-10-09T10:47:44.179Z +EVENT OPERATION SOURCE RESULT WORKSPACE +b50a000b-9b33-4c85-b925-51c292d57dce workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +3a8a5756-fb01-4394-b8ab-8dd6a863bfa7 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +eb281e51-23d0-4d4f-9611-5cb58b44bf82 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 +c2f0ab54-a483-4e3f-8dd6-ffa19a8530b9 workspace_file release.md:3:1 completed 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 +96d81262-9dd8-4402-9d04-cc14d881c85a exec release.md:5:1 completed 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 + +Outcome: completed at 72c48853-0793-4e94-91e8-3461fed0ee32, Workspace 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 +RUN STATUS UPDATED DEFINITION WORKSPACE +release-1 completed 2026-10-09T10:47:44.179Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 +----- post-test output end ----- + WFI10: an inspection reads no definition, so it answers outside a repository ... ok (3s) + WFI11: a run id holding * or ? is inspected exactly, and matches nothing else ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-* +hi +# Release + + + +workflow status: completed +workflow run: release-? +hi +# Release + + + +workflow status: completed +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-*","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:47.400Z","updatedAt":"2026-10-09T10:47:47.550Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:47.400Z"},"executions":[{"executionId":"3640a2ba-59cd-49bb-89b0-cf2e04f36df6","startedAt":"2026-10-09T10:47:47.402Z","stoppedAt":"2026-10-09T10:47:47.550Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"e1d75989-b4e8-4633-b3a3-f66eb5200759","workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90"},"currentWorkspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90"} +{"record":{"runId":"release-?","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:48.230Z","updatedAt":"2026-10-09T10:47:48.387Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:48.230Z"},"executions":[{"executionId":"f8ddcc2f-3bf0-48fa-be6b-00d81ff975e2","startedAt":"2026-10-09T10:47:48.233Z","stoppedAt":"2026-10-09T10:47:48.386Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"cb0d67cd-752b-4f69-a304-5f14aee633cd","workspaceRootId":"b2409dfe09657b991ff9b53d8f2e0318e54765a0be1617d52484c7f4d40e01c1"},"currentWorkspaceRootId":"b2409dfe09657b991ff9b53d8f2e0318e54765a0be1617d52484c7f4d40e01c1"} +[{"eventId":"0f33de4a-d6e2-4189-be71-05acef0204b0","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-*","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"66cd34ad-873f-46fd-918c-cc7c75f0457c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"427d19c5-d519-4800-ae2b-bf6295311132","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"bbf18ee0-2ecc-4e37-9d73-e9827d167bfa","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"21353211-e3ed-4d34-b371-6d37be142833","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e1d75989-b4e8-4633-b3a3-f66eb5200759","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","forkability":{"forkable":true,"blockers":[]}}] +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:49.088Z","updatedAt":"2026-10-09T10:47:49.233Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:49.088Z"},"executions":[{"executionId":"82633d70-7153-4d5d-b244-08528a7e0a76","startedAt":"2026-10-09T10:47:49.090Z","stoppedAt":"2026-10-09T10:47:49.233Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"6a09879d-c3f7-4754-b74c-24f8f8e937fa","workspaceRootId":"0556d0efa0c5b73cd2e6a7883d23c4168c5d6ccfd8f2b33c31f29c65c5bd6438"},"currentWorkspaceRootId":"0556d0efa0c5b73cd2e6a7883d23c4168c5d6ccfd8f2b33c31f29c65c5bd6438"} +No workflow run is stored under the run id "release-2". Start the run before looking it up. +----- post-test output end ----- + WFI11: a run id holding * or ? is inspected exactly, and matches nothing else ... ok (6s) + WFI9: an absent run is reported, and reading it creates nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "never-started". Start the run before looking it up. +No workflow run is stored under the run id "never-started". Start the run before looking it up. +no workflow runs +----- post-test output end ----- + WFI9: an absent run is reported, and reading it creates nothing ... ok (2s) +Tier WFI — xmd workflow status, list and history ... ok (49s) +Tier WFI — xmd workflow status and history over a sealed artifact ... + I1: an artifact answers the retained questions, and says which artifact it is ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:56.005Z","updatedAt":"2026-10-09T10:47:56.160Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository","commit":"7fd360d34b54ef5957ad1e8b3fae05bb432d5ebd","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:56.005Z"},"executions":[{"executionId":"a29cb119-9585-4910-a89e-d3887cb3d7b4","startedAt":"2026-10-09T10:47:56.008Z","stoppedAt":"2026-10-09T10:47:56.160Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"},"currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"} +[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}] +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd +workflow run: release-1 +workflow frontier: 1fdf685a-7853-4a72-9f47-d980c4461f74 +workflow root: 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d +workflow artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e +workflow artifact sha256: cfd95929b1c9875898d431425b8f426c7d894976a23775476d7fc69fe52338b6 +{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:47:56.005Z","updatedAt":"2026-10-09T10:47:56.160Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"a29cb119-9585-4910-a89e-d3887cb3d7b4","startedAt":"2026-10-09T10:47:56.008Z","stoppedAt":"2026-10-09T10:47:56.160Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"},"currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}}} +{"artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}},"entries":[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}]} +{"artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}},"entries":[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}]} +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd +artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e +artifact frontier: run release-1, event 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:47:56.005Z +updated: 2026-10-09T10:47:56.160Z +workspace: 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d +journal frontier: 1fdf685a-7853-4a72-9f47-d980c4461f74 (Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d) +executions: 1 + a29cb119-9585-4910-a89e-d3887cb3d7b4 started 2026-10-09T10:47:56.008Z, completed at 2026-10-09T10:47:56.160Z +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd +artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e +artifact frontier: run release-1, event 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d +EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS +5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +476ecff1-1f8c-408b-b1cc-71998905d540 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +f83df33e-c819-4faa-ab37-fafcf19d57d1 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - +82044f6d-ecc0-470e-a692-f85cd371dee8 workspace_file release.md:3:1 completed 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d yes - +af08853a-3ed7-462f-9875-942ef9260da3 exec release.md:5:1 completed 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d yes - + +Outcome: completed at 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d +----- post-test output end ----- + I1: an artifact answers the retained questions, and says which artifact it is ... ok (6s) + I1b: the frontier names the last event's own root, not the current pointer ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:02.073Z","updatedAt":"2026-10-09T10:48:02.228Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8c3c3441-7241-4814-aa4e-a1096467c542/repository","commit":"82fb13ff0f34e0264356907a3614239c5c41a0ed","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:02.073Z"},"executions":[{"executionId":"72fa77e6-e42e-4d22-87ff-3b61c5a823f8","startedAt":"2026-10-09T10:48:02.075Z","stoppedAt":"2026-10-09T10:48:02.228Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3e8485ff-f928-4591-a50e-1d500aab179d","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2"} +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8c3c3441-7241-4814-aa4e-a1096467c542/repository/diverged.xmd +workflow run: release-1 +workflow frontier: 3e8485ff-f928-4591-a50e-1d500aab179d +workflow root: 3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2 +workflow artifact identity: 85e7aa165d7c8903bac1d7ef36c807484c9a10b3a1791d1a395ddc4a9942c111 +workflow artifact sha256: 5a4b225119a548e01e729adfd4e9ae251c768bb73359fca82e4b82514b948766 +{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:02.073Z","updatedAt":"2026-10-09T10:48:02.228Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"72fa77e6-e42e-4d22-87ff-3b61c5a823f8","startedAt":"2026-10-09T10:48:02.075Z","stoppedAt":"2026-10-09T10:48:02.228Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3e8485ff-f928-4591-a50e-1d500aab179d","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2","artifact":{"identity":"85e7aa165d7c8903bac1d7ef36c807484c9a10b3a1791d1a395ddc4a9942c111","frontier":{"sourceRunId":"release-1","finalEventId":"3e8485ff-f928-4591-a50e-1d500aab179d","currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2"}}} +----- post-test output end ----- + I1b: the frontier names the last event's own root, not the current pointer ... ok (3s) + I2: where the file is, is presentation — never part of the answer ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository","commit":"9383f194efcb135b9ca6e8bc5dc0d41629cdec46","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:05.474Z"},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"} +[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}] +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/evidence.xmd +workflow run: release-1 +workflow frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b +workflow root: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e +workflow artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 +workflow artifact sha256: 01e05ccb62d23463318f34789ce5b925c74acf7b9fd2f943dc47e687f8734663 +{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}}} +{"artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}},"entries":[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}]} +{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}}} +{"artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}},"entries":[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}]} +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/evidence.xmd +artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 +artifact frontier: run release-1, event d7dc19ea-2d08-452d-9594-b2cb3e69fd5b, Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:48:05.474Z +updated: 2026-10-09T10:48:05.623Z +workspace: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e +journal frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b (Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e) +executions: 1 + c27c007c-0581-45db-83f5-d0d5841c65a0 started 2026-10-09T10:48:05.476Z, completed at 2026-10-09T10:48:05.623Z +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/copies/same.xmd +artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 +artifact frontier: run release-1, event d7dc19ea-2d08-452d-9594-b2cb3e69fd5b, Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:48:05.474Z +updated: 2026-10-09T10:48:05.623Z +workspace: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e +journal frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b (Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e) +executions: 1 + c27c007c-0581-45db-83f5-d0d5841c65a0 started 2026-10-09T10:48:05.476Z, completed at 2026-10-09T10:48:05.623Z +----- post-test output end ----- + I2: where the file is, is presentation — never part of the answer ... ok (6s) + I3: inspecting an artifact reaches no run, and writes nothing ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:12.053Z","updatedAt":"2026-10-09T10:48:12.204Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-a77a5d5b-2c1f-4ceb-9b17-28851d1ee315/repository","commit":"613caeb088287bb2c40898c0930d7230f7a1b0d4","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:12.053Z"},"executions":[{"executionId":"65843f85-a4e7-4885-b691-74bf64174c75","startedAt":"2026-10-09T10:48:12.055Z","stoppedAt":"2026-10-09T10:48:12.203Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"},"currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"} +[{"eventId":"c296d521-fe5f-4e2b-a591-032ae896179b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c0e41362-78c2-4023-b1f8-449310cbcdd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b7ac91aa-e7a5-496c-b6f4-eb2d773c0eef","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"91b5350f-9acd-4d08-858a-e81fc5eef6a0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6abecbd4-1a04-4ba8-837b-a946e8a14504","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","forkability":{"forkable":true,"blockers":[]}}] +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-a77a5d5b-2c1f-4ceb-9b17-28851d1ee315/repository/evidence.xmd +workflow run: release-1 +workflow frontier: eb73591a-fea3-454e-8635-29aa8336276e +workflow root: b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84 +workflow artifact identity: 686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920 +workflow artifact sha256: 4bf6b991cd1612b5c348aa68b4dbac936c580140780e4e049dde83e9d3217735 +{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:12.053Z","updatedAt":"2026-10-09T10:48:12.204Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"65843f85-a4e7-4885-b691-74bf64174c75","startedAt":"2026-10-09T10:48:12.055Z","stoppedAt":"2026-10-09T10:48:12.203Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"},"currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","artifact":{"identity":"686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920","frontier":{"sourceRunId":"release-1","finalEventId":"eb73591a-fea3-454e-8635-29aa8336276e","currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"}}} +{"artifact":{"identity":"686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920","frontier":{"sourceRunId":"release-1","finalEventId":"eb73591a-fea3-454e-8635-29aa8336276e","currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"}},"entries":[{"eventId":"c296d521-fe5f-4e2b-a591-032ae896179b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c0e41362-78c2-4023-b1f8-449310cbcdd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b7ac91aa-e7a5-496c-b6f4-eb2d773c0eef","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"91b5350f-9acd-4d08-858a-e81fc5eef6a0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6abecbd4-1a04-4ba8-837b-a946e8a14504","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","forkability":{"forkable":true,"blockers":[]}}]} +----- post-test output end ----- + I3: inspecting an artifact reaches no run, and writes nothing ... ok (4s) + I4: a file that is not an artifact is refused before anything is presented ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:16.587Z","updatedAt":"2026-10-09T10:48:16.737Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository","commit":"7111a498de0022870c0ba4713be51e2e528e48a6","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:16.587Z"},"executions":[{"executionId":"5d536300-01a7-4152-9253-b4c3ce7535e7","startedAt":"2026-10-09T10:48:16.590Z","stoppedAt":"2026-10-09T10:48:16.737Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3a84b8e2-0b10-4d81-9191-574b8ac6f14e","workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80"},"currentWorkspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80"} +[{"eventId":"ee44e56a-879d-41ff-9328-c0c3ffe8cf2d","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"d389bc97-177d-4afe-a5be-d3fe1b253791","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"2117b1ec-eb3e-4de2-8a99-cc7ea638de19","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ae3de7a9-42a8-48eb-bdde-cb862942b5f7","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"01fcf65b-7ec7-4420-9246-cf7314987371","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"3a84b8e2-0b10-4d81-9191-574b8ac6f14e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","forkability":{"forkable":true,"blockers":[]}}] +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/evidence.xmd +workflow run: release-1 +workflow frontier: 3a84b8e2-0b10-4d81-9191-574b8ac6f14e +workflow root: faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 +workflow artifact identity: 271abe466f57d169666a9e5d0f1739baf0a9af7da2eef950795013b7b184e56b +workflow artifact sha256: 7a02543697d54f15f0450007e6b7daf0b420dbc3c350321761afe34ed56c18f5 +The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/damaged.xmd is not an XMD artifact: SQLite does not recognize it as a database. It is left unchanged. +The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/damaged.xmd is not an XMD artifact: SQLite does not recognize it as a database. It is left unchanged. +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/evidence.xmd +artifact identity: 271abe466f57d169666a9e5d0f1739baf0a9af7da2eef950795013b7b184e56b +artifact frontier: run release-1, event 3a84b8e2-0b10-4d81-9191-574b8ac6f14e, Workspace faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 +run: release-1 +status: completed +definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md +props: {} +created: 2026-10-09T10:48:16.587Z +updated: 2026-10-09T10:48:16.737Z +workspace: faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 +journal frontier: 3a84b8e2-0b10-4d81-9191-574b8ac6f14e (Workspace faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80) +executions: 1 + 5d536300-01a7-4152-9253-b4c3ce7535e7 started 2026-10-09T10:48:16.590Z, completed at 2026-10-09T10:48:16.737Z +----- post-test output end ----- + I4: a file that is not an artifact is refused before anything is presented ... ok (5s) + I5: exactly one source, and list stays a registry of runs ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +hi +# Release + + + +workflow status: completed +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:21.503Z","updatedAt":"2026-10-09T10:48:21.653Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository","commit":"f42779bdc61922367c3a333b3d9b412c8028fcf8","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:21.503Z"},"executions":[{"executionId":"9917f1d4-2ebb-44eb-9acb-b83d482c6861","startedAt":"2026-10-09T10:48:21.506Z","stoppedAt":"2026-10-09T10:48:21.653Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"},"currentWorkspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"} +[{"eventId":"2f96dcec-b411-46d8-b9f5-ae00e1f3b751","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ea81e3f3-9ef5-4f2d-91e1-0a8eb6c30239","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0a2156b5-31f8-4ac8-bfe0-2559cd6c678c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"3f7a960d-e00a-4e57-8560-e35037f2e2b3","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a78e4de6-3425-4026-90f7-f00a4f6768e8","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","forkability":{"forkable":true,"blockers":[]}}] +workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd +workflow run: release-1 +workflow frontier: 59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c +workflow root: d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417 +workflow artifact identity: 790fffb288a3da8c8f08d4b955e2b46406f5df3b60f8e097e7c1a4c8d59a19fb +workflow artifact sha256: 425bfa9e3bb63bffcad0b9bc0e2479de5dfcf893625d05df46d07df79e152fc6 +xmd workflow status needs something to inspect — a run id (`xmd workflow status `) for a retained run, or `xmd workflow status --artifact=` for a sealed artifact. +xmd workflow status inspects one thing — the run "release-1" or the artifact "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd", not both. Drop whichever one you did not mean. +xmd workflow status inspects one artifact, and two --artifact options name two different files +xmd workflow history needs something to inspect — a run id (`xmd workflow history `) for a retained run, or `xmd workflow history --artifact=` for a sealed artifact. +xmd workflow history inspects one thing — the run "release-1" or the artifact "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd", not both. Drop whichever one you did not mean. +xmd workflow history inspects one artifact, and two --artifact options name two different files +[{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:21.503Z","updatedAt":"2026-10-09T10:48:21.653Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository","commit":"f42779bdc61922367c3a333b3d9b412c8028fcf8","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:21.503Z"},"executions":[{"executionId":"9917f1d4-2ebb-44eb-9acb-b83d482c6861","startedAt":"2026-10-09T10:48:21.506Z","stoppedAt":"2026-10-09T10:48:21.653Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"},"currentWorkspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"}] +unrecognized option for xmd workflow list: --artifact — it belongs to another workflow action +unrecognized option for xmd workflow cancel: --artifact — it belongs to another workflow action +----- post-test output end ----- + I5: exactly one source, and list stays a registry of runs ... ok (8s) + I6: a finalized artifact's checkpoint and bundle evidence reaches no output ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd +artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 +artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +run: release-1.4 +status: suspended +definition: fee1b10874315dcbd100bb36a32b4fcc1d5d727da63250e99286036a62d9f25f workflows/release.md#release-steps +props: {"channel":"stable","retries":2} +created: 2026-01-02T03:04:05.000Z +updated: 2026-01-02T03:44:05.000Z +stop reason: journal event event-7 +forked from: release-1.3 at origin-2 (Workspace a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208) +workspace: 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +journal frontier: event-12 (Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb) +executions: 2 + execution-0 started 2026-01-02T03:04:05.000Z, interrupted at 2026-01-02T03:14:05.000Z + execution-1 started 2026-01-02T03:24:05.000Z, suspended at 2026-01-02T03:44:05.000Z +{"record":{"runId":"release-1.4","props":{"channel":"stable","retries":2},"status":"suspended","stopReason":{"kind":"journal","eventId":"event-7"},"createdAt":"2026-01-02T03:04:05.000Z","updatedAt":"2026-01-02T03:44:05.000Z","definition":{"hashAlgorithm":"sha256","bundleHash":"fee1b10874315dcbd100bb36a32b4fcc1d5d727da63250e99286036a62d9f25f","entrypoint":"workflows/release.md","sources":[{"path":"workflows/Checklist.md","sourceHash":"07015f69ff64556e40f1b662664edb371917dfd9ce736564de0c7cc31dbdaf03","byteLength":10},{"path":"workflows/Unused.md","sourceHash":"fd7e3b692ffc1862cc4dd847afa694d10e19805796a27aef21698e3654a63a3a","byteLength":48},{"path":"workflows/release.md","sourceHash":"e155d8bf3842de569979f953b92bbf3cc7d5db68d9468b77a8ef7bc2ad5e8f23","byteLength":25}],"targetPath":"release-steps","components":[{"name":"Checklist","path":"workflows/Checklist.md"},{"name":"Unused","path":"workflows/Unused.md"}]}},"executions":[{"executionId":"execution-0","startedAt":"2026-01-02T03:04:05.000Z","stoppedAt":"2026-01-02T03:14:05.000Z","stopStatus":"interrupted","stopReason":{"kind":"host","code":"host-lost"}},{"executionId":"execution-1","startedAt":"2026-01-02T03:24:05.000Z","stoppedAt":"2026-01-02T03:44:05.000Z","stopStatus":"suspended","stopReason":{"kind":"journal","eventId":"event-7"}}],"journalFrontier":{"eventId":"event-12","workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"},"currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","lineage":{"sourceRunId":"release-1.3","checkpointEventId":"origin-2","checkpointWorkspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208"},"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}}} +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd +artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 +artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +EVENT OPERATION SOURCE RESULT WORKSPACE +event-0 call workflows/release.md:3:1 completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 +event-1 suspension_request - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 +event-2 suspension_answer - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 +event-3 git_effect workflows/release.md:9:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-4 end of root.0 - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-5 suspension_request workflows/release.md:11:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-6 suspension_answer - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-7 suspension_request workflows/release.md:14:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-8 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-9 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-10 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-11 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +event-12 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb + +Outcome: no canonical document outcome was recorded. +{"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}},"entries":[{"eventId":"event-0","event":{"type":"yield","coroutineId":"root","description":{"type":"call","name":"workflow_run","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":3,"column":1}},"result":{"status":"ok","value":{"runId":"release-1.4"}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","source":{"path":"workflows/release.md","offset":0,"line":3,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-1","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd","request":{"kind":"approval","release":"1.3"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]}},"result":{"status":"ok","value":"c753b28bc956b71df2bd6edec9e185fd"}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-1"}},{"eventId":"event-2","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-2"}},{"eventId":"event-3","event":{"type":"yield","coroutineId":"root.0","description":{"type":"git_effect","name":"push","branch":"release","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":9,"column":1}},"result":{"status":"ok","value":{"commit":"9fceb02d0ae598e95dc970b74767f19372d61af8"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":9,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-3"}},{"eventId":"event-4","event":{"type":"close","coroutineId":"root.0","result":{"status":"ok","value":null}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-5","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4","request":{"kind":"approval","release":"1.4"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":11,"column":1}},"result":{"status":"ok","value":"d4f44f4045734897aa9999f472b4c7e4"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":11,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-6","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-7","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"bb918fa9153ede998639df289cb6e007","suspensionId":"bb918fa9153ede998639df289cb6e007","request":{"kind":"confirmation","question":"ship it?"},"responseSchema":{"type":"string"},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":14,"column":1}},"result":{"status":"ok","value":"bb918fa9153ede998639df289cb6e007"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":14,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-8","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-9","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 1 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-10","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-11","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"failed","text":"turn 1 reply","stopReason":"refusal"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-12","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[3]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:e73fcae09729af1ae89ed54a98272ab6","agentSessionId":"sess_04V","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}}]} +artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd +artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 +artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb +EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS +event-0 call workflows/release.md:3:1 completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 +event-1 suspension_request - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 +event-2 suspension_answer - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 +event-3 git_effect workflows/release.md:9:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 +event-4 end of root.0 - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 +event-5 suspension_request workflows/release.md:11:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 +event-6 suspension_answer - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 +event-7 suspension_request workflows/release.md:14:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 +event-8 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 +event-9 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 +event-10 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 +event-11 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 +event-12 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 + +Outcome: no canonical document outcome was recorded. +{"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}},"entries":[{"eventId":"event-0","event":{"type":"yield","coroutineId":"root","description":{"type":"call","name":"workflow_run","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":3,"column":1}},"result":{"status":"ok","value":{"runId":"release-1.4"}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","source":{"path":"workflows/release.md","offset":0,"line":3,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-1","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd","request":{"kind":"approval","release":"1.3"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]}},"result":{"status":"ok","value":"c753b28bc956b71df2bd6edec9e185fd"}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-1"}},{"eventId":"event-2","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-2"}},{"eventId":"event-3","event":{"type":"yield","coroutineId":"root.0","description":{"type":"git_effect","name":"push","branch":"release","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":9,"column":1}},"result":{"status":"ok","value":{"commit":"9fceb02d0ae598e95dc970b74767f19372d61af8"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":9,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-3"}},{"eventId":"event-4","event":{"type":"close","coroutineId":"root.0","result":{"status":"ok","value":null}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-5","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4","request":{"kind":"approval","release":"1.4"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":11,"column":1}},"result":{"status":"ok","value":"d4f44f4045734897aa9999f472b4c7e4"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":11,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-6","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-7","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"bb918fa9153ede998639df289cb6e007","suspensionId":"bb918fa9153ede998639df289cb6e007","request":{"kind":"confirmation","question":"ship it?"},"responseSchema":{"type":"string"},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":14,"column":1}},"result":{"status":"ok","value":"bb918fa9153ede998639df289cb6e007"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":14,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-8","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-9","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 1 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-10","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-11","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"failed","text":"turn 1 reply","stopReason":"refusal"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-12","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[3]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:e73fcae09729af1ae89ed54a98272ab6","agentSessionId":"sess_04V","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}}]} +----- post-test output end ----- + I6: a finalized artifact's checkpoint and bundle evidence reaches no output ... ok (4s) +Tier WFI — xmd workflow status and history over a sealed artifact ... ok (37s) +running 1 test from ./packages/cli/tests/workflow-installation.test.ts +Tier WFI — what a run hands to canonical core ... + WFI1: a run reaches core as one installation carrying its admission and preparation ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +workflow run: 49759785-2257-49f6-b770-0433e37fa698 +workflow status: completed +----- post-test output end ----- + WFI1: a run reaches core as one installation carrying its admission and preparation ... ok (191ms) + WFI2: a completed run is given no Workspace to attach ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +workflow run: dbee8c72-c06f-4886-a1bf-30df9998b57b +workflow status: completed +workflow run: dbee8c72-c06f-4886-a1bf-30df9998b57b +workflow status: completed +----- post-test output end ----- + WFI2: a completed run is given no Workspace to attach ... ok (182ms) + WFI3: a failed or cancelled run is refused before anything is opened ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +----- post-test output end ----- + WFI3: a failed or cancelled run is refused before anything is opened ... ok (375ms) + WFI4: completed and interrupted runs are still admitted ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +workflow run: 16b3be26-d81c-40b6-b5d7-40522f6a2338 +workflow status: completed +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +workflow run: 6e48c23d-a459-4b8b-880b-65307b4740f3 +workflow status: completed +----- post-test output end ----- + WFI4: completed and interrupted runs are still admitted ... ok (360ms) + WFI5: a lifecycle write storage refused is never published as a status ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +----- post-test output end ----- + WFI5: a lifecycle write storage refused is never published as a status ... ok (174ms) + WFI6: an interruption storage refusal is never published as a status ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +----- post-test output end ----- + WFI6: an interruption storage refusal is never published as a status ... ok (173ms) + WFI7: an interruption that was retained keeps the ordinary outcome ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +sha1 +----- post-test output end ----- + WFI7: an interruption that was retained keeps the ordinary outcome ... ok (170ms) +Tier WFI — what a run hands to canonical core ... ok (1s) +running 2 tests from ./packages/cli/tests/workflow-lifecycle-control.test.ts +Tier WFC2 — xmd workflow cancel and delete ... + WFC2-1: a completed run refuses cancellation and reports its own request ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +Nothing but prose. +workflow status: completed +workflow run completed: a run whose outcome already won is not cancelled. The run is left exactly as it is. +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:36.235Z","updatedAt":"2026-10-09T10:48:36.354Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-caa92541-8581-407b-b402-9f0e87a6cc53/repository","commit":"56aee67dcb8e63dfc3b5b4b719e9d1c764d66d5f","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:36.235Z"},"executions":[{"executionId":"9768f2c7-80db-422d-a890-b66b3c997a3c","startedAt":"2026-10-09T10:48:36.238Z","stoppedAt":"2026-10-09T10:48:36.354Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"829921f6-8ae2-4a57-88bf-7e57348bd6d1","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} +----- post-test output end ----- + WFC2-1: a completed run refuses cancellation and reports its own request ... ok (2s) + WFC2-2: cancelling a resumable run succeeds and reports the retained status ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +Nothing but prose. +workflow status: completed +workflow cancel: release-1 (cancelled) +{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"cancelled","createdAt":"2026-10-09T10:48:39.094Z","updatedAt":"2026-10-09T10:48:39.739Z","stopReason":{"kind":"host","code":"cancelled"}},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-40177019-6016-41d0-95cc-b2aa5752338a/repository","commit":"e4f4ec86d30e68d172d559c07c32baf9986b09c3","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:39.094Z"},"executions":[{"executionId":"affed2a9-6466-4c82-8fcb-66506a22ec24","startedAt":"2026-10-09T10:48:39.096Z","stoppedAt":"2026-10-09T10:48:39.210Z","stopStatus":"interrupted"}],"journalFrontier":{"eventId":"14c6d97a-cef5-4869-a777-a32e4fc359e1","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} +workflow cancel: release-1 (cancelled) +----- post-test output end ----- + WFC2-2: cancelling a resumable run succeeds and reports the retained status ... ok (3s) + WFC2-3: delete removes the run and says what went ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: release-1 +# Release + +Nothing but prose. +workflow status: completed +workflow run: release-2 +# Release + +Nothing but prose. +workflow status: completed +workflow delete: release-1 (run-storage) +{"record":{"runId":"release-2","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:43.145Z","updatedAt":"2026-10-09T10:48:43.260Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-205d3ec6-7279-421d-8b59-a331a01243f2/repository","commit":"9cb35c5de81a9138c48b6e0575d226853109d7f5","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:43.145Z"},"executions":[{"executionId":"98ff4f7c-d71a-44d8-a151-b66b59a4c84b","startedAt":"2026-10-09T10:48:43.148Z","stoppedAt":"2026-10-09T10:48:43.260Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"2eb28e1a-0988-415b-834a-5442f627c839","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} +No workflow run is stored under the run id "release-1". Start the run before looking it up. +----- post-test output end ----- + WFC2-3: delete removes the run and says what went ... ok (4s) + WFC2-4: an absent run is refused by both, and nothing is created ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +No workflow run is stored under the run id "never-started". Start the run before looking it up. +No workflow run is stored under the run id "never-started". Start the run before looking it up. +----- post-test output end ----- + WFC2-4: an absent run is refused by both, and nothing is created ... ok (1s) +Tier WFC2 — xmd workflow cancel and delete ... ok (12s) +Tier WFC3 — cancelling a run that is settling into a suspension ... + WFC3-1: refuses against the live lock, changes nothing, and settlement continues ... +------- post-test output ------- +e0aca5625f85532c6fbc1b4b62f45c1ce235373f +workflow run: 8f45c269-9abf-445d-b95c-cc7f37cc87ef +workflow suspension: 6a23f0e26a6bb42e3e2cd6599790bbc2 +workflow status: suspended +----- post-test output end ----- + WFC3-1: refuses against the live lock, changes nothing, and settlement continues ... ok (215ms) + WFC3-2: an attachment that fails to release settles failed, never suspended ... +------- post-test output ------- +e0aca5625f85532c6fbc1b4b62f45c1ce235373f +workflow run: 6274e44a-f5e5-41c3-b4d7-b64b18629d96 +PLANTED-ATTACHMENT-RELEASE-FAILURE +workflow status: failed +----- post-test output end ----- + WFC3-2: an attachment that fails to release settles failed, never suspended ... ok (176ms) +Tier WFC3 — cancelling a run that is settling into a suspension ... ok (392ms) +running 2 tests from ./packages/cli/tests/workflow-retention.test.ts +Tier FG — workflow retention ... + FG22: a workflow run retains its process results without naming a journal ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: retention-run +to-outto-err# Prints + +workflow status: completed +----- post-test output end ----- + FG22: a workflow run retains its process results without naming a journal ... ok (1s) +Tier FG — workflow retention ... ok (1s) +Tier FG — retained source ... + FG40: an edited, moved or deleted original changes nothing about the run ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: retained-edited +retained-output# Retained + +this line is the retained source + +workflow status: completed +workflow run: retained-edited +# Retained + +this line is the retained source + +workflow status: completed +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: retained-moved +retained-output# Retained + +this line is the retained source + +workflow status: completed +workflow run: retained-moved +# Retained + +this line is the retained source + +workflow status: completed +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: retained-deleted +retained-output# Retained + +this line is the retained source + +workflow status: completed +workflow run: retained-deleted +# Retained + +this line is the retained source + +workflow status: completed +----- post-test output end ----- + FG40: an edited, moved or deleted original changes nothing about the run ... ok (7s) + FG43: a damaged retained source refuses, and never falls back to the file ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: fallback-1 +retained-output# Retained + +this line is the retained source + +workflow status: completed +This workflow run's retained source bundle disagrees with its own descriptor: a retained source is not the content it names. No partial source is returned and the run is left unchanged. +----- post-test output end ----- + FG43: a damaged retained source refuses, and never falls back to the file ... ok (2s) + FG42: another entrypoint, or other bytes, is another run and conflicts ... +------- post-test output ------- +Download https://registry.npmjs.org/effection +Download https://registry.npmjs.org/@effectionx%2fmiddleware +Download https://registry.npmjs.org/@effectionx%2fstream-helpers +Download https://registry.npmjs.org/@effectionx%2fprocess +Download https://registry.npmjs.org/configliere +Download https://registry.npmjs.org/zod +Download https://registry.npmjs.org/@effectionx%2ftimebox +Download https://registry.npmjs.org/@effectionx%2fcontext-api +Download https://registry.npmjs.org/@effectionx%2ffetch +Download https://registry.npmjs.org/@effectionx%2ffs +Download https://registry.npmjs.org/@effectionx%2fnode +Download https://registry.npmjs.org/remend +Download https://registry.npmjs.org/@effectionx%2fscope-eval +Download https://registry.npmjs.org/acorn +Download https://registry.npmjs.org/magic-string +Download https://registry.npmjs.org/marked +Download https://registry.npmjs.org/marked-terminal +Download https://registry.npmjs.org/remark +Download https://registry.npmjs.org/mdast-util-to-string +Download https://registry.npmjs.org/gray-matter +Download https://registry.npmjs.org/@effectionx%2fconverge +Download https://registry.npmjs.org/unist-util-select +Download https://registry.npmjs.org/ajv +Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend +Download https://registry.npmjs.org/semver +Download https://registry.npmjs.org/@durable-streams%2fclient +Download https://registry.npmjs.org/@secretlint%2fprofiler +Download https://registry.npmjs.org/@secretlint%2fcore +Download https://registry.npmjs.org/@bomb.sh%2ftty +Download https://registry.npmjs.org/@agentclientprotocol%2fsdk +Download https://registry.npmjs.org/remark-rehype +Download https://registry.npmjs.org/rehype-sanitize +Download https://registry.npmjs.org/rehype-stringify +Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 +Download https://registry.npmjs.org/esbuild-wasm +workflow run: named-1 +retained-output# Retained + +this line is the retained source + +workflow status: completed +The workflow run "named-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +fatal: not a git repository (or any of the parent directories): .git +The workflow run "named-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. +----- post-test output end ----- + FG42: another entrypoint, or other bytes, is another run and conflicts ... ok (3s) +Tier FG — retained source ... ok (12s) +running 3 tests from ./packages/cli/tests/workflow-suspension.test.ts +Tier WFS — a suspended run and its no-input resumes ... + WFS1: suspends, exits 2, releases the lock, and resumes into the same wait ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b +workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 +workflow status: suspended +workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b +workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 +workflow status: suspended +workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b +workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 +workflow status: suspended +----- post-test output end ----- + WFS1: suspends, exits 2, releases the lock, and resumes into the same wait ... ok (264ms) + WFS2: a run that never waits is unchanged by the suspension controller ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +workflow run: 8fd64caa-097a-440d-811a-d10120a35265 +workflow status: completed +workflow run: 8fd64caa-097a-440d-811a-d10120a35265 +workflow status: completed +----- post-test output end ----- + WFS2: a run that never waits is unchanged by the suspension controller ... ok (195ms) + WFS4: a delivery retains a value, changes nothing else, and a resume spends it ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +workflow run: a34186e4-7b8d-42c5-96b5-e285545f1b58 +workflow suspension: cfdcc7bd22aaee2e4c274d6643511321 +workflow status: suspended +workflow run: a34186e4-7b8d-42c5-96b5-e285545f1b58 +workflow status: completed +----- post-test output end ----- + WFS4: a delivery retains a value, changes nothing else, and a resume spends it ... ok (218ms) + WFS5: a delivery does not take the executor lock, and a wrong wait is refused ... +------- post-test output ------- +947000f5b6b77abe20d41bf2e8a3076952632743 +workflow run: b7475ae0-b372-49db-a854-38b056f6f148 +workflow suspension: a7bc692c1dc8dea67dcae8041167a402 +workflow status: suspended +----- post-test output end ----- + WFS5: a delivery does not take the executor lock, and a wrong wait is refused ... ok (196ms) + WFS3: an ordinary execution outside a workflow run is unaffected ... ok (16ms) +Tier WFS — a suspended run and its no-input resumes ... ok (895ms) +Tier CKX — a checkpoint a document asked for ... + CK1: a real start suspends, reports its identifiers, and releases the lock ... +------- post-test output ------- +924b8330998e936c0b508ed0770169ac3e838f8b +----- post-test output end ----- + CK1: a real start suspends, reports its identifiers, and releases the lock ... ok (239ms) + CK3/CK4: a delivery executes nothing, and a resume repeats no committed effect ... +------- post-test output ------- +924b8330998e936c0b508ed0770169ac3e838f8b +----- post-test output end ----- + CK3/CK4: a delivery executes nothing, and a resume repeats no committed effect ... ok (273ms) + CK5: an invalid and a duplicate delivery are refused, byte for byte ... +------- post-test output ------- +924b8330998e936c0b508ed0770169ac3e838f8b +----- post-test output end ----- + CK5: an invalid and a duplicate delivery are refused, byte for byte ... ok (232ms) +Tier CKX — a checkpoint a document asked for ... ok (744ms) +Tier WGAC — generated effects in a bundled component resume through a later wait ... + WGAC16: a generated read inside a bundled component resumes through the later wait ... +------- post-test output ------- +48aadd41a081f55c6bbf83826e55575ed33c0f81 +b8c10cb98dcc036d8f1f70e53542dda4fa70ba1f +----- post-test output end ----- + WGAC16: a generated read inside a bundled component resumes through the later wait ... ok (333ms) + WGAC16: a generated write inside a bundled component resumes through the later wait ... +------- post-test output ------- +7157374928496bf7036f0a0f2abc35bd649de3e0 +dcf70a8012c31d961bcfeb7e9496986bed11c9c3 +----- post-test output end ----- + WGAC16: a generated write inside a bundled component resumes through the later wait ... ok (322ms) + WGAC17: the current admission executes Dir, resumes, and publishes nothing further ... +------- post-test output ------- +7157374928496bf7036f0a0f2abc35bd649de3e0 +280f23b4058010992a008da95058e246eb5fc270 +----- post-test output end ----- + WGAC17: the current admission executes Dir, resumes, and publishes nothing further ... ok (319ms) + WGAC17: a continuation retaining the former Dir identity refuses before generated execution and mutation ... +------- post-test output ------- +7157374928496bf7036f0a0f2abc35bd649de3e0 +d60a46e4ea456c8fc590be09440b9b92989e5e34 +----- post-test output end ----- + WGAC17: a continuation retaining the former Dir identity refuses before generated execution and mutation ... ok (316ms) +Tier WGAC — generated effects in a bundled component resume through a later wait ... ok (1s) + +ok | 290 passed (1423 steps) | 0 failed (18m24s) + diff --git a/packages/cli/src/repl/fitting.ts b/packages/cli/src/repl/fitting.ts new file mode 100644 index 000000000..ab28c1830 --- /dev/null +++ b/packages/cli/src/repl/fitting.ts @@ -0,0 +1,466 @@ +/** + * How wide text actually is, asked of the engine that will draw it. + * + * The installed engine answers natural width through a fit-sized element: give + * it the same text operations a row will be drawn with, read the bounds it + * reports, and that is the number of cells those operations occupy. There is no + * public line-break API and no renderer change, so wrapping is built on top of + * that one question asked repeatedly. + * + * ## Why not `text.length` + * + * A UTF-16 code unit is not a cell. `界` is one unit and two cells; a combining + * accent is one unit and no cells at all; an emoji is a surrogate pair and two + * cells. Every width decision here is therefore an engine answer, and every cut + * is at a grapheme boundary — because a cut between a base character and its + * combining mark produces two rows neither of which is a character. + * + * UTF-16 offsets index source. They never stand in for terminal width. + * + * ## Why batched + * + * Each measurement is a render, and the engine's reported geometry is only + * valid until the next one — so every answer is copied out before another + * measurement is asked for. Candidates are therefore grouped: one measurement + * answers for every row still looking for its cut, and the search narrows all + * of them together rather than one row at a time. + * + * ## Why it refuses rather than clips + * + * A region with no room for even one grapheme cannot hold the reading, and + * shortening somebody's source to fit would be this screen editing the content + * it exists to show. So an unfittable row is a frame refusal, which already + * recovers on resize. + */ + +import { close, fit, open, text } from "@bomb.sh/tty"; +import type { Op } from "@bomb.sh/tty"; +import { Err, Ok } from "effection"; +import type { Operation, Result } from "effection"; +import type { ReplRenderer } from "./renderer.ts"; +import type { ReplTerminalSize } from "./terminal.ts"; +import type { ReplReadingLine } from "./source-reading.ts"; +import { READING_STATUSES } from "./source-reading.ts"; +import { runText, tokenRuns } from "./description.ts"; +import type { ReplTokenRun } from "./description.ts"; + +/** What a reading could not be fitted into. */ +export class ReplFitRefusal extends Error { + constructor(message: string) { + super(message); + this.name = "ReplFitRefusal"; + } +} + +/** + * One visual row of a reading, fitted to a measured width. + * + * Immutable frame preparation data. The same list answers how many rows there + * are, which of them a window admits, what each description says and which + * boxes a frame places — so a row count and a drawn row cannot disagree about + * what was prepared. + */ +export interface ReplPreparedRow { + readonly key: string; + /** Exactly the characters this row draws. Never trimmed, never shortened. */ + readonly text: string; + /** What each part of that text is. Concatenates to exactly `text`. */ + readonly runs: readonly ReplTokenRun[]; + /** The logical line this row came from. */ + readonly line: string; + /** Whether a previous row already carried the start of that line. */ + readonly continuation: boolean; + readonly rail: ReplReadingLine["rail"]; + readonly depth: number; + /** Present on a logical line's first row only. */ + readonly badge: readonly ReplTokenRun[] | undefined; + readonly style: ReplReadingLine["style"]; + /** How many cells the engine says `text` occupies. */ + readonly width: number; +} + +/** What a prepared reading reserved before any of its text was fitted. */ +export interface ReplFitReservation { + /** The rail column, measured rather than counted. */ + readonly rail: number; + /** The gap between the rail and the text. */ + readonly separator: number; + /** The status column, wide enough for every reading a badge can hold. */ + readonly status: number; + /** What is left for text after all three. */ + readonly content: number; + /** How wide the engine says each badge reading is, by its exact text. */ + readonly statusWidths: ReadonlyMap; +} + +/** A reading prepared for one measured width. */ +export interface ReplPreparedReading { + readonly reservation: ReplFitReservation; + readonly rows: readonly ReplPreparedRow[]; +} + +/** The rail glyph, and the gap between it and the text beside it. */ +const RAIL = "│"; +const SEPARATOR = " "; + +/** + * Ask the engine how wide each of these texts is. + * + * One fit-sized element per text, each under its own structural id, all in one + * render — and every answer copied into a plain map before returning, because + * the engine's geometry is only valid until the next measurement. + */ +function* widths( + renderer: ReplRenderer, + size: ReplTerminalSize, + texts: readonly string[], +): Operation> { + if (texts.length === 0) { + return Ok([]); + } + const ops: Op[] = [ + open("fit:root", { layout: { width: fit(), height: fit(), direction: "ttb" } }), + ]; + for (const [index, one] of texts.entries()) { + ops.push(open(`fit:${index}`, { layout: { width: fit(), height: fit() } })); + if (one.length > 0) { + ops.push(text(one)); + } + ops.push(close()); + } + ops.push(close()); + const measured = yield* renderer.measure(ops, size); + if (!measured.ok) { + return measured; + } + const answers: number[] = []; + for (const [index, one] of texts.entries()) { + // An empty text occupies nothing; the engine gives its element no bounds to + // report, which is the same answer said differently. + if (one.length === 0) { + answers.push(0); + continue; + } + const bounds = measured.value.boundsOf(`fit:${index}`); + if (bounds === undefined) { + return Err(new ReplFitRefusal(`the engine measured no width for ${JSON.stringify(one)}`)); + } + answers.push(Math.ceil(bounds.width)); + } + return Ok(answers); +} + +/** + * What a reading reserves before any of its text is fitted. + * + * The rail, the gap after it and the status column, every one of them an engine + * answer rather than a character count — `◀ EXIT · ● WAITING` is nineteen code + * units and nineteen cells only by coincidence, and the glyphs in it are + * exactly the characters a count gets wrong. + * + * The status column is the widest reading a badge can hold, including the + * cleanup wait that says two things at once. Reserving per row instead would + * make every phase change re-cut the source beside it, so a reader watching an + * element settle would see their own document reflow. + */ +export function* reserveFor( + renderer: ReplRenderer, + size: ReplTerminalSize, + room: number, +): Operation> { + const measured = yield* widths(renderer, size, [RAIL, SEPARATOR, ...READING_STATUSES]); + if (!measured.ok) { + return measured; + } + const [rail, separator, ...statuses] = measured.value; + const status = statuses.reduce((widest, one) => Math.max(widest, one), 0); + const content = room - rail - separator - separator - status; + if (content < 1) { + return Err( + new ReplFitRefusal( + `a reading needs ${rail + separator + separator + status + 1} columns and has ${room}`, + ), + ); + } + const statusWidths = new Map(); + for (const [index, one] of READING_STATUSES.entries()) { + statusWidths.set(one, statuses[index]); + } + return Ok(Object.freeze({ rail, separator, status, content, statusWidths })); +} + +/** + * One reading's logical lines as the rows they are drawn in. + * + * Every nonempty iteration consumes source, so this terminates and nothing is + * dropped: concatenating one logical line's rows recovers exactly its text, + * whitespace and all. A blank logical line stays one row, because it is a line + * of somebody's document. + */ +export function* prepareReading( + renderer: ReplRenderer, + size: ReplTerminalSize, + lines: readonly ReplReadingLine[], + room: number, +): Operation> { + const reserved = yield* reserveFor(renderer, size, room); + if (!reserved.ok) { + return reserved; + } + const reservation = reserved.value; + const cut: ReplPreparedRow[] = []; + // Nesting is drawn inside the content region rather than beside it, so a + // deeply nested element loses text room rather than pushing the status column + // off the pane it was measured against. + for (const line of lines) { + const indent = Math.min(line.depth * 2, Math.max(0, reservation.content - 1)); + const fitted = yield* fitLine(renderer, size, line, reservation.content - indent); + if (!fitted.ok) { + return fitted; + } + cut.push(...fitted.value); + } + // The finished candidates, measured again as the text they ended up being. + // The search above narrowed over prefixes; this is the row, and a row that + // does not fit the region it was cut for is a frame refusal rather than + // something to clip. + const measured = yield* widths( + renderer, + size, + cut.map((one) => one.text), + ); + if (!measured.ok) { + return measured; + } + const rows: ReplPreparedRow[] = []; + for (const [index, one] of cut.entries()) { + const width = measured.value[index]; + const indent = Math.min(one.depth * 2, Math.max(0, reservation.content - 1)); + if (width > reservation.content - indent) { + return Err( + new ReplFitRefusal( + `row ${one.key} measured ${width} columns in ${reservation.content - indent}`, + ), + ); + } + rows.push(Object.freeze({ ...one, width })); + } + return Ok(Object.freeze({ reservation, rows: Object.freeze(rows) })); +} + +/** One logical line as its rows. */ +function* fitLine( + renderer: ReplRenderer, + size: ReplTerminalSize, + line: ReplReadingLine, + room: number, +): Operation> { + // A blank line is a row. Measuring it would ask the engine the width of + // nothing, and dropping it would edit the shape of somebody's document. + if (line.text.length === 0) { + return Ok([row(line, "", 0, false)]); + } + const whole = yield* widths(renderer, size, [line.text]); + if (!whole.ok) { + return whole; + } + if (whole.value[0] <= room) { + return Ok([row(line, line.text, 0, false)]); + } + const rows: ReplPreparedRow[] = []; + let at = 0; + while (at < line.text.length) { + const rest = line.text.slice(at); + const cut = yield* cutAt(renderer, size, rest, room); + if (!cut.ok) { + return cut; + } + rows.push(row(line, rest.slice(0, cut.value), at, at > 0)); + at += cut.value; + } + return Ok(Object.freeze(rows)); +} + +/** + * How many code units of `rest` fit in `room`, cut where a reader would cut. + * + * The longest prefix the engine measures as fitting, then back to its last + * whitespace boundary if it has one — whitespace kept in the prefix, because it + * is part of the line and the next row does not begin with somebody else's + * space. A word longer than the region has no such boundary and is broken at + * the longest fitting grapheme instead, which is the only way text wider than + * its pane can be read at all. + */ +function* cutAt( + renderer: ReplRenderer, + size: ReplTerminalSize, + rest: string, + room: number, +): Operation> { + const stops = graphemeStops(rest); + // Narrow by halves over grapheme boundaries, asking the engine for one batch + // of candidates per round rather than one render per candidate. + let low = 0; + let high = stops.length - 1; + while (low < high) { + const middle = Math.ceil((low + high) / 2); + const measured = yield* widths(renderer, size, [rest.slice(0, stops[middle])]); + if (!measured.ok) { + return measured; + } + if (measured.value[0] <= room) { + low = middle; + } else { + high = middle - 1; + } + } + if (low === 0) { + // Not one grapheme fits. Clipping it would show the reader a row that is + // not what their file says, so the frame refuses instead. + return Err( + new ReplFitRefusal( + `${room} columns hold no grapheme of ${JSON.stringify(rest.slice(0, stops[1] ?? 1))}`, + ), + ); + } + const longest = stops[low]; + const preferred = wordBoundary(rest, longest); + return Ok(preferred === undefined ? longest : preferred); +} + +/** + * The last whitespace boundary at or before `longest`, or none. + * + * Counted as the offset *after* the run of whitespace, so the spaces a reader + * typed stay on the row that ends with them. A boundary at zero is not one: it + * would consume nothing and loop. + */ +function wordBoundary(text: string, longest: number): number | undefined { + let at: number | undefined; + for (let index = 0; index < longest; index += 1) { + if (/\s/.test(text[index]) && !/\s/.test(text[index + 1] ?? "x")) { + at = index + 1; + } + } + return at === undefined || at === 0 ? undefined : at; +} + +/** + * Every grapheme boundary of a string, as offsets into it. + * + * `Intl.Segmenter` is what decides, so a base character and its combining + * marks are one stop and an emoji sequence is one stop. The list starts at zero + * and ends at the string's length, so `stops[n]` is always a slice offset. + */ +function graphemeStops(text: string): readonly number[] { + const stops: number[] = [0]; + for (const { index } of segmenter.segment(text)) { + if (index > 0) { + stops.push(index); + } + } + stops.push(text.length); + return stops; +} + +const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" }); + +/** + * One prepared row. + * + * The runs are cut by the same offsets the text was, so a token that spans a + * break becomes two runs of one role rather than one row of ordinary prose. + * Only the first row of a logical line carries its badge. + */ +function row( + line: ReplReadingLine, + shown: string, + from: number, + continuation: boolean, +): ReplPreparedRow { + return Object.freeze({ + // Replaced by the engine's answer for this exact row before the reading is + // returned; nothing reads it in between. + width: 0, + key: continuation ? `${line.key}+${from}` : line.key, + text: shown, + runs: slicedRuns(line.runs, from, from + shown.length), + line: line.key, + continuation, + rail: line.rail, + depth: line.depth, + badge: continuation ? undefined : line.badge, + style: line.style, + }); +} + +/** + * The part of a run list covering one half-open slice of its text. + * + * Roles survive the cut: a quoted value broken across two rows is a quoted + * value on both of them. A run the slice does not touch is absent rather than + * empty, which is what keeps the list concatenating to exactly the row's text. + */ +function slicedRuns( + runs: readonly ReplTokenRun[], + from: number, + to: number, +): readonly ReplTokenRun[] { + const parts: { readonly text: string; readonly token: ReplTokenRun["token"] }[] = []; + let at = 0; + for (const run of runs) { + const start = Math.max(at, from); + const end = Math.min(at + run.text.length, to); + if (end > start) { + parts.push({ text: run.text.slice(start - at, end - at), token: run.token }); + } + at += run.text.length; + } + return tokenRuns(parts); +} + +/** + * One prepared row as the runs a description carries. + * + * Rail, the gap after it, the nesting indent, the row's own text, then the + * badge against the region's right inner edge. One row of runs, which is what + * the existing presentation already draws as several text operations inside one + * measured element — so this introduces no second rendering path and inherits + * the bound that keeps a row inside its own region. + * + * The padding is arithmetic over engine answers, not over character counts: + * every width in it was measured, and the badge column is the reservation every + * row of the reading shares. + */ +export function readingRuns( + prepared: ReplPreparedReading, + one: ReplPreparedRow, +): readonly ReplTokenRun[] { + const { reservation } = prepared; + const indent = Math.min(one.depth * 2, Math.max(0, reservation.content - 1)); + const parts: { readonly text: string; readonly token: ReplTokenRun["token"] }[] = [ + { text: RAIL, token: one.rail }, + { text: SEPARATOR, token: "punctuation" }, + ]; + if (indent > 0) { + parts.push({ text: " ".repeat(indent), token: "punctuation" }); + } + for (const run of one.runs) { + parts.push({ text: run.text, token: run.token }); + } + const badge = one.badge; + const shown = badge === undefined ? "" : runText(badge); + const width = badge === undefined ? 0 : (reservation.statusWidths.get(shown) ?? shown.length); + // Everything between the end of the text and the start of the status column, + // so a row with no badge still ends where the reading ends and the column is + // the same column on every row of it. + const gap = + reservation.content - indent - one.width + reservation.separator + (reservation.status - width); + if (gap > 0) { + parts.push({ text: " ".repeat(gap), token: "punctuation" }); + } + for (const run of badge ?? []) { + parts.push({ text: run.text, token: run.token }); + } + return tokenRuns(parts); +} diff --git a/packages/cli/src/repl/presentation-style.ts b/packages/cli/src/repl/presentation-style.ts index a0a62ad3b..ad3425d3b 100644 --- a/packages/cli/src/repl/presentation-style.ts +++ b/packages/cli/src/repl/presentation-style.ts @@ -104,7 +104,20 @@ export type ReplPresentationRole = /** The line the next entry is typed on. */ | "draft" /** A retained position, and the band that holds them. */ - | "history"; + | "history" + /** The rail beside a reading, saying which region an element occupies. */ + | "rail-pending" + | "rail-active" + | "rail-waiting" + | "rail-exit" + | "rail-settled" + /** What one call of one element is doing, as its glyph and its word. */ + | "lifecycle-enter" + | "lifecycle-active" + | "lifecycle-waiting" + | "lifecycle-exit" + | "lifecycle-settled" + | "lifecycle-failed"; /** * One row's presentation facts, as the reading settles them. @@ -193,6 +206,31 @@ export const REPL_PALETTE = Object.freeze({ bindingsSurface: 0x0a0c0e, /** A pane's edge. */ edge: 0x161c21, + /** An element one call of which has been entered. */ + lifecycleEnter: 0x5aa87c, + /** One that is expanding. */ + lifecycleActive: 0x7fd3e8, + /** One that is waiting on somebody. */ + lifecycleWaiting: 0xc99a3f, + /** One whose body returned and whose resources are being released. */ + lifecycleExit: 0xc2766e, + /** One that finished. */ + lifecycleSettled: 0x4f8468, + /** One that failed. */ + lifecycleFailed: 0xd24b3f, + /** + * The rails beside a reading, one per phase the occupied region is in. + * + * Dimmer than the badge of the same phase on purpose: a rail runs the whole + * height of an element and says only *where* it is, so it must not compete + * with the text it encloses or with the badge that says what the phase is. + */ + railActive: 0x2f6272, + railWaiting: 0x4a3a1c, + railExit: 0x5d3c39, + railSettled: 0x2e3c35, + /** Source nothing has been observed in. Not a phase: an absence of one. */ + railPending: 0x252b30, }); /** @@ -329,6 +367,28 @@ function colourOf(role: ReplPresentationRole, inspected: boolean): number { return REPL_PALETTE.waiting; case "history": return REPL_PALETTE.historical; + case "rail-pending": + return REPL_PALETTE.railPending; + case "rail-active": + return REPL_PALETTE.railActive; + case "rail-waiting": + return REPL_PALETTE.railWaiting; + case "rail-exit": + return REPL_PALETTE.railExit; + case "rail-settled": + return REPL_PALETTE.railSettled; + case "lifecycle-enter": + return REPL_PALETTE.lifecycleEnter; + case "lifecycle-active": + return REPL_PALETTE.lifecycleActive; + case "lifecycle-waiting": + return REPL_PALETTE.lifecycleWaiting; + case "lifecycle-exit": + return REPL_PALETTE.lifecycleExit; + case "lifecycle-settled": + return REPL_PALETTE.lifecycleSettled; + case "lifecycle-failed": + return REPL_PALETTE.lifecycleFailed; case "source": case "status": case "draft": diff --git a/packages/cli/src/repl/source-reading.ts b/packages/cli/src/repl/source-reading.ts new file mode 100644 index 000000000..4fc1a792c --- /dev/null +++ b/packages/cli/src/repl/source-reading.ts @@ -0,0 +1,678 @@ +/** + * One entry, as the thing a reader came to look at: what it produced, and the + * source that produced it with what each part of it is doing. + * + * Private to this REPL. It takes a frozen model entry, whatever the session's + * lifecycle reading currently says, and the live output of a run still going, + * and answers one immutable list of logical lines. It measures nothing, draws + * nothing and reads no context: a description asks it what to show and the + * frame decides how wide that is. + * + * ## Output first, then source + * + * A reader opens an entry to see what it came to. The source is why it came to + * that, and it is long — so the result is above it and both share one window, + * which is what makes scrolling down from an answer into the reason for it one + * movement rather than two panes to reconcile. + * + * ## Static syntax is not execution + * + * `inspectSource` says where the executable elements of a text are written. It + * says nothing about whether any of them ran: a retained prefix shows the same + * elements it always showed, and a cold process reconstructs no phase at all. + * So an element acquires a phase only from an observation actually attributed + * to it — matched on this entry, its lineage and its recorded source position — + * and source nothing was observed in gets the rail that means *nothing was + * observed here*, never a borrowed one. + * + * ## Generated source replaces, and keeps its own offsets + * + * An `` that admitted a generated fragment shows that fragment where + * its producer was written, because the producer is an implementation detail of + * text the reader is being asked to read. The enclosure bytes stay exactly as + * authored and only what they enclose is substituted, so the opening and + * closing tags a reader sees are the ones in their file. + * + * The fragment is a *child region* rather than a splice: its offsets index its + * own text, which is the only space its own recorded positions were ever + * counted in. Splicing would renumber them and attribute its elements to the + * wrong bytes of somebody else's file. + */ + +import { inspectSource } from "@executablemd/core"; +import type { SourceElement } from "@executablemd/core"; +import type { ReplEntry, ReplGenerated, ReplScope } from "./model.ts"; +import type { ReplLifecycleReading, ReplOccurrence } from "./lifecycle.ts"; +import { styleOf } from "./presentation-style.ts"; +import type { ReplPresentationRole, ReplRowStyle } from "./presentation-style.ts"; +import { tokenRuns } from "./description.ts"; +import type { ReplTokenRun } from "./description.ts"; +import { sourceRuns } from "./presentation-text.ts"; + +/** What this terminal draws for each phase, glyph and word together. */ +const BADGES: Readonly< + Record< + "enter" | "active" | "waiting" | "exit" | "settled" | "failed", + { + readonly glyph: string; + readonly word: string; + readonly role: ReplPresentationRole; + } + > +> = Object.freeze({ + enter: Object.freeze({ glyph: "▶", word: "ENTER", role: "lifecycle-enter" }), + active: Object.freeze({ glyph: "●", word: "ACTIVE", role: "lifecycle-active" }), + waiting: Object.freeze({ glyph: "●", word: "WAITING", role: "lifecycle-waiting" }), + exit: Object.freeze({ glyph: "◀", word: "EXIT", role: "lifecycle-exit" }), + settled: Object.freeze({ glyph: "✓", word: "SETTLED", role: "lifecycle-settled" }), + failed: Object.freeze({ glyph: "×", word: "FAILED", role: "lifecycle-failed" }), +}); + +/** + * Every reading a badge can hold, so the stable status column is a measurement + * rather than a guess. + * + * The widest is a cleanup wait, which is two readings at once; a frame reserves + * for that and every phase-only change afterwards reuses the same reservation + * and the same source cuts. Cancellation keeps this terminal's existing word + * rather than acquiring a glyph the archive never gave it. + */ +export const READING_STATUSES: readonly string[] = Object.freeze([ + ...Object.values(BADGES).map((one) => `${one.glyph} ${one.word}`), + `${BADGES.exit.glyph} ${BADGES.exit.word} · ${BADGES.waiting.glyph} ${BADGES.waiting.word}`, + "cancelled", +]); + +/** One line of a reading, before anything has been fitted to a width. */ +export interface ReplReadingLine { + /** Stable within one reading, so a window and a target agree on a row. */ + readonly key: string; + /** The logical text of this line. Never trimmed, never shortened. */ + readonly text: string; + /** What each part of that text is. Concatenates to exactly `text`. */ + readonly runs: readonly ReplTokenRun[]; + /** Which region this line is in, as a rail role. */ + readonly rail: ReplPresentationRole; + /** How deeply nested the region is, counted from the entry's own source. */ + readonly depth: number; + /** + * What the element owning this line is doing, or none. + * + * Present on the first line of an observed element's opening delimiter and on + * the first line of its closing one, and nowhere else: a badge on every + * wrapped continuation would say the phase changed between two halves of one + * tag. + */ + readonly badge: readonly ReplTokenRun[] | undefined; + readonly style: ReplRowStyle; +} + +/** One captioned part of a reading. */ +export interface ReplReadingSection { + readonly caption: string; + readonly captionStyle: ReplRowStyle; + readonly lines: readonly ReplReadingLine[]; +} + +/** One entry's whole reading: what it produced, then what produced it. */ +export interface ReplReading { + readonly output: ReplReadingSection; + readonly source: ReplReadingSection; +} + +/** Nothing to read. What a prefix that admitted no entry shows. */ +export const NO_READING: ReplReading = Object.freeze({ + output: Object.freeze({ + caption: "No entry output recorded at this checkpoint.", + captionStyle: styleOf("metadata"), + lines: Object.freeze([]), + }), + source: Object.freeze({ + caption: "Source", + captionStyle: styleOf("pane-heading"), + lines: Object.freeze([]), + }), +}); + +/** What a reading is being built for. */ +export interface ReplReadingRequest { + readonly entry: ReplEntry; + /** This session's observations, or an empty reading for a retained prefix. */ + readonly lifecycle: ReplLifecycleReading; + /** Text a run still going has emitted, or empty. */ + readonly live: string; + /** Whether this reading is a retained position rather than the live head. */ + readonly inspected: boolean; +} + +/** + * One entry as output then source. + * + * The two halves are decided from the typed record, never from the text that + * came out of it: a document whose own prose contains the word `failed` is + * still output, and a root that closed `err` is a failure whatever it rendered. + */ +export function entryReading(request: ReplReadingRequest): ReplReading { + return Object.freeze({ + output: outputSection(request), + source: sourceSection(request), + }); +} + +/** + * What this entry produced. + * + * Four readings, and exactly one of them is true at a time. Live text is + * labelled as live because it is still arriving and the reader must not take a + * partial document for a finished one; a retained final result replaces it once + * and stops being labelled. A root that settled having rendered nothing is not + * an absence of information — it is the outcome, which is said instead. + */ +function outputSection(request: ReplReadingRequest): ReplReadingSection { + const { entry, live, inspected } = request; + const terminal = entry.terminal; + if (terminal === undefined) { + // Still going. Its own emitted text, if any has arrived. + if (live.length > 0) { + return Object.freeze({ + caption: "Output · live", + captionStyle: styleOf("waiting", { inspected }), + lines: plain(live, "output:live", styleOf("output", { inspected })), + }); + } + return Object.freeze({ + caption: "No entry output recorded at this checkpoint.", + captionStyle: styleOf("metadata", { inspected }), + lines: Object.freeze([]), + }); + } + if (terminal.output.length > 0) { + return Object.freeze({ + caption: "Output", + captionStyle: styleOf("pane-heading", { inspected }), + lines: plain(terminal.output, "output", styleOf("output", { inspected })), + }); + } + // Settled with nothing rendered. The outcome is the reading, and it is read + // from the recorded status rather than from any word in any prose. + const outcome: ReplPresentationRole = + terminal.status === "ok" + ? "successful-outcome" + : terminal.status === "err" + ? "failed-outcome" + : "waiting"; + const said = terminal.status === "cancelled" ? "cancelled" : `closed ${terminal.status}`; + return Object.freeze({ + caption: "No rendered output.", + captionStyle: styleOf("metadata", { inspected }), + lines: plain(said, "output:outcome", styleOf(outcome, { inspected })), + }); +} + +/** Text as lines nothing has been observed in. */ +function plain(text: string, prefix: string, style: ReplRowStyle): readonly ReplReadingLine[] { + return Object.freeze( + text.split("\n").map((one, index) => + Object.freeze({ + key: `${prefix}:${index}`, + text: one, + runs: tokenRuns([{ text: one, token: style.role }]), + rail: "rail-pending" as const, + depth: 0, + badge: undefined, + style, + }), + ), + ); +} + +/** + * The source this entry admitted, with what each part of it is doing. + * + * A refusal is not a blank pane: inspection refusing this text means the + * scanner would refuse it too, and a reader looking at source the engine will + * not accept needs to be told that rather than shown unmarked prose. The exact + * text is still shown, because it is theirs. + */ +function sourceSection(request: ReplReadingRequest): ReplReadingSection { + const { entry, inspected } = request; + const lines: ReplReadingLine[] = []; + const build = new Build(request, lines); + build.region(entry.source, "document", entry.scope, undefined, 0, "src"); + return Object.freeze({ + caption: "Source", + captionStyle: styleOf("pane-heading", { inspected }), + lines: Object.freeze(lines), + }); +} + +/** Where one element's phase and its rail came from. */ +interface Observation { + readonly rail: ReplPresentationRole; + readonly opening: readonly ReplTokenRun[]; + readonly closing: readonly ReplTokenRun[] | undefined; +} + +/** Source nothing has been observed in. Not a phase: an absence of one. */ +const UNOBSERVED: Observation = Object.freeze({ + rail: "rail-pending", + opening: Object.freeze([]), + closing: undefined, +}); + +/** + * One reading under construction. + * + * A class rather than a pile of threaded parameters because the recursion + * carries six things through every generated child region and one of them — the + * row counter — has to stay unique across all of them. + */ +class Build { + readonly #request: ReplReadingRequest; + readonly #lines: ReplReadingLine[]; + #next = 0; + + constructor(request: ReplReadingRequest, lines: ReplReadingLine[]) { + this.#request = request; + this.#lines = lines; + } + + /** + * One text as reading lines, recursing into the elements it is written with. + * + * `owner` is the scope whose recorded positions index this text, and + * `generated` names the fragment this text *is* when it is one. The two + * together are what an observation is matched on, which is why neither is + * ever guessed from a name or a sibling. + */ + region( + text: string, + kind: "document" | "fragment", + owner: ReplScope | undefined, + generated: string | undefined, + depth: number, + prefix: string, + ): void { + const read = inspectSource(text, kind); + if (!read.ok) { + // The scanner refuses this text. Its exact bytes are still the reader's, + // and the refusal is said rather than drawn as ordinary prose. + this.#say( + `this source cannot be read: ${read.error.message}`, + "failed-outcome", + UNOBSERVED.rail, + depth, + `${prefix}:refused`, + ); + this.#plain(text, depth, UNOBSERVED.rail, prefix); + return; + } + this.#elements(text, read.value, 0, text.length, owner, generated, depth, prefix); + } + + /** + * The elements written between two offsets, and the prose between them. + * + * Nesting comes from canonical interval containment and from nothing else — + * not from a name, not from indentation, not from the order two tags happen + * to appear in. An element whose whole span lies inside another's is that + * one's child; one that merely follows it is its sibling. + */ + #elements( + text: string, + elements: readonly SourceElement[], + from: number, + to: number, + owner: ReplScope | undefined, + generated: string | undefined, + depth: number, + prefix: string, + ): void { + let at = from; + for (const [index, element] of elements.entries()) { + const span = spanOf(element); + if (span.start < from || span.end > to) { + continue; + } + if (span.start < at) { + // Inside one already emitted as a child of an earlier element. + continue; + } + if (span.start > at) { + this.#plain( + text.slice(at, span.start), + depth, + UNOBSERVED.rail, + `${prefix}:${index}:before`, + ); + } + this.#element(text, elements, element, owner, generated, depth, `${prefix}:${index}`); + at = span.end; + } + if (at < to) { + this.#plain(text.slice(at, to), depth, UNOBSERVED.rail, `${prefix}:tail`); + } + } + + /** + * One element: its opening delimiter, what it encloses, its closing one. + * + * The rail runs the whole way through, continuations and generated children + * included, because it says which region a row is in. The badge appears on + * the first line of each delimiter only. + */ + #element( + text: string, + elements: readonly SourceElement[], + element: SourceElement, + owner: ReplScope | undefined, + generated: string | undefined, + depth: number, + prefix: string, + ): void { + const observed = this.#observed(element, owner, generated); + // A self-closing element has one delimiter, so whatever would have been + // said beside its closing tag is said beside the only tag it has. Dropping + // it would leave an element that plainly settled reading as unobserved. + const opening = + element.closing === undefined ? (observed.closing ?? observed.opening) : observed.opening; + this.#delimiter( + text.slice(element.opening.start, element.opening.end), + depth, + observed.rail, + `${prefix}:open`, + opening, + ); + // What this element's enclosure holds: the fragment it generated, if it + // admitted one, and otherwise the source its author wrote there. + const replacement = this.#generated(element, owner, generated); + if (replacement !== undefined) { + this.region( + replacement.source, + "fragment", + replacement.scope, + replacement.identity, + depth + 1, + `${prefix}:gen`, + ); + } else if (element.closing !== undefined) { + this.#elements( + text, + elements, + element.opening.end, + element.closing.start, + owner, + generated, + depth + 1, + `${prefix}:in`, + ); + } + if (element.closing !== undefined) { + this.#delimiter( + text.slice(element.closing.start, element.closing.end), + depth, + observed.rail, + `${prefix}:close`, + observed.closing, + ); + } + } + + /** + * A delimiter as lines, with its badge on the first of them. + * + * A tag written across several lines is several lines here too, and only the + * first carries the reading — a second badge on a continuation would say the + * phase belonged to half a tag. + */ + #delimiter( + text: string, + depth: number, + rail: ReplPresentationRole, + prefix: string, + badge: readonly ReplTokenRun[] | undefined, + ): void { + const shown = badge !== undefined && badge.length > 0 ? badge : undefined; + for (const [index, one] of text.split("\n").entries()) { + this.#push({ + key: `${prefix}:${index}`, + text: one, + runs: sourceRuns(one), + rail, + depth, + badge: index === 0 ? shown : undefined, + style: styleOf("source", { inspected: this.#request.inspected }), + }); + } + } + + /** + * Prose as lines, each cut only at its own explicit newline. + * + * A blank logical line stays one row: dropping it would edit the shape of + * somebody's document, and the whole point of this pane is that it is theirs. + */ + #plain(text: string, depth: number, rail: ReplPresentationRole, prefix: string): void { + if (text.length === 0) { + return; + } + const pieces = text.split("\n"); + // A region that began right after a newline ends its predecessor's row + // rather than opening an empty one of its own. + for (const [index, one] of pieces.entries()) { + if (one.length === 0 && (index === 0 || index === pieces.length - 1)) { + continue; + } + this.#push({ + key: `${prefix}:${index}`, + text: one, + runs: sourceRuns(one), + rail, + depth, + badge: undefined, + style: styleOf("source", { inspected: this.#request.inspected }), + }); + } + } + + #say( + text: string, + role: ReplPresentationRole, + rail: ReplPresentationRole, + depth: number, + key: string, + ): void { + this.#push({ + key, + text, + runs: tokenRuns([{ text, token: role }]), + rail, + depth, + badge: undefined, + style: styleOf(role, { inspected: this.#request.inspected }), + }); + } + + #push(line: Omit & { readonly key: string }): void { + this.#next += 1; + this.#lines.push(Object.freeze({ ...line, key: `${line.key}#${this.#next}` })); + } + + /** + * What has actually been observed of this element, or nothing. + * + * Matched on the entry's own lifecycle reading, the recorded source position + * and the fragment that position belongs to. A retained prefix has no + * observations at all, so every element in it reads as unobserved — which is + * the truth: static syntax does not prove execution. + */ + #observed( + element: SourceElement, + owner: ReplScope | undefined, + generated: string | undefined, + ): Observation { + const one = this.#occurrence(element, owner, generated); + if (one === undefined) { + return UNOBSERVED; + } + const waiting = one.waiting.length > 0; + switch (one.phase) { + case "enter": + return reading(waiting ? "rail-waiting" : "rail-active", waiting ? ["waiting"] : ["enter"]); + case "active": + return reading( + waiting ? "rail-waiting" : "rail-active", + waiting ? ["waiting"] : ["active"], + ); + // An element whose body returned is releasing what it acquired. The wait + // is said as well as the exit, and the rail stays the exit's: a cleanup + // wait is a thing happening *during* exit, not instead of it. + case "exit": + return reading("rail-exit", [], waiting ? ["exit", "waiting"] : ["exit"]); + case "settled": + return reading("rail-settled", [], ["settled"]); + case "failed": + return reading("rail-settled", [], ["failed"]); + // This terminal's existing word for a reading that stopped. The archive + // gave cancellation no glyph, and inventing one would make it a seventh + // phase nobody specified. + case "cancelled": + return Object.freeze({ + rail: "rail-settled" as const, + opening: Object.freeze([]), + closing: tokenRuns([{ text: "cancelled", token: "waiting" }]), + }); + } + } + + #occurrence( + element: SourceElement, + owner: ReplScope | undefined, + generated: string | undefined, + ): ReplOccurrence | undefined { + const { lifecycle, entry } = this.#request; + if (lifecycle.entry !== entry.key) { + return undefined; + } + const path = owner?.path; + let found: ReplOccurrence | undefined; + for (const one of lifecycle.occurrences) { + const position = one.position; + if (position === undefined || position.offset !== element.opening.start) { + continue; + } + if (position.generatedSource !== generated) { + continue; + } + if (generated === undefined && path !== undefined && position.path !== path) { + continue; + } + // Several calls of one authored element share its position. The reading + // shown beside the source a reader is looking at is the one that is + // happening now, which is the last observed. + found = one; + } + return found; + } + + /** + * The generated fragment this element admitted, or nothing. + * + * Exactly one `Evaluate` opening at the owner's canonical recorded position. + * Nothing is matched by name, by sibling order or by what the fragment looks + * like: an ambiguous or absent ownership keeps the producer on screen, which + * is what the author actually wrote, instead of attributing somebody's + * generated text to the wrong enclosure. + */ + #generated( + element: SourceElement, + owner: ReplScope | undefined, + generated: string | undefined, + ): + | { readonly source: string; readonly scope: ReplScope | undefined; readonly identity: string } + | undefined { + if (owner === undefined || element.name !== "Evaluate") { + return undefined; + } + const admitted = owner.generated.filter((one) => admittedAt(one, element, owner, generated)); + if (admitted.length !== 1) { + return undefined; + } + const one = admitted[0]; + const source = one.source; + if (source === undefined) { + return undefined; + } + // The scope this fragment was admitted as, so its own elements are matched + // against its own recorded positions. + const scope = owner.scopes.find( + (child) => child.kind === "generated" && child.marker === one.marker, + ); + return { source, scope, identity: one.marker }; + } +} + +/** + * Whether one admitted fragment belongs to this element's enclosure. + * + * A refusal keeps the producer visible; so does a fragment whose recorded + * position is not this opening, or belongs to a different text than the one + * being read. + */ +function admittedAt( + one: ReplGenerated, + element: SourceElement, + owner: ReplScope, + generated: string | undefined, +): boolean { + if (one.decision !== "admitted" || one.source === undefined) { + return false; + } + const scope = owner.scopes.find( + (child) => child.kind === "generated" && child.marker === one.marker, + ); + const position = scope?.position; + if (position === undefined) { + return false; + } + return position.offset === element.opening.start && position.generatedSource === generated; +} + +function reading( + rail: ReplPresentationRole, + opening: readonly (keyof typeof BADGES)[], + closing?: readonly (keyof typeof BADGES)[], +): Observation { + return Object.freeze({ + rail, + opening: badgeRuns(opening), + closing: closing === undefined ? undefined : badgeRuns(closing), + }); +} + +/** + * One badge as its runs. + * + * Glyph and word together, as the accepted presentation insists, so a reading + * survives a reader who cannot tell two of these colours apart. Two readings in + * one badge keep their own accents and are joined by a separator that is + * neither of them. + */ +function badgeRuns(phases: readonly (keyof typeof BADGES)[]): readonly ReplTokenRun[] { + const parts: { readonly text: string; readonly token: ReplPresentationRole }[] = []; + for (const [index, phase] of phases.entries()) { + const badge = BADGES[phase]; + if (index > 0) { + parts.push({ text: " · ", token: "punctuation" }); + } + parts.push({ text: `${badge.glyph} ${badge.word}`, token: badge.role }); + } + return tokenRuns(parts); +} + +function spanOf(element: SourceElement): { readonly start: number; readonly end: number } { + return { + start: element.opening.start, + end: element.closing === undefined ? element.opening.end : element.closing.end, + }; +} diff --git a/packages/cli/tests/fixtures/repl/reference-style.ts b/packages/cli/tests/fixtures/repl/reference-style.ts index e42f5fdd1..ad8f2c3cc 100644 --- a/packages/cli/tests/fixtures/repl/reference-style.ts +++ b/packages/cli/tests/fixtures/repl/reference-style.ts @@ -99,6 +99,45 @@ export const SYNTAX = Object.freeze({ nul: 0x8b959c, }); +/** + * The archive's `L`: what one call of one element is doing. + * + * Glyph *and* word, as the archive's own comment insists — "never colour + * alone". A reader who cannot distinguish #5aa87c from #4f8468, or who is + * reading a capture through a filter, still has `ENTER` and `SETTLED` to read. + */ +export const LIFECYCLE = Object.freeze({ + /** `enter` — a call has begun. */ + enter: Object.freeze({ glyph: "\u25b6", word: "ENTER", colour: 0x5aa87c }), + /** `active` — it is expanding. */ + active: Object.freeze({ glyph: "\u25cf", word: "ACTIVE", colour: 0x7fd3e8 }), + /** `hold` — it is waiting on somebody. */ + hold: Object.freeze({ glyph: "\u25cf", word: "WAITING", colour: 0xc99a3f }), + /** `exit` — its body returned and its resources are being released. */ + exit: Object.freeze({ glyph: "\u25c0", word: "EXIT", colour: 0xc2766e }), + /** `settled` — it finished. */ + settled: Object.freeze({ glyph: "\u2713", word: "SETTLED", colour: 0x4f8468 }), + /** `fail` — it failed. */ + fail: Object.freeze({ glyph: "\u00d7", word: "FAILED", colour: 0xd24b3f }), +}); + +/** + * The archive's `RAIL`: the column beside a reading, one value per phase. + * + * `held` is the archive's rail for a group whose body is collapsed, which this + * terminal has no equivalent of; it is transcribed for completeness and not + * sampled. `pend` is the one a reading uses for source nothing has been + * observed in. + */ +export const RAIL = Object.freeze({ + held: 0x3c4a44, + active: 0x2f6272, + exit: 0x5d3c39, + settled: 0x2e3c35, + hold: 0x4a3a1c, + pend: 0x252b30, +}); + /** * The two cues this terminal keeps that the archive states differently. * diff --git a/packages/cli/tests/repl-source-reading.test.ts b/packages/cli/tests/repl-source-reading.test.ts new file mode 100644 index 000000000..633455935 --- /dev/null +++ b/packages/cli/tests/repl-source-reading.test.ts @@ -0,0 +1,781 @@ +/** + * The reading an entry is shown as (#881 PR 2, rows S1–S4). + * + * One real layout engine answers every width here. Nothing in this file works + * out where a character lands: a test that counted code units would agree with + * itself while the terminal drew something else, and the two cases this tier + * exists to catch — a wide character and a combining mark — are exactly the + * ones a count gets wrong. + * + * What is under test: + * + * - **S1** generated source *replaces* its producer inside the enclosure the + * author wrote, at the recorded position, in the owner that recorded it — + * and a missing or ambiguous ownership keeps the producer rather than + * guessing; + * - **S2** every logical line is recoverable from the rows it was cut into, + * with its roles, across a long schema, an unbroken token, wide and + * combining text and explicit blank lines; + * - **S3** the output half says what actually happened, read from the record + * rather than from any word in the prose; + * - **S4** a phase-only change reuses the same cuts and the same status + * column, and static syntax acquires no phase. + */ + +import { describe, it } from "@executablemd/test-support/bdd"; +import { expect } from "@executablemd/test-support/expect"; +import { scoped } from "effection"; +import type { Operation } from "effection"; + +import { entryReading, NO_READING, READING_STATUSES } from "../src/repl/source-reading.ts"; +import type { ReplReadingLine } from "../src/repl/source-reading.ts"; +import { prepareReading, readingRuns, reserveFor } from "../src/repl/fitting.ts"; +import type { ReplPreparedReading } from "../src/repl/fitting.ts"; +import { useReplRenderer } from "../src/repl/renderer.ts"; +import type { ReplRenderer } from "../src/repl/renderer.ts"; +import { runText } from "../src/repl/description.ts"; +import { NO_LIFECYCLE } from "../src/repl/lifecycle.ts"; +import type { ReplLifecycleReading, ReplOccurrence } from "../src/repl/lifecycle.ts"; +import type { ReplEntry, ReplScope, ReplTerminal } from "../src/repl/model.ts"; +import type { ReplTerminalSize } from "../src/repl/terminal.ts"; +import { LIFECYCLE, RAIL } from "./fixtures/repl/reference-style.ts"; +import { REPL_PALETTE, runStyleOf } from "../src/repl/presentation-style.ts"; + +const WIDE: ReplTerminalSize = { columns: 160, rows: 36 }; + +function withRenderer(body: (renderer: ReplRenderer) => Operation): Operation { + return scoped(function* () { + return yield* body(yield* useReplRenderer(WIDE)); + }); +} + +function scope(over: Partial = {}): ReplScope { + return Object.freeze({ + key: "entry-1", + kind: "entry", + name: "entry", + path: "repl://entry-1", + source: "", + position: undefined, + marker: "m1", + bindings: Object.freeze([]), + elicitations: Object.freeze([]), + generated: Object.freeze([]), + scopes: Object.freeze([]), + ...over, + }); +} + +function entryOf(source: string, over: Partial = {}): ReplEntry { + return Object.freeze({ + key: "entry-1", + order: 1, + source, + path: "repl://entry-1", + scope: scope({ source }), + transcript: Object.freeze([]), + checkpoints: Object.freeze([]), + terminal: undefined, + settled: false, + bindings: Object.freeze([]), + turns: Object.freeze([]), + ...over, + }); +} + +function settled(status: "ok" | "err" | "cancelled", output: string): ReplTerminal { + return Object.freeze({ status, output, message: undefined, location: undefined }); +} + +function observing(occurrences: readonly Partial[]): ReplLifecycleReading { + return Object.freeze({ + entry: "entry-1", + occurrences: Object.freeze( + occurrences.map((one, index) => + Object.freeze({ + key: `entry-1#${index + 1}`, + expansion: "x", + name: "Elicit", + parent: undefined, + position: undefined, + phase: "active" as const, + waiting: Object.freeze([]), + ...one, + }), + ), + ), + }); +} + +function at(offset: number) { + return Object.freeze({ + path: "repl://entry-1", + generatedSource: undefined, + offset, + line: 1, + column: 1, + }); +} + +/** Every logical line's text, recovered from the rows it was cut into. */ +function recovered(prepared: ReplPreparedReading): Map { + const joined = new Map(); + for (const row of prepared.rows) { + joined.set(row.line, (joined.get(row.line) ?? "") + row.text); + } + return joined; +} + +/** + * Whether every badge of a reading ends where the reading ends. + * + * The accepted presentation aligns these at the pane's right inner edge, so + * what has to agree across rows is where a badge *finishes*, not where it + * starts: `\u25b6 ENTER` and `\u2713 SETTLED` are different widths and would start in + * different columns if they were right-aligned correctly. + */ +function rightAligned(prepared: ReplPreparedReading): readonly boolean[] { + const ends: boolean[] = []; + for (const row of prepared.rows) { + if (row.badge === undefined) { + continue; + } + ends.push(runText(readingRuns(prepared, row)).endsWith(runText(row.badge))); + } + return ends; +} + +describe("the reading one entry is shown as", () => { + describe("S1 generated source replaces its producer where it was written", () => { + // `` is written at offset 0 and the fragment it admitted is + // recorded against that offset in this owner. + const SOURCE = '\nconst x = 1;\n\n'; + const FRAGMENT = '# generated\n\n\n'; + + function owning(decision: "admitted" | "refused", offset: number): ReplEntry { + const child = scope({ + key: "entry-1/generated-1", + kind: "generated", + name: "generated", + marker: "g1", + source: FRAGMENT, + position: Object.freeze({ + path: "repl://entry-1", + generatedSource: undefined, + offset, + line: 1, + column: 1, + }), + }); + return entryOf(SOURCE, { + scope: scope({ + source: SOURCE, + generated: Object.freeze([ + Object.freeze({ + marker: "g1", + source: decision === "admitted" ? FRAGMENT : undefined, + decision, + construct: undefined, + }), + ]), + scopes: Object.freeze([child]), + }), + }); + } + + it("shows the fragment inside the author's own enclosure bytes", function* () { + const reading = entryReading({ + entry: owning("admitted", 0), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const text = reading.source.lines.map((one) => one.text); + // The enclosure the author wrote, exactly as they wrote it. + expect(text).toContain(''); + expect(text).toContain(""); + // What it produced, where its producer was. + expect(text).toContain("# generated"); + expect(text).toContain(''); + // And not the producer itself. + expect(text).not.toContain("const x = 1;"); + // Replaced, never appended: the fragment is between the two delimiters. + const open = text.indexOf(''); + const close = text.indexOf(""); + expect(open).toBeLessThan(text.indexOf("# generated")); + expect(text.indexOf("# generated")).toBeLessThan(close); + }); + + it("keeps the fragment's own offsets, so its elements are its own", function* () { + const reading = entryReading({ + entry: owning("admitted", 0), + // The `` is at offset 14 of the *fragment*, which is nowhere + // near offset 14 of the entry's own source. + lifecycle: observing([ + { + name: "Elicit", + position: Object.freeze({ + path: undefined, + generatedSource: "g1", + offset: FRAGMENT.indexOf(" one.text.includes(" one.text); + expect(text).toContain("const x = 1;"); + expect(text).not.toContain("# generated"); + }); + + it("keeps the producer when the recorded position is not this opening", function* () { + const reading = entryReading({ + entry: owning("admitted", 99), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + expect(reading.source.lines.map((one) => one.text)).toContain("const x = 1;"); + }); + + it("keeps the producer when two admissions claim the same opening", function* () { + const base = owning("admitted", 0); + const twice = entryOf(SOURCE, { + scope: scope({ + source: SOURCE, + generated: Object.freeze([ + ...base.scope.generated, + Object.freeze({ + marker: "g2", + source: "# other\n", + decision: "admitted" as const, + construct: undefined, + }), + ]), + scopes: Object.freeze([ + ...base.scope.scopes, + scope({ + key: "entry-1/generated-2", + kind: "generated", + marker: "g2", + source: "# other\n", + position: Object.freeze({ + path: "repl://entry-1", + generatedSource: undefined, + offset: 0, + line: 1, + column: 1, + }), + }), + ]), + }), + }); + const reading = entryReading({ + entry: twice, + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const text = reading.source.lines.map((one) => one.text); + expect(text).toContain("const x = 1;"); + expect(text).not.toContain("# generated"); + expect(text).not.toContain("# other"); + }); + + it("gives a self-closing Evaluate a connected child region underneath", function* () { + const source = '\n'; + const fragment = "read\n"; + const reading = entryReading({ + entry: entryOf(source, { + scope: scope({ + source, + generated: Object.freeze([ + Object.freeze({ + marker: "g1", + source: fragment, + decision: "admitted" as const, + construct: undefined, + }), + ]), + scopes: Object.freeze([ + scope({ + key: "entry-1/generated-1", + kind: "generated", + marker: "g1", + source: fragment, + position: Object.freeze({ + path: "repl://entry-1", + generatedSource: undefined, + offset: 0, + line: 1, + column: 1, + }), + }), + ]), + }), + }), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const text = reading.source.lines.map((one) => one.text); + // Its own row is kept, and the region is under it. + expect(text[0]).toBe(''); + expect(text).toContain("read"); + expect(reading.source.lines.find((one) => one.text === "read")?.depth).toBe(1); + }); + }); + + describe("S2 every logical line is recoverable from the rows it was cut into", () => { + const PROFILES = [48, 72, 100]; + + // A long schema line, an unbroken token no boundary can break, wide and + // combining text, and explicit blank lines. + const SOURCE = [ + '', + " Enter the project details, including the owner and the budget it is held against.", + "", + "", + `x${"x".repeat(159)}`, + "", + "界é🙂 and é combining", + "", + ].join("\n"); + + for (const room of PROFILES) { + it(`recovers every line and its roles at ${room} columns`, () => + withRenderer(function* (renderer) { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const prepared = yield* prepareReading(renderer, WIDE, reading.source.lines, room); + expect(prepared.ok).toBe(true); + if (!prepared.ok) { + return; + } + const joined = recovered(prepared.value); + for (const line of reading.source.lines) { + // Nothing dropped, nothing trimmed, nothing shortened. + expect(joined.get(line.key)).toBe(line.text); + } + // Every row's runs still concatenate to exactly its text, so no + // character lost its role on the way through the cut. + for (const row of prepared.value.rows) { + expect(runText(row.runs)).toBe(row.text); + } + // The unbroken token did get broken — into rows, not into nothing. + const unbroken = reading.source.lines.find((one) => one.text.startsWith("xxx")); + expect(unbroken).toBeDefined(); + const pieces = prepared.value.rows.filter((one) => one.line === unbroken?.key); + expect(pieces.length).toBeGreaterThan(1); + // One owner, and no second badge on any continuation. + expect(pieces.filter((one) => one.continuation).length).toBe(pieces.length - 1); + expect(pieces.filter((one) => one.badge !== undefined).length).toBeLessThanOrEqual(1); + // A blank logical line is one row. + for (const line of reading.source.lines.filter((one) => one.text === "")) { + expect(prepared.value.rows.filter((one) => one.line === line.key).length).toBe(1); + } + })); + } + + it("never measures a row wider than the region it was cut for", () => + withRenderer(function* (renderer) { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const prepared = yield* prepareReading(renderer, WIDE, reading.source.lines, 48); + expect(prepared.ok).toBe(true); + if (!prepared.ok) { + return; + } + for (const row of prepared.value.rows) { + expect(row.width).toBeLessThanOrEqual(prepared.value.reservation.content); + } + })); + + it("cuts wide and combining text at graphemes the engine agrees on", () => + withRenderer(function* (renderer) { + // Four code units, five cells, and two of the three graphemes are not + // one unit wide. + const line: ReplReadingLine = Object.freeze({ + key: "one", + text: "界é🙂", + runs: Object.freeze([Object.freeze({ text: "界é🙂", token: "source" as const })]), + rail: "rail-pending" as const, + depth: 0, + badge: undefined, + style: Object.freeze({ role: "source" as const, selected: false, inspected: false }), + }); + const reservation = yield* reserveFor(renderer, WIDE, 80); + expect(reservation.ok).toBe(true); + if (!reservation.ok) { + return; + } + // A region with room for three cells holds `界` and `é` and not the + // emoji — which a code-unit count would get wrong in both directions. + const room = + reservation.value.rail + reservation.value.separator * 2 + reservation.value.status + 3; + const prepared = yield* prepareReading(renderer, WIDE, [line], room); + expect(prepared.ok).toBe(true); + if (!prepared.ok) { + return; + } + expect(prepared.value.rows.map((one) => one.text)).toEqual(["界é", "🙂"]); + })); + + it("refuses rather than clipping when not one grapheme fits", () => + withRenderer(function* (renderer) { + const line: ReplReadingLine = Object.freeze({ + key: "one", + text: "界界界", + runs: Object.freeze([Object.freeze({ text: "界界界", token: "source" as const })]), + rail: "rail-pending" as const, + depth: 0, + badge: undefined, + style: Object.freeze({ role: "source" as const, selected: false, inspected: false }), + }); + const reservation = yield* reserveFor(renderer, WIDE, 80); + expect(reservation.ok).toBe(true); + if (!reservation.ok) { + return; + } + // One column of content, and the narrowest grapheme is two cells wide. + const room = + reservation.value.rail + reservation.value.separator * 2 + reservation.value.status + 1; + const prepared = yield* prepareReading(renderer, WIDE, [line], room); + expect(prepared.ok).toBe(false); + if (prepared.ok) { + return; + } + expect(prepared.error.name).toBe("ReplFitRefusal"); + })); + }); + + describe("S3 the output half says what actually happened", () => { + it("labels text still arriving as live", function* () { + const reading = entryReading({ + entry: entryOf("hello\n"), + lifecycle: NO_LIFECYCLE, + live: "partial outp", + inspected: false, + }); + expect(reading.output.caption).toBe("Output · live"); + expect(reading.output.lines.map((one) => one.text)).toEqual(["partial outp"]); + }); + + it("replaces it with the retained result, once, unlabelled", function* () { + const reading = entryReading({ + entry: entryOf("hello\n", { terminal: settled("ok", "hello"), settled: true }), + lifecycle: NO_LIFECYCLE, + // Live text from the run that just finished must not be shown beside + // the result that replaced it. + live: "partial outp", + inspected: false, + }); + expect(reading.output.caption).toBe("Output"); + expect(reading.output.lines.map((one) => one.text)).toEqual(["hello"]); + }); + + it("says the outcome when nothing was rendered", function* () { + const reading = entryReading({ + entry: entryOf("", { terminal: settled("ok", ""), settled: true }), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + expect(reading.output.caption).toBe("No rendered output."); + expect(reading.output.lines.map((one) => one.text)).toEqual(["closed ok"]); + expect(reading.output.lines[0].style.role).toBe("successful-outcome"); + }); + + it("reads the outcome from the record, not from the prose", function* () { + // Output containing the word `failed` from a root that closed `ok`. + const reading = entryReading({ + entry: entryOf("doc", { + terminal: settled("ok", "the retry failed and the fallback succeeded"), + settled: true, + }), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + expect(reading.output.caption).toBe("Output"); + expect(reading.output.lines[0].style.role).toBe("output"); + }); + + it("says a prefix recorded no entry output rather than borrowing later text", function* () { + const reading = entryReading({ + entry: entryOf("doc"), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: true, + }); + expect(reading.output.caption).toBe("No entry output recorded at this checkpoint."); + expect(reading.output.lines).toEqual([]); + }); + + it("shows a bound value that emitted nothing as no output", function* () { + const reading = entryReading({ + entry: entryOf('1 + 1', { + terminal: settled("ok", ""), + settled: true, + }), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + expect(reading.output.caption).toBe("No rendered output."); + // No synthesized receipt, and no rendered value invented for it. + expect(reading.output.lines.map((one) => one.text)).toEqual(["closed ok"]); + }); + + it("puts output before source", function* () { + const reading = entryReading({ + entry: entryOf('\n', { terminal: settled("ok", "done"), settled: true }), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + // One reading, two captioned sections, and the result is the first. + expect(Object.keys(reading)).toEqual(["output", "source"]); + expect(reading.output.caption).toBe("Output"); + expect(reading.source.caption).toBe("Source"); + }); + + it("reads nothing for a prefix that admitted no entry", function* () { + expect(NO_READING.output.caption).toBe("No entry output recorded at this checkpoint."); + expect(NO_READING.source.lines).toEqual([]); + }); + }); + + describe("S4 phases are observed, never inferred from syntax", () => { + const SOURCE = '\n Details.\n\n'; + + it("gives static source the rail that means nothing was observed", function* () { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: true, + }); + for (const line of reading.source.lines) { + expect(line.rail).toBe("rail-pending"); + expect(line.badge).toBeUndefined(); + } + expect(REPL_PALETTE.railPending).toBe(RAIL.pend); + }); + + it("gives an observed element its own phase, in the archive's literals", function* () { + const cases = [ + { phase: "enter" as const, rail: RAIL.active, badge: LIFECYCLE.enter }, + { phase: "active" as const, rail: RAIL.active, badge: LIFECYCLE.active }, + { phase: "settled" as const, rail: RAIL.settled, badge: LIFECYCLE.settled }, + { phase: "failed" as const, rail: RAIL.settled, badge: LIFECYCLE.fail }, + ]; + for (const one of cases) { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: observing([{ position: at(0), phase: one.phase }]), + live: "", + inspected: false, + }); + const badged = reading.source.lines.filter((line) => line.badge !== undefined); + expect(badged.length).toBe(1); + expect(runText(badged[0].badge ?? [])).toBe(`${one.badge.glyph} ${one.badge.word}`); + // The rail is the archive's value for that phase, read through the + // product's own role rather than compared to the product's palette. + const rail = reading.source.lines[0].rail; + expect(runStyleOf(rail, reading.source.lines[0].style, false).colour).toBe(one.rail); + // And the badge is the archive's colour. + const ink = runStyleOf((badged[0].badge ?? [])[0].token, badged[0].style, false); + expect(ink.colour).toBe(one.badge.colour); + } + }); + + it("says WAITING on the element that is waiting, with the waiting rail", function* () { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: observing([ + { position: at(0), phase: "active", waiting: Object.freeze(["question" as const]) }, + ]), + live: "", + inspected: false, + }); + const badged = reading.source.lines.filter((line) => line.badge !== undefined); + expect(runText(badged[0].badge ?? [])).toBe(`${LIFECYCLE.hold.glyph} ${LIFECYCLE.hold.word}`); + expect(runStyleOf(reading.source.lines[0].rail, badged[0].style, false).colour).toBe( + RAIL.hold, + ); + }); + + it("keeps EXIT's rail during a cleanup wait, and says both readings", function* () { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: observing([ + { position: at(0), phase: "exit", waiting: Object.freeze(["expansion" as const]) }, + ]), + live: "", + inspected: false, + }); + expect( + runStyleOf(reading.source.lines[0].rail, reading.source.lines[0].style, false).colour, + ).toBe(RAIL.exit); + const badged = reading.source.lines.filter((line) => line.badge !== undefined); + // On the closing delimiter, which is where the exit is happening. + expect(badged.length).toBe(1); + expect(badged[0].text).toBe(""); + expect(runText(badged[0].badge ?? [])).toBe( + `${LIFECYCLE.exit.glyph} ${LIFECYCLE.exit.word} · ` + + `${LIFECYCLE.hold.glyph} ${LIFECYCLE.hold.word}`, + ); + // Two readings, two accents, neither of them the separator's. + const inks = (badged[0].badge ?? []).map( + (run) => runStyleOf(run.token, badged[0].style, false).colour, + ); + expect(inks).toContain(LIFECYCLE.exit.colour); + expect(inks).toContain(LIFECYCLE.hold.colour); + expect(new Set(inks).size).toBe(3); + }); + + it("keeps this terminal's word for a reading that stopped", function* () { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: observing([{ position: at(0), phase: "cancelled" }]), + live: "", + inspected: false, + }); + const badged = reading.source.lines.filter((line) => line.badge !== undefined); + expect(runText(badged[0].badge ?? [])).toBe("cancelled"); + }); + + it("reuses the same cuts and the same status column when only a phase changed", () => + withRenderer(function* (renderer) { + const long = + '\n' + + " Enter the project details, including its owner and the budget it is held against.\n" + + "\n"; + const of = (phase: "enter" | "settled") => + entryReading({ + entry: entryOf(long), + lifecycle: observing([{ position: at(0), phase }]), + live: "", + inspected: false, + }); + const first = yield* prepareReading(renderer, WIDE, of("enter").source.lines, 56); + const second = yield* prepareReading(renderer, WIDE, of("settled").source.lines, 56); + expect(first.ok && second.ok).toBe(true); + if (!first.ok || !second.ok) { + return; + } + // The same source, cut the same way. + expect(second.value.rows.map((one) => one.text)).toEqual( + first.value.rows.map((one) => one.text), + ); + // The same reservation, so the column does not move. + expect(second.value.reservation.status).toBe(first.value.reservation.status); + expect(rightAligned(first.value)).toEqual([true]); + expect(rightAligned(second.value)).toEqual([true]); + })); + + it("reserves for every reading a badge can hold, measured not counted", () => + withRenderer(function* (renderer) { + const reservation = yield* reserveFor(renderer, WIDE, 80); + expect(reservation.ok).toBe(true); + if (!reservation.ok) { + return; + } + // Every phase, the cleanup wait that says two things, and the word this + // terminal keeps for a cancellation. + for (const one of READING_STATUSES) { + expect(reservation.value.statusWidths.get(one)).toBeDefined(); + expect(reservation.value.statusWidths.get(one) ?? 0).toBeLessThanOrEqual( + reservation.value.status, + ); + } + expect(READING_STATUSES).toContain("cancelled"); + expect(READING_STATUSES).toContain( + `${LIFECYCLE.exit.glyph} ${LIFECYCLE.exit.word} · ` + + `${LIFECYCLE.hold.glyph} ${LIFECYCLE.hold.word}`, + ); + // The widest is the cleanup wait, which is the point of reserving for + // it: the column cannot grow when an element starts releasing. + expect(reservation.value.status).toBe( + reservation.value.statusWidths.get( + `${LIFECYCLE.exit.glyph} ${LIFECYCLE.exit.word} · ` + + `${LIFECYCLE.hold.glyph} ${LIFECYCLE.hold.word}`, + ), + ); + })); + + it("attributes nothing to an entry whose observations belong to another", function* () { + const reading = entryReading({ + entry: entryOf(SOURCE), + lifecycle: Object.freeze({ + entry: "entry-2", + occurrences: observing([{ position: at(0), phase: "active" }]).occurrences, + }), + live: "", + inspected: false, + }); + for (const line of reading.source.lines) { + expect(line.badge).toBeUndefined(); + expect(line.rail).toBe("rail-pending"); + } + }); + + it("aligns every badge at the same measured column", () => + withRenderer(function* (renderer) { + const source = '\n\n'; + const reading = entryReading({ + entry: entryOf(source), + lifecycle: observing([ + { position: at(0), phase: "active" }, + { position: at(source.indexOf(' one.badge !== undefined) + .map((one) => runText(readingRuns(prepared.value, one)).length); + expect(new Set(composed).size).toBe(1); + })); + }); +}); From 5b75462d38c1f071e7ffe9dabdf879aaeeac1ad8 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 07:39:46 -0400 Subject: [PATCH 09/19] =?UTF-8?q?=F0=9F=9A=A7=20Give=20the=20Transcript=20?= =?UTF-8?q?the=20entry's=20reading,=20windowed=20and=20measured=20?= =?UTF-8?q?=E2=80=94=20layer=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The transcript pane now holds one entry's reading: Output, then Source, sharing one vertical window with its own earlier/later controls outside the moving content. Every row is fitted by `prepareFrame` from engine answers, carries its rail and, where an observation was attributed to it, the reading of the element that owns it against the pane's right inner edge. The defect this found in itself: `ReplMeasured.boundsOf` closes over engine state, not over a copy, so reading it after the reading's probe render answered from the probe tree. Every window's capacity came out wrong — the question drawer was admitted shorter than the one on screen, a form field lost its Tab stop, and the journey typed two answers into one field. Every bound this pass gives is now copied into a map before anything else is measured, which is what `planning-measurement.md` said to do and what the existing passes already did by accident of ordering. Also found: a self-closing element lost the badge it settled with; badges align at the right inner edge, not at a shared start column; and the reading's two controls have to be reserved in the pass that measures the window, or the one it grows is drawn over the reading's last row. The replaced presentation premise, itemized. The transcript's record rows are gone, so fourteen assertions across five suites were re-anchored onto what the product now says — each with the claim it is still making and why its old anchor cannot carry it: - a recorded result, an outcome, a reason and live text read off the reading's Output half rather than off a row keyed by the record's position; - a wrapped reason is recovered from its rows instead of ending in an ellipsis, which is the stronger claim; - a fact about an event is read where one still is, and metadata that was a transcript record is the catalog's or the Bindings column's; - a nested scope's retained answers are read by selecting that scope, which is where the product says they were asked; - two journey probes that searched the screen for a question's words now assert the absence of a question and click inside the drawer that is asking — the reading shows the schema those words were written in, so the words were never the claim. `repl-source-reading.test.ts` carries S1–S4, 33 steps, every width from a real engine. The frozen focused command: Core 53 tests / 404 steps, CLI 94 / 310, both exit 0. `deno check --frozen` clean, `git diff --check` clean. Specs and architecture say what exists: the reading, its four output readings, observation versus syntax, generated replacement, and that nothing here is clipped or estimated. --- architecture.md | 3 + packages/cli/src/repl/application.ts | 209 +++++++++++++++--- packages/cli/src/repl/components/actions.ts | 9 + packages/cli/src/repl/components/rows.ts | 4 + packages/cli/src/repl/program.ts | 46 +++- packages/cli/src/repl/source-reading.ts | 47 +++- .../cli/tests/fixtures/repl/presentation.ts | 3 + .../cli/tests/repl-agent-interface.test.ts | 22 +- packages/cli/tests/repl-agent-journey.test.ts | 75 ++++++- packages/cli/tests/repl-entries.test.ts | 100 +++++++-- packages/cli/tests/repl-journey.test.ts | 83 +++++-- .../cli/tests/repl-presentation-style.test.ts | 195 ++++++++++------ specs/repl-spec.md | 65 ++++++ 13 files changed, 704 insertions(+), 157 deletions(-) diff --git a/architecture.md b/architecture.md index 10a8566a6..a490c995a 100644 --- a/architecture.md +++ b/architecture.md @@ -5745,6 +5745,9 @@ DurableEvents -> frozen ReplModel -> resolved immutable view | `description.ts` | opaque immutable descriptions and the closed action boundary | | `reconcile.ts` | reconciling descriptions into one mounted Freedom tree | | `handoff.ts` | the acknowledged commit boundary | +| `source-reading.ts` | one entry as output and then source, with what each element is doing | +| `presentation-text.ts` · `presentation-style.ts` | what the characters of a reading are, and the colours it is drawn in | +| `fitting.ts` | engine-measured widths, and the rows a reading is cut into | | `layout.ts` | deterministic placement at four sizes | | `renderer.ts` | drawing the mounted tree, and the frame map | | `frame.ts` | the one acknowledged frame stream | diff --git a/packages/cli/src/repl/application.ts b/packages/cli/src/repl/application.ts index 7cd6a163d..f57fd128f 100644 --- a/packages/cli/src/repl/application.ts +++ b/packages/cli/src/repl/application.ts @@ -82,6 +82,10 @@ import type { ReplAdmission, ReplWindow } from "./layout-admission.ts"; import { ORDINARY, REPL_PALETTE, styleOf } from "./presentation-style.ts"; import type { ReplPresentationRole, ReplRowStyle } from "./presentation-style.ts"; import { jsonRuns, sourceRuns } from "./presentation-text.ts"; +import { entryReading, NO_READING } from "./source-reading.ts"; +import type { ReplReading } from "./source-reading.ts"; +import { readingRuns } from "./fitting.ts"; +import type { ReplPreparedReading, ReplPreparedRow } from "./fitting.ts"; import type { ReplTerminalSize } from "./terminal.ts"; import { decodeLocation, @@ -1098,6 +1102,28 @@ export function reduceRepl( refusal: undefined, }); } + case "scroll-reading": { + // The same rule again, over the window the frame measured for the reading + // that is showing. Which reading that is decides the offset this moves, + // so selecting an earlier entry and scrolling it leaves the live entry's + // own position where the reader left it. + const window = admission.windows.get(READING_WINDOW); + if (window === undefined) { + return settled({ ...state, refusal: undefined }); + } + const key = entryReadingKeyOf(state); + return settled({ + ...state, + viewports: Object.freeze({ + ...state.viewports, + readings: Object.freeze({ + ...state.viewports.readings, + [key]: scrolled(window, action.delta), + }), + }), + refusal: undefined, + }); + } case "select-permission": { // The key is taken first, because a `+permission` candidate resolves only // while the request it names is pending — so the state that navigates has @@ -2437,33 +2463,54 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS // the same reading. With nothing selected the whole execution is the locus, // which is what a one-entry execution has always shown. const inspectable = showEntry; - // Not until a width has been measured. A transcript row is bounded to the - // region it lands in, and an unbounded one makes that region wider than its - // share — which would corrupt the very measurement that is about to answer - // how wide it is. + // Not until a width has been measured. A reading row is bounded to the region + // it lands in, and an unbounded one makes that region wider than its share — + // which would corrupt the very measurement that is about to answer how wide + // it is. const surface = context.widths?.surface; - for (const [index, transcript] of inspectable && surface !== undefined - ? transcriptOf(model, selection).entries() - : []) { - // One cell is one row, so a recorded row that holds several lines of output - // becomes several cells. A cell given more than one line would show only the - // first, which is the whole of what a reader would then believe was there. - for (const [offset, part] of transcriptLines(transcript, surface ?? 0).entries()) { - items.push(line(`line:${index}:${offset}`, part.text, part.style)); - } - } - // The live overlay, explicitly below the recorded rows and explicitly labelled. - // Once the durable close exists its recorded output is in the transcript and - // this is empty, so the two never both claim to be the output. - // - // It belongs to the entry producing it, which is the last one this prefix - // admitted — nothing earlier can still be running. A reader who has selected - // an earlier entry is reading a settled transcript, and text from a run that - // is not the one they are looking at would be attributed to it. - if (inspectable && live.output.length > 0 && livesHere(model, selection)) { - for (const [offset, text] of live.output.split("\n").entries()) { - items.push(line(`line:live:${offset}`, `… ${text}`, styleOf("output"))); + // The entry's own reading: what it produced, then the source that produced + // it, as the rows the frame fitted to this pane. The controls that move it sit + // outside the moving content, which is why they are described before the rows + // rather than among them. + const prepared = inspectable && surface !== undefined ? context.reading : undefined; + // Only where there is a reading to move. An execution that has admitted + // nothing has no output and no source, and two controls over an empty pane + // would be Tab stops that scroll nothing — read from the model rather than + // from the fitted rows, because the pass that reserves these controls is the + // pass that has not fitted any. + if (inspectable && model.entries.length > 0) { + // Both controls, always, exactly as the Sessions reading does it. They + // consume their capacity *before* the rows do: the pass that measures how + // many rows the window holds has to be the pass that already has them in + // it, or the window is measured two rows too tall and the control it then + // grows is drawn over the last row of the reading. Measured: it was. + items.push( + row( + "reading:earlier", + ` ${EARLIER}`, + { select: "scroll-reading", delta: -1 }, + styleOf("action"), + { here: view.focused }, + ), + ); + if (prepared !== undefined) { + // A narrow frame routes one outlet and has no transcript pane, so it has + // no window over this reading either. Its rows are described and placed + // nowhere, which is what the transcript's rows have always done at this + // size: the frame offers the reading, and the profile decides there is + // nowhere to put it. + const rows = readingRows(prepared); + items.push(...(narrow ? rows : shown(rows, context, READING_WINDOW))); } + items.push( + row( + "reading:later", + ` ${LATER}`, + { select: "scroll-reading", delta: 1 }, + styleOf("action"), + { here: view.focused }, + ), + ); } // The inspection controls, and only where there is an inspection region to put @@ -2710,6 +2757,45 @@ function shown( return content.slice(held.from, held.from + held.count); } +/** + * One prepared reading as the rows a description places. + * + * Each row's runs are the composed ones — rail, indent, text, and the badge + * against the pane's right inner edge — so what a description says and what the + * frame measured are one list rather than two that have to agree. + */ +function readingRows(prepared: ReplPreparedReading): readonly Described[] { + return prepared.rows.map((one) => { + const runs = readingRuns(prepared, one); + return line(`reading:${one.key}`, runText(runs), one.style, runs); + }); +} + +/** + * The reading one view holds, before any width has fitted it. + * + * The selected entry's own, and nothing when a prefix admitted none. Live text + * belongs to the entry producing it — the last one this prefix admitted, since + * entries are serial — so a reader looking at an earlier entry is given that + * entry's retained reading rather than text from the run that is still going. + */ +export function readingOf(view: ReplView): ReplReading { + const key = view.selection.entry?.key; + const entry = + key === undefined + ? view.model.entries[view.model.entries.length - 1] + : view.model.entries.find((one) => one.key === key); + if (entry === undefined) { + return NO_READING; + } + return entryReading({ + entry, + lifecycle: view.live.lifecycle, + live: livesHere(view.model, view.selection) ? view.live.output : "", + inspected: view.state.route.at !== undefined, + }); +} + /** * The transcript rows the selected locus holds. * @@ -3952,6 +4038,8 @@ export const SESSIONS_WINDOW = "sessions"; export const ENTRIES_WINDOW = "entries"; /** The open drawer's content window, whichever reading it is showing. */ export const DRAWER_WINDOW = "drawer"; +/** The entry reading's window: output and source together, in the transcript. */ +export const READING_WINDOW = "reading"; /** The action row's own structural id, which admission measures against. */ export const ACTION_ROW = "box:footer:actions"; @@ -4021,6 +4109,16 @@ export interface ReplPresentationContext { * turning this off must not make a control behind the modal reachable. */ readonly capture: "capture" | "passthrough"; + /** + * The entry reading this frame prepared, or none before it has prepared one. + * + * One immutable list of fitted rows, built once per frame from engine answers + * and shared by everything downstream: the row count, the window's capacity, + * the descriptions and the boxes all read it, so a prepared row and a drawn + * row cannot disagree about what was prepared. The measuring pass has none, + * which is why it describes none. + */ + readonly reading: ReplPreparedReading | undefined; } /** One reading's descriptions, paired with where the engine places them. */ @@ -4038,6 +4136,26 @@ export interface ReplPresentation { * at. The live question and a pending permission have their own offsets already, * so they have no key here. */ +/** + * The key the entry reading's own offset is stored under. + * + * The execution, the prefix being read and which entry's reading it is — so + * selecting an earlier entry finds that entry's own position again rather than + * wherever the last one was left, and the same entry read at two history + * positions is two readings of two different files. + * + * Process-local, like every other window: nothing durable holds one, so a + * location opened in another process starts each reading at its first row. + */ +export function entryReadingKeyOf(state: ReplState): string { + // `scopes[0]` is the selected entry's key, which is the route's own answer to + // which entry this is — read from the route rather than resolved against a + // model, because a reducer answering a keystroke has no business reprojecting + // a prefix to learn which window it is moving. + const entry = state.route.scopes[0] ?? "execution"; + return `reading:${state.route.execution}:${state.route.at ?? "head"}:${entry}`; +} + export function readingKeyOf(state: ReplState, open: ReplDrawerRef): string | undefined { // The prefix being read is part of the identity: the same binding at two // history positions is two readings of two different files. @@ -4092,6 +4210,8 @@ type ReplSlot = | "sessions" | "entries-fixed" | "entries" + | "reading-fixed" + | "reading" | "transcript" | "inspection" | "drawer-above" @@ -4148,6 +4268,14 @@ function slotOf(key: string): ReplSlot | undefined { if (key.startsWith("entries:") || key.startsWith("entry:") || key.startsWith("scope:")) { return "entries"; } + // The reading's own window controls stay put around it, so a measured + // viewport is the moving part alone. + if (key === "reading:earlier" || key === "reading:later") { + return "reading-fixed"; + } + if (key.startsWith("reading:")) { + return "reading"; + } if (key.startsWith("line:")) { return "transcript"; } @@ -4530,14 +4658,7 @@ export function presentationFor( edgedColumn("transcript", undefined, REPL_PALETTE.centreSurface, [ ...paneTitle("transcript:heading", "transcript"), ...located, - box({ - id: "box:transcript:viewport", - region: "transcript", - props: viewportProps(), - children: of("transcript").map((candidate) => - rowBox(candidate, "transcript", context.widths?.surface), - ), - }), + ...listColumn("transcript", "reading-fixed", "reading", READING_WINDOW), ]), edgedColumn("inspection", inspectionWidth(size), REPL_PALETTE.bindingsSurface, [ ...paneTitle("inspection:heading", "inspection"), @@ -4683,9 +4804,11 @@ export function admissionFor(input: { readonly view: ReplView; readonly manifest: ReplLayoutManifest; readonly widths: ReplMeasuredWidths; + /** The reading this frame fitted, which is what its window admits rows of. */ + readonly reading?: ReplPreparedReading | undefined; readonly boundsOf: (id: string) => ReplBounds | undefined; }): ReplAdmission { - const { view, manifest, widths, boundsOf } = input; + const { view, manifest, widths, reading, boundsOf } = input; const windows = new Map(); for (const slot of manifest.viewports) { const capacity = capacityOf(boundsOf(slot.id)); @@ -4693,7 +4816,7 @@ export function admissionFor(input: { slot.window, admitRows({ offset: offsetFor(view, slot.window, capacity), - total: totalOf(view, widths, slot.window), + total: totalOf(view, widths, reading, slot.window), capacity, }), ); @@ -4754,6 +4877,9 @@ function offsetOf(view: ReplView, window: string): number { if (window === SESSIONS_WINDOW) { return view.state.viewports.sessions; } + if (window === READING_WINDOW) { + return view.state.viewports.readings[entryReadingKeyOf(view.state)] ?? 0; + } if (window === ENTRIES_WINDOW) { return view.state.viewports.entries; } @@ -4767,13 +4893,24 @@ function offsetOf(view: ReplView, window: string): number { * from: a frozen prefix shows nothing of the present, so counting against the * live head would clamp a historical reading against rows it does not have. */ -function totalOf(view: ReplView, widths: ReplMeasuredWidths, window: string): number { +function totalOf( + view: ReplView, + widths: ReplMeasuredWidths, + reading: ReplPreparedReading | undefined, + window: string, +): number { if (window === SESSIONS_WINDOW) { return sessionContentRows(view.state, view.model, view.live); } if (window === ENTRIES_WINDOW) { return entriesRowCount(view.model); } + // The rows the frame actually fitted, not a count of logical lines: a line + // that wrapped is several rows, and a window admitting the smaller number + // would stop short of text it is showing the top of. + if (window === READING_WINDOW) { + return reading?.rows.length ?? 0; + } return drawerContent(view, widths?.drawer ?? 0)?.content.length ?? 0; } diff --git a/packages/cli/src/repl/components/actions.ts b/packages/cli/src/repl/components/actions.ts index c7c9d1e5c..fd85bf332 100644 --- a/packages/cli/src/repl/components/actions.ts +++ b/packages/cli/src/repl/components/actions.ts @@ -71,6 +71,15 @@ export type ReplAction = * whichever the reducer guessed rather than the list the control belongs to. */ | { readonly kind: "scroll-entries"; readonly delta: number } + /** + * Move the entry reading by whole rows. + * + * Its own member for the same reason the other two are: the transcript's + * reading, the catalog and a drawer's question can all be open at once, and + * one action meaning whichever the reducer guessed would move a region the + * reader was not pointing at. + */ + | { readonly kind: "scroll-reading"; readonly delta: number } /** * Show only the conversation this provider session key names. * diff --git a/packages/cli/src/repl/components/rows.ts b/packages/cli/src/repl/components/rows.ts index 42a4e0df5..249b81ac9 100644 --- a/packages/cli/src/repl/components/rows.ts +++ b/packages/cli/src/repl/components/rows.ts @@ -235,6 +235,10 @@ function activation(input: ReplViewData): ReplAction | undefined { const delta = named["delta"]; return typeof delta === "number" ? { kind: "scroll-entries", delta } : undefined; } + if (select === "scroll-reading") { + const delta = named["delta"]; + return typeof delta === "number" ? { kind: "scroll-reading", delta } : undefined; + } if (select === "session") { const session = named["session"]; return typeof session === "string" && session.length > 0 diff --git a/packages/cli/src/repl/program.ts b/packages/cli/src/repl/program.ts index a25458941..01a67c1e0 100644 --- a/packages/cli/src/repl/program.ts +++ b/packages/cli/src/repl/program.ts @@ -55,6 +55,7 @@ import { permissionWithdrawn, presentationFor, readinessOf, + readingOf, reduceRepl, refusedView, stateFor, @@ -82,7 +83,9 @@ import type { ReplSession } from "./session.ts"; import { useReplFrames } from "./frame.ts"; import type { ReplFrames } from "./frame.ts"; import { committedOps, flatten, profileFor, skeletonOps } from "./layout.ts"; -import type { ReplBox, ReplLayoutManifest, ReplRegion } from "./layout.ts"; +import { prepareReading } from "./fitting.ts"; +import { readingLines } from "./source-reading.ts"; +import type { ReplBounds, ReplBox, ReplLayoutManifest, ReplRegion } from "./layout.ts"; import { capacityOf, NOTHING_ADMITTED } from "./layout-admission.ts"; import type { ReplAdmission } from "./layout-admission.ts"; import { resolvePointer, useReplRenderer } from "./renderer.ts"; @@ -1363,6 +1366,10 @@ function measuringAt( entriesWindowed, entriesRows, capture: "capture", + // The measuring pass describes no width-dependent text, so it has no + // fitted reading either: a reading prepared against a width this pass is + // still asking for would be a reading fitted to nothing. + reading: undefined, }; } @@ -1413,11 +1420,45 @@ export function* prepareFrame( if (!third.ok) { return third; } + // Every answer this pass gave, copied out before anything else is measured. + // The engine's reported geometry is only valid until the next render, and the + // reading below renders probes — so a `boundsOf` read afterwards answers from + // a tree the frame never described. Measured: it reported capacities from the + // probe pass, which admitted a question drawer short of the one on screen and + // took a field's Tab stop away with it. + const geometry = new Map(); + for (const one of flatten(measured.manifest.root)) { + const bounds = third.value.boundsOf(one.id); + if (bounds !== undefined) { + geometry.set(one.id, bounds); + } + } + // The entry reading, fitted to the transcript's measured inner width. It + // happens here — after the widths are known and before anything is admitted — + // because the rows it produces are what the window has to admit and what the + // descriptions have to say. Preparing it later would admit a count from one + // list and describe another. + // + // Independent probe elements, so nothing about this measurement touches the + // tree the frame is about to draw. + // + // A profile with no pane for it has no reading: a frame refused for being too + // small publishes no transcript and no routed outlet, so there is no measured + // region to fit one to. That is different from a pane too narrow to hold a + // grapheme, which is a refusal and stays one. + const reading = + widths.surface < 1 + ? Ok(undefined) + : yield* prepareReading(renderer, view.size, readingLines(readingOf(view)), widths.surface); + if (!reading.ok) { + return reading; + } const admission = admissionFor({ view, manifest: measured.manifest, widths, - boundsOf: (id: string) => third.value.boundsOf(id), + reading: reading.value, + boundsOf: (id: string) => geometry.get(id), }); const context: ReplPresentationContext = { widths, @@ -1426,6 +1467,7 @@ export function* prepareFrame( entriesWindowed: windowed, entriesRows, capture: "capture", + reading: reading.value, }; return Ok({ context, admission, presentation: presentationFor(view, context) }); } diff --git a/packages/cli/src/repl/source-reading.ts b/packages/cli/src/repl/source-reading.ts index 4fc1a792c..bccafee5c 100644 --- a/packages/cli/src/repl/source-reading.ts +++ b/packages/cli/src/repl/source-reading.ts @@ -134,6 +134,35 @@ export const NO_READING: ReplReading = Object.freeze({ }), }); +/** + * One reading as the flat list of logical lines it is drawn as. + * + * Captions included, because a caption is a row of the reading rather than a + * fixed heading above it: the two halves share one vertical window, so + * scrolling from a result down into the source that produced it has to carry + * the words that say which is which. + */ +export function readingLines(reading: ReplReading): readonly ReplReadingLine[] { + return Object.freeze([ + caption("output", reading.output), + ...reading.output.lines, + caption("source", reading.source), + ...reading.source.lines, + ]); +} + +function caption(key: string, section: ReplReadingSection): ReplReadingLine { + return Object.freeze({ + key: `caption:${key}`, + text: section.caption, + runs: tokenRuns([{ text: section.caption, token: section.captionStyle.role }]), + rail: "rail-pending", + depth: 0, + badge: undefined, + style: section.captionStyle, + }); +} + /** What a reading is being built for. */ export interface ReplReadingRequest { readonly entry: ReplEntry; @@ -202,10 +231,26 @@ function outputSection(request: ReplReadingRequest): ReplReadingSection { ? "failed-outcome" : "waiting"; const said = terminal.status === "cancelled" ? "cancelled" : `closed ${terminal.status}`; + // The reason, and only where there is one to give. An `ok`, a cancellation and + // an entry that never settled have no reason to show, and inventing text for + // them would describe a failure that did not happen. Its own row, so the + // outcome and the reason are two rows a window can move rather than one row + // this pane has to break in the middle. + const reason = + terminal.status === "err" && terminal.message !== undefined + ? plain( + `failed: ${terminal.message}`, + "output:reason", + styleOf("failed-outcome", { inspected }), + ) + : []; return Object.freeze({ caption: "No rendered output.", captionStyle: styleOf("metadata", { inspected }), - lines: plain(said, "output:outcome", styleOf(outcome, { inspected })), + lines: Object.freeze([ + ...plain(said, "output:outcome", styleOf(outcome, { inspected })), + ...reason, + ]), }); } diff --git a/packages/cli/tests/fixtures/repl/presentation.ts b/packages/cli/tests/fixtures/repl/presentation.ts index cc9ef6e5a..1c60c3830 100644 --- a/packages/cli/tests/fixtures/repl/presentation.ts +++ b/packages/cli/tests/fixtures/repl/presentation.ts @@ -705,6 +705,9 @@ export function measuringContext(size: ReplTerminalSize): ReplPresentationContex entriesWindowed: false, entriesRows: undefined, capture: "capture", + // The measuring pass has no fitted reading, which is what makes it the pass + // that asks how wide the pane holding one is. + reading: undefined, }; } diff --git a/packages/cli/tests/repl-agent-interface.test.ts b/packages/cli/tests/repl-agent-interface.test.ts index 2a4a2ca8a..a54c5bf86 100644 --- a/packages/cli/tests/repl-agent-interface.test.ts +++ b/packages/cli/tests/repl-agent-interface.test.ts @@ -1117,10 +1117,10 @@ describe("U1 — one chronology, filtered, undisturbed by the background", () => expect((yield* turnRows(filtered)).map((one) => one.label.includes(later))).toEqual([true]); expect( (yield* keysOf(filtered)).filter( - (key) => key.startsWith("entry:") || key.startsWith("line:"), + (key) => key.startsWith("entry:") || key.startsWith("reading:"), ), ).toEqual( - (yield* keysOf(view)).filter((key) => key.startsWith("entry:") || key.startsWith("line:")), + (yield* keysOf(view)).filter((key) => key.startsWith("entry:") || key.startsWith("reading:")), ); // And All puts every turn back, removing only the filter. @@ -1754,7 +1754,7 @@ describe("U3 — what each accepted frame mounts, and nothing else", () => { // column are not mounted, so they are in no frame, no target map and no // pointer's way. const mounted = tree.mounted().map((id) => tree.keyOf(id) ?? ""); - for (const prefix of ["entry:", "scope:", "line:", "binding:", "elicit:"]) { + for (const prefix of ["entry:", "scope:", "reading:", "binding:", "elicit:"]) { expect(mounted.filter((key) => key.startsWith(prefix))).toEqual([]); expect((yield* keysOf(view)).filter((key) => key.startsWith(prefix))).toEqual([]); } @@ -1765,7 +1765,9 @@ describe("U3 — what each accepted frame mounts, and nothing else", () => { const placed = frame.keys; expect(placed.some((key) => key.startsWith("sessions:turn:"))).toBe(true); expect(placed).toContain("entries:heading"); - expect(placed.filter((key) => key.startsWith("entry:") || key.startsWith("line:"))).toEqual([]); + expect(placed.filter((key) => key.startsWith("entry:") || key.startsWith("reading:"))).toEqual( + [], + ); // Every target this frame offers is a control, and every one of them is // mounted: nothing offers itself to a pointer and then does nothing. for (const key of placed.filter((one) => frame.targetable(one))) { @@ -3370,10 +3372,14 @@ describe("U9 — two entries whose Prompts share one durable name", () => { /** The transcript lines one view draws, in order, excluding the live overlay. */ function* transcriptLines(view: ReplView): Operation { - return (yield* describedBy(view)) - .filter((one) => one.key.startsWith("line:") && !one.key.startsWith("line:live:")) - .map((one) => one.label.trim()) - .filter((label) => label.length > 0); + return ( + (yield* describedBy(view)) + .filter((one) => one.key.startsWith("reading:") && !one.key.includes(":live")) + // Every reading row opens with its rail, which says which region the row is + // in rather than what the row says. + .map((one) => one.label.replace(/^[\u2502]\s*/, "").trim()) + .filter((label) => label.length > 0) + ); } /** The catalog rows one view describes, in the order it describes them. */ diff --git a/packages/cli/tests/repl-agent-journey.test.ts b/packages/cli/tests/repl-agent-journey.test.ts index 19b87f02a..ef4e8c17d 100644 --- a/packages/cli/tests/repl-agent-journey.test.ts +++ b/packages/cli/tests/repl-agent-journey.test.ts @@ -333,7 +333,9 @@ describe("J1 — the Story, from one entry to one README", () => { expect(shows(terminal, "generated generated")).toBe(true); // And both Plan reviews are retained where they were asked, which is // inside that scope rather than in the entry. - expect(occurrences(terminal, "answered @executablemd/cli/Plan.md")).toBe(2); + expect( + yield* answeredUnder(terminal, "component Plan", "answered @executablemd/cli/Plan"), + ).toBe(2); // Two turns in one conversation, and nothing else was asked. expect(fake.prompts).toHaveLength(2); @@ -635,12 +637,19 @@ describe("J3 — durable truth, and a cold process over it", () => { // Both turns are recorded rows rather than a live process's readings, and // both Plan reviews are retained where they were asked. expect(occurrences(second.terminal, "completed, recorded")).toBe(2); - expect(occurrences(second.terminal, "answered @executablemd/cli/Plan.md")).toBe(2); + expect( + yield* answeredUnder(second.terminal, "component Plan", "answered @executablemd/cli/Plan"), + ).toBe(2); // The program's own two questions are retained with the answers they // took. Their positions carry no path — generated source is not a file — // so they are shown under the fragment that produced them. - expect(occurrences(second.terminal, 'answered 4:1 {"project":"Ledger"')).toBe(1); - expect(occurrences(second.terminal, 'answered 12:1 {"decision":"Approv')).toBe(1); + yield* click(second.terminal, "generated generated"); + yield* settled(40); + // The answers themselves are read from the reading above, which shows + // them in full; what this counts is that each question is retained under + // the fragment that asked it, at the position it was written. + expect(occurrences(second.terminal, "answered 4:1")).toBe(1); + expect(occurrences(second.terminal, "answered 12:1")).toBe(1); // And the branch that was not taken is on the screen once, as source. expect(occurrences(second.terminal, STOPPED)).toBe(1); @@ -2314,6 +2323,32 @@ function occurrences(terminal: Terminal, text: string): number { return screenOf(terminal).filter((line) => line.includes(text)).length; } +/** + * Select one scope by its catalog row, and count what it says was answered. + * + * #881 PR 2 gave the Transcript the selected entry's reading, so the records of + * every scope no longer appear there at once; the answers a nested scope + * retained are read by selecting that scope, which is where the product says + * they were asked. Selecting is the claim: a row counted under the wrong scope + * would be an answer attributed to somewhere it never happened. + */ +function* answeredUnder(terminal: Terminal, scope: string, text: string): Operation { + yield* click(terminal, scope); + yield* settled(40); + const found = occurrences(terminal, text); + if (found === 0) { + throw new Error( + `after selecting ${scope}, no row said ${text}: ${JSON.stringify( + screenOf(terminal) + .map((line) => line.trimEnd()) + .filter((line) => line.length > 0) + .slice(0, 12), + )}`, + ); + } + return found; +} + /** Every row of the screen holding this text, trimmed, in order. */ function shown(terminal: Terminal, text: string): string[] { return screenOf(terminal) @@ -2471,8 +2506,12 @@ function* showing(terminal: Terminal, expected: string): Operation { function coordinateOf( terminal: Terminal, label: string, + from = 0, ): { readonly column: number; readonly row: number } | undefined { for (const [row, line] of screenOf(terminal).entries()) { + if (row < from) { + continue; + } const column = line.indexOf(label); if (column !== -1) { return { column, row }; @@ -2481,6 +2520,25 @@ function coordinateOf( return undefined; } +/** + * Where the open drawer begins, as the row its own top rule is on. + * + * Needed to tell a control inside the drawer from text that merely reads the + * same outside it: #881 PR 2 gave the Transcript the entry's source, and a + * question's own schema is written in that source — so `Project name` is on the + * screen twice, once as the field to click and once as the `title` the author + * typed. A pointer aimed at the second lands behind the modal and does nothing. + */ +function drawerTop(terminal: Terminal): number { + for (const [row, line] of screenOf(terminal).entries()) { + const said = line.trim(); + if (said.length > 8 && /^\u2500+$/.test(said)) { + return row; + } + } + return 0; +} + /** * Click one control, by finding it on the screen and pressing there. * @@ -2488,8 +2546,8 @@ function coordinateOf( * pointer needs no focus, so it can reach a control while an execution is still * moving. The protocol counts from one and the screen counts from zero. */ -function* click(terminal: Terminal, label: string): Operation { - const at = coordinateOf(terminal, label); +function* click(terminal: Terminal, label: string, from = 0): Operation { + const at = coordinateOf(terminal, label, from); if (at === undefined) { throw new Error(`no control labelled ${label} is on the screen`); } @@ -2651,13 +2709,14 @@ function* focusDraft(terminal: Terminal): Operation { /** Type a value into the field this label names. */ function* answer(terminal: Terminal, label: string, value: string): Operation { - yield* click(terminal, label); + // Inside the drawer that is asking, not wherever the words first appear. + yield* click(terminal, label, drawerTop(terminal)); terminal.bytes(BYTES.encode(value)); yield* settled(20); } /** Submit the open form. */ function* submit(terminal: Terminal): Operation { - yield* click(terminal, "[submit]"); + yield* click(terminal, "[submit]", drawerTop(terminal)); yield* settled(40); } diff --git a/packages/cli/tests/repl-entries.test.ts b/packages/cli/tests/repl-entries.test.ts index 950cea683..77a9eaad8 100644 --- a/packages/cli/tests/repl-entries.test.ts +++ b/packages/cli/tests/repl-entries.test.ts @@ -2317,19 +2317,44 @@ function saying(what: string): string { return `${what}\n`; } -/** The transcript lines this view draws, in order. */ +/** + * The reading's rows this view draws, in order, as the text in each of them. + * + * #881 PR 2 replaced the transcript's record rows with the entry's reading, so + * these are its rows. Each one opens with its rail, which says which region the + * row is in rather than what the row says — so the rail and the gap after it are + * dropped here, leaving what a reader reads. + */ function* transcriptOf(view: ReplView): Operation { return (yield* describedBy(view)) - .filter((one) => one.key.startsWith("line:") && !one.key.startsWith("line:live:")) - .map((one) => one.label.trim()) + .filter((one) => one.key.startsWith("reading:") && !one.key.startsWith("reading:output:live")) + .map((one) => said(one.label)) .filter((label) => label.length > 0); } -/** The live overlay lines this view draws, in order. */ +/** + * The Output half of the reading this view draws, caption included. + * + * For the cases whose claim is about what an entry *produced*, which the + * reading states separately from the source that produced it. + */ +function* outputOf(view: ReplView): Operation { + return (yield* describedBy(view)) + .filter((one) => one.key === "reading:caption:output" || one.key.startsWith("reading:output:")) + .map((one) => said(one.label)) + .filter((label) => label.length > 0); +} + +/** The live overlay rows this view draws, in order. */ function* overlayOf(view: ReplView): Operation { return (yield* describedBy(view)) - .filter((one) => one.key.startsWith("line:live:")) - .map((one) => one.label.trim()); + .filter((one) => one.key.startsWith("reading:output:live")) + .map((one) => said(one.label)); +} + +/** What one reading row says, without the rail that says where it is. */ +function said(label: string): string { + return label.replace(/^[\u2502]\s*/, "").trim(); } /** The Sessions rows this view draws, in order, with their labels. */ @@ -2348,11 +2373,15 @@ describe("REPL entries: the transcript belongs to the entry that is selected", ( expect(model.entries.map((entry) => entry.key)).toEqual(["entry-1", "entry-2"]); const standing = initialState(EXECUTION); - // Nothing selected is the whole execution, which is what a one-entry - // execution has always shown and what this must not change. + // Re-anchored for #881 PR 2. The transcript used to concatenate every + // entry's records when nothing was selected; it now holds one entry's + // reading, and with nothing selected that is the last entry this prefix + // admitted — which is still what a one-entry execution shows. The claim + // this case exists for is unchanged and is the one below it: no reading + // shows another entry's. const whole = yield* transcriptOf(reading(standing, model, NOTHING_LIVE, WIDE)); - expect(whole).toContain("ALPHA-ONE"); expect(whole).toContain("BRAVO-TWO"); + expect(whole).not.toContain("ALPHA-ONE"); const first = yield* transcriptOf( reading(selecting(standing, "entry-1"), model, NOTHING_LIVE, WIDE), @@ -2391,7 +2420,11 @@ describe("REPL entries: the transcript belongs to the entry that is selected", ( const standing = initialState(EXECUTION); // Reading the entry that is running: the overlay is its own, so it shows. const running = reading(selecting(standing, "entry-2"), model, live, WIDE); - expect(yield* overlayOf(running)).toContain("… CHARLIE-LIVE"); + // Re-anchored for #881 PR 2: the Output half says once that its text is + // still arriving, so each row no longer repeats an ellipsis. Both claims + // are kept — the text is shown, and it is marked as live. + expect(yield* overlayOf(running)).toContain("CHARLIE-LIVE"); + expect(yield* transcriptOf(running)).toContain("Output · live"); // Reading the settled entry before it: the overlay is somebody else's // run, and attributing it here would show text this entry never produced. @@ -2400,9 +2433,9 @@ describe("REPL entries: the transcript belongs to the entry that is selected", ( expect(yield* transcriptOf(earlier)).toContain("ALPHA-ONE"); expect(yield* transcriptOf(earlier)).not.toContain("CHARLIE-LIVE"); - // With nothing selected the locus is the execution, which includes - // whatever is running in it — unchanged from a one-entry execution. - expect(yield* overlayOf(reading(standing, model, live, WIDE))).toContain("… CHARLIE-LIVE"); + // With nothing selected the locus is the last entry admitted, which is + // the one that can still be running — so its live text is what shows. + expect(yield* overlayOf(reading(standing, model, live, WIDE))).toContain("CHARLIE-LIVE"); // Sessions is execution-wide and the same reading under every selection, // row for row and label for label. @@ -2692,10 +2725,20 @@ describe("REPL entries: what each prefix of a two-entry history shows", () => { const state = frozenAt(drafting(initialState(EXECUTION), "still typing"), marker); return yield* transcriptOf(reading(state, projected(events, marker), NOTHING_LIVE, WIDE)); }; + // The Output half alone. Re-anchored for #881 PR 2: the reading also shows + // the source each prefix admitted, and at the admission checkpoint that + // source is the second entry's own — so the claim being made here, that no + // prefix shows output it had not retained, is read off the half that + // carries output. + const outputAt = function* (marker: string): Operation { + const state = frozenAt(drafting(initialState(EXECUTION), "still typing"), marker); + return yield* outputOf(reading(state, projected(events, marker), NOTHING_LIVE, WIDE)); + }; expect(yield* linesAt(before)).toContain("ALPHA-ONE"); expect(yield* linesAt(before)).not.toContain("BRAVO-TWO"); - expect(yield* linesAt(admission)).not.toContain("BRAVO-TWO"); - expect(yield* linesAt(terminal)).toContain("BRAVO-TWO"); + expect(yield* outputAt(admission)).not.toContain("BRAVO-TWO"); + expect(yield* outputAt(admission)).toContain("No entry output recorded at this checkpoint."); + expect(yield* outputAt(terminal)).toContain("BRAVO-TWO"); // The draft is current route state throughout: it is not a thing a prefix // retained, so freezing the durable view does not freeze it. @@ -3214,8 +3257,8 @@ describe("REPL entries: what a failed entry says it failed with", () => { /** The transcript rows this model describes, by label. */ function* transcript(model: ReplModel): Operation { return (yield* describedBy(reading(initialState(EXECUTION), model, NOTHING_LIVE, WIDE))) - .filter((one) => one.key.startsWith("line:")) - .map((one) => one.label); + .filter((one) => one.key.startsWith("reading:")) + .map((one) => said(one.label)); } it("UI13: the recorded reason is on the screen, bounded, and a cold reopen says the same", function* () { @@ -3300,9 +3343,11 @@ describe("REPL entries: what a failed entry says it failed with", () => { const frame = yield* drawn(tree, view, size); const cells = frame.keys - .filter((key) => key.startsWith("line:")) + .filter((key) => key.startsWith("reading:")) .map((key) => ({ key, text: frame.cell(key) ?? "", bounds: frame.bounds(key) })); - const failed = cells.find((cell) => cell.text.startsWith("failed: ")); + // The rail opens every reading row, so the reason is found by what the + // row says rather than by what the row begins with. + const failed = cells.find((cell) => cell.text.includes("failed: ")); const region = frame.region("transcript"); if (region === undefined) { @@ -3326,11 +3371,18 @@ describe("REPL entries: what a failed entry says it failed with", () => { ]).toEqual([size.columns, true]); // One row, which is what keeps everything below it where it was. expect([size.columns, drawn?.height]).toEqual([size.columns, 1]); - // And it says so wherever it had to be shortened, rather than ending - // mid-word with the mark cut off by the renderer. - if ((failed?.text.length ?? 0) === region.width) { - expect([size.columns, failed?.text.endsWith("…")]).toEqual([size.columns, true]); - } + // Re-anchored for #881 PR 2: a reason too long for the pane is now + // *wrapped* rather than shortened with a mark, so what used to be the + // tail of one clipped row is the next row of the reading. The claim + // the ellipsis stood for — no character of the recorded reason is + // thrown away — is the stronger one, and is asserted here by + // recovering the whole reason from the rows it was cut into. + const reason = cells + .filter((cell) => cell.key.startsWith("reading:output:reason:")) + .map((cell) => cell.text.replace(/^[\u2502]\s*/, "").trimEnd()) + .join(""); + expect([size.columns, reason.startsWith("failed: ")]).toEqual([size.columns, true]); + expect([size.columns, reason.includes("…")]).toEqual([size.columns, false]); } // The footer is exactly where it always is: the reason did not push a diff --git a/packages/cli/tests/repl-journey.test.ts b/packages/cli/tests/repl-journey.test.ts index 9ecb626ef..ea111bf03 100644 --- a/packages/cli/tests/repl-journey.test.ts +++ b/packages/cli/tests/repl-journey.test.ts @@ -1097,6 +1097,36 @@ function* histories(root: string): Operation { return entries.filter((name) => name.endsWith(".jsonl")).sort(); } +/** + * The Transcript column's own rows, as the columns of the screen they occupy. + * + * Sliced between the two headings that name the columns either side of it, so + * what comes back is this pane's text and not the sidebar's or the Bindings + * column's. Never trimmed: the padding between one row's text and the next is + * what a wrapped line's break became, and dropping it would join two words the + * reading kept apart. + */ +function transcriptColumn(terminal: Terminal): string[] { + const rows = screenOf(terminal); + const header = rows.findIndex((line) => line.includes("Transcript")); + if (header < 0) { + throw new Error(`this screen has no Transcript column; it has ${JSON.stringify(rows)}`); + } + const left = rows[header].indexOf("Transcript"); + const right = rows[header].indexOf("Bindings"); + // The pane's edge and the reading's rail become spaces: they are the frame + // saying where a row is, not part of what the row says, and a wrapped line's + // break is the whitespace either side of them. + return rows.map((line) => + line.slice(left, right < 0 ? undefined : right).replace(/[\u2502\u2500]/g, " "), + ); +} + +/** One string with every run of whitespace as one space, for comparing two. */ +function flattened(text: string): string { + return text.replace(/\s+/g, " ").trim(); +} + /** The last row of the screen that contains this text, or none. */ function lastRowContaining(rows: readonly string[], text: string): number { for (let row = rows.length - 1; row >= 0; row -= 1) { @@ -2203,23 +2233,28 @@ describe("REPL journey: the whole of it, from raw bytes", () => { yield* until_(terminal, "the answer's output", (t) => shows(t, "Decision: approve")); expect(shows(terminal, "[ok]")).toBe(true); - // The generated fragment's source is on screen above the row that admits it. - // Which two rows those are comes from the model rather than from a guess at - // their wording; which order they are in comes from the screen. + // The generated fragment's source is on screen, inside the enclosure its + // author wrote. Which text that is comes from the model rather than from a + // guess at its wording; where it sits comes from the screen. + // + // Re-anchored for #881 PR 2. This used to assert that the fragment's + // source row came above the effect row admitting it, both of which were + // transcript records. The reading replaces that with the stronger claim: + // the fragment is shown *where its producer was written*, between the + // opening and closing tags the author typed. const settledModel = yield* projectionOf(root, files[0]); const at = settledModel.transcript.findIndex((row) => row.kind === "generated"); expect(at).toBeGreaterThanOrEqual(0); const sourceRow = settledModel.transcript[at]; - const admission = settledModel.transcript.slice(at + 1).find((row) => row.kind === "effect"); - if (sourceRow?.kind !== "generated" || admission?.kind !== "effect") { - throw new Error("the settled history holds a generated fragment and its admission"); + if (sourceRow?.kind !== "generated" || sourceRow.source === undefined) { + throw new Error("the settled history holds an admitted generated fragment"); } - const rows = screenOf(terminal).map((line) => line.trim()); - const sourceAt = rows.findIndex((line) => line.includes(sourceRow.source ?? "«none»")); - const admittedAt = lastRowContaining(rows, `${admission.type} ${admission.status}`); - expect(sourceAt).toBeGreaterThanOrEqual(0); - expect(admittedAt).toBeGreaterThanOrEqual(0); - expect(sourceAt).toBeLessThan(admittedAt); + // Recovered from the rows it was wrapped into, because the reading wraps + // rather than clips: the whole of it is on the screen, across as many rows + // as the pane needed, and concatenating the pane's own rows is what gets + // it back. + const column = transcriptColumn(terminal).join(""); + expect(flattened(column)).toContain(flattened(sourceRow.source)); // 7. The complete binding value, from the drawer that holds it. yield* activate(terminal, "1. [ok] entry-1"); @@ -2355,7 +2390,12 @@ describe("REPL journey: the whole of it, from raw bytes", () => { second.terminal.feed("\x1b"); yield* settled(30); expect(shows(second.terminal, "component Checklist")).toBe(true); - expect(shows(second.terminal, "generated admitted:")).toBe(true); + // Re-anchored for #881 PR 2: the transcript's `generated admitted:` + // record row became the entry's reading, and the fragment this cold + // process reconstructed is the catalog row that names it. The claim is + // unchanged — a reopened process shows the generated region the first one + // admitted. + expect(shows(second.terminal, "generated generated")).toBe(true); expect(shows(second.terminal, "Decision: approve")).toBe(true); // The same complete binding value. @@ -2666,13 +2706,18 @@ describe("REPL journey: the same product at every size", () => { yield* settled(60); terminal.feed("\r"); yield* dismissQuestion(terminal); - yield* until_(terminal, "the transcript", (t) => shows(t, "component Checklist")); + yield* until_(terminal, "the transcript", (t) => shows(t, "About to evaluate:")); // A transcript with something in it — recorded before anything covers it, // so what follows is a claim about coverage rather than about absence. // Texts that belong to the transcript and to nothing the drawer lists, so // finding one inside the drawer means it showed through. - const underneath = ["import_component ok", "About to evaluate:"]; + // Re-anchored for #881 PR 2: the transcript's record rows became the + // entry's reading, so these are two lines of what that reading shows. + // Both belong to it and to nothing this drawer lists — the retained + // positions name `summarySource` and ` admitted`, so + // neither `Source` nor `Checklist` would discriminate anything. + const underneath = ["### Ship the REPL", "2 steps remain."]; for (const text of underneath) { expect(shows(terminal, text)).toBe(true); } @@ -3230,7 +3275,13 @@ describe("REPL journey: output nothing records still reaches the screen", () => } // No question is pending, so nothing but output has woken this screen. - expect(shows(terminal, "Decide?")).toBe(false); + // + // Re-anchored for #881 PR 2: the Transcript now shows the entry's own + // source, and `Decide?` is written in it — so the absence of a question + // is asserted as the absence of a question rather than as the absence of + // its words. That is the stronger claim and the one the reading makes: + // source on the screen never proves anything is waiting. + expect(askedRow(terminal)).toBeUndefined(); // The text after the last record this document writes. Nothing recorded // it, nothing reprojected because of it, and it is on the screen. expect(shows(terminal, PRINTED)).toBe(true); diff --git a/packages/cli/tests/repl-presentation-style.test.ts b/packages/cli/tests/repl-presentation-style.test.ts index 682bfa24e..9a57082a6 100644 --- a/packages/cli/tests/repl-presentation-style.test.ts +++ b/packages/cli/tests/repl-presentation-style.test.ts @@ -59,7 +59,7 @@ import type { import type { ReplDispatched } from "../src/repl/reconcile.ts"; import type { ReplDrawerRef } from "../src/repl/route.ts"; import { FOOTER_ROWS, HISTORY_LABEL, HISTORY_ROWS, NARROW } from "../src/repl/layout.ts"; -import { ACTION_ROW, DRAWER_WINDOW } from "../src/repl/application.ts"; +import { ACTION_ROW, DRAWER_WINDOW, READING_WINDOW } from "../src/repl/application.ts"; import type { ReplBounds } from "../src/repl/layout.ts"; import { BOLD, REPL_PALETTE } from "../src/repl/presentation-style.ts"; import { @@ -178,6 +178,30 @@ function* submittedByPath(): Operation { return projected(yield* physical.readAll()); } +/** + * One line of prose longer than any pane this frame has, and one unbroken + * token no word boundary can break. + * + * The case R3 needs: text that would reach the pane beside it if nothing fitted + * it. It is a document's own prose rather than a path, because what a reader + * came for is exactly the text this screen must not shorten — so the only + * honest way to keep it inside its pane is to measure it and wrap it. + */ +const LONG_SOURCE = [ + "One line of ordinary prose, written long enough that no pane this frame has " + + "room for could hold it on a single row without reaching into the column " + + "beside it, which is the artifact this case exists to catch.", + "", + `t${"t".repeat(200)}`, + "", +].join("\n"); + +function* submittedWithLongSource(): Operation { + const physical = new InMemoryStream(); + yield* runHostEntry(physical, HOST_ENTRY_PATH, LONG_SOURCE); + return projected(yield* physical.readAll()); +} + /** The projected model, or the failure that stopped it. */ function projected(events: readonly DurableEvent[]): ReplModel { const result = projectRepl(events); @@ -339,6 +363,15 @@ function textOf(grid: TerminalGrid, bounds: ReplBounds): string { return grid.textIn(bounds)[0] ?? ""; } +/** The sidebar the catalog is drawn in. */ +function sidebarRegion(observed: Observed): ReplBounds { + const bounds = regionBounds(observed, "sidebar"); + if (bounds === undefined) { + throw new Error("this frame published no sidebar region"); + } + return bounds; +} + /** Whether one rectangle is inside another, so a row can be held to its pane. */ function within(inner: ReplBounds, outer: ReplBounds): boolean { return ( @@ -349,17 +382,20 @@ function within(inner: ReplBounds, outer: ReplBounds): boolean { ); } -/** The first transcript row of one kind, as the key the frame drew it under. */ -function transcriptKey(model: ReplModel, kind: string): string { - const at = model.transcript.findIndex((row) => row.kind === kind); - if (at < 0) { - throw new Error( - `this prefix holds no ${kind} row; it holds ${model.transcript - .map((row) => row.kind) - .join(", ")}`, - ); +/** + * One subordinate row, as the frame drew it. + * + * Before #881 PR 2 this was a transcript record row — a fact about the event + * that produced the output beside it. The transcript now holds the entry's + * reading, so the subordinate reading is taken from a row that still carries + * it: what the frame says where it has nothing retained to list. + */ +function metadataKey(observed: Observed): string { + const key = observed.keys.find((one) => one === "sessions:empty"); + if (key === undefined) { + throw new Error(`this frame drew no subordinate row; it drew ${observed.keys.join(", ")}`); } - return `line:${at}:0`; + return key; } /** Every mounted row whose cells carry the focus foreground. */ @@ -415,7 +451,11 @@ describe("REPL presentation: what one row's cells say it is", () => { it("G1: output, metadata and the two outcomes are four different readings", function* () { const model = yield* settledAndFailed(); const presenter = yield* usePresenter(WIDE); - const observed = yield* presenter.commit(reading(stateWith({}), model)); + // The entry whose result is under test, selected: a reading belongs to an + // entry, so which entry is being read is part of asking what it says. + const observed = yield* presenter.commit( + reading(selecting(stateWith({}), model.entries[0].key), model, NOTHING_LIVE, WIDE), + ); const { grid } = presenter; const transcript = regionBounds(observed, "transcript"); @@ -423,16 +463,23 @@ describe("REPL presentation: what one row's cells say it is", () => { throw new Error("this frame published no transcript region"); } - // What the run produced, and a fact about the event that produced it. The - // same eval block wrote both, so they are adjacent lines in one column and - // nothing but the style tells a reader which is which. - const output = placed(observed, transcriptKey(model, "output")); - const metadata = placed(observed, transcriptKey(model, "binding")); - expect(inkOf(grid, output).foreground).toBe(REPL_PALETTE.output); + // What the run produced, and a fact about the event that produced it. + // + // Re-anchored for #881 PR 2. These were adjacent transcript rows written by + // one eval block; the transcript now holds the entry's *reading* — its + // output and then its source — and the facts about events are the inspection + // column's. The claim is unchanged: a result and a fact about the event that + // produced it are two readings, and nothing but the style says which is + // which. + const output = placed(observed, "reading:output:0"); + const said = model.entries[0].terminal?.output.split("\n")[0] ?? ""; + expect(said.length).toBeGreaterThan(0); + const metadata = placed(observed, metadataKey(observed)); + expect(inkOfSpan(grid, output, said).foreground).toBe(REPL_PALETTE.output); expect(inkOf(grid, metadata).foreground).toBe(REPL_PALETTE.muted); - expect(inkOf(grid, output).foreground).not.toBe(inkOf(grid, metadata).foreground); + expect(inkOfSpan(grid, output, said).foreground).not.toBe(inkOf(grid, metadata).foreground); expect(within(output, transcript)).toBe(true); - expect(within(metadata, transcript)).toBe(true); + expect(within(metadata, sidebarRegion(observed))).toBe(true); // The two outcomes the file recorded, in the catalog that promises them. const sidebar = regionBounds(observed, "sidebar"); @@ -450,7 +497,7 @@ describe("REPL presentation: what one row's cells say it is", () => { // Four distinct readings, and the words survive without any of them. const colours = [ - inkOf(grid, output).foreground, + inkOfSpan(grid, output, said).foreground, inkOf(grid, metadata).foreground, inkOf(grid, settled).foreground, inkOf(grid, failed).foreground, @@ -479,10 +526,21 @@ describe("REPL presentation: what one row's cells say it is", () => { reading(selecting(stateWith({}), settled.key), model, NOTHING_LIVE, WIDE), ); const { grid } = presenter; - const first = placed(observed, `line:${at}:0`); - expect(textOf(grid, first)).toContain(record.output.split("\n")[0]); - expect(inkOf(grid, first).foreground).toBe(REPL_PALETTE.output); - expect(inkOf(grid, first).foreground).not.toBe(REPL_PALETTE.success); + // Re-anchored for #881 PR 2: the entry's result is the Output half of its + // reading rather than a transcript row keyed by the record's position. The + // claim is unchanged — the rendered document reads as output, and not as the + // word the root closed with. + const first = placed(observed, "reading:output:0"); + const said = record.output.split("\n")[0]; + expect(textOf(grid, first)).toContain(said); + // The text's own ink, not the row's first cell: every reading row opens + // with its rail, which says which region the row is in rather than what the + // row is. + expect(inkOfSpan(grid, first, said).foreground).toBe(REPL_PALETTE.output); + expect(inkOfSpan(grid, first, said).foreground).not.toBe(REPL_PALETTE.success); + // And it is labelled as the retained result rather than as live text. + expect(textOf(grid, placed(observed, "reading:caption:output"))).toContain("Output"); + expect(textOf(grid, placed(observed, "reading:caption:output"))).not.toContain("live"); // The outcome keeps its accent where an outcome is what is shown. expect(inkOf(grid, placed(observed, `entry:${settled.key}`)).foreground).toBe( @@ -509,12 +567,18 @@ describe("REPL presentation: what one row's cells say it is", () => { const { grid } = presenter; // With nothing recorded to show, the outcome itself is the row, and it keeps // the outcome accent; the reason recorded beside it is its own row. - const closed = placed(observed, `line:${at}:0`); + // Re-anchored for #881 PR 2 onto the reading's Output half; both claims and + // both accents are unchanged, and the caption now says that the absence of + // rendered text is what is being reported. + expect(textOf(grid, placed(observed, "reading:caption:output"))).toContain( + "No rendered output.", + ); + const closed = placed(observed, "reading:output:outcome:0"); expect(textOf(grid, closed)).toContain("closed err"); - expect(inkOf(grid, closed).foreground).toBe(REPL_PALETTE.failure); - const reason = placed(observed, `line:${at}:1`); + expect(inkOfSpan(grid, closed, "closed err").foreground).toBe(REPL_PALETTE.failure); + const reason = placed(observed, "reading:output:reason:0"); expect(textOf(grid, reason)).toContain("failed:"); - expect(inkOf(grid, reason).foreground).toBe(REPL_PALETTE.failure); + expect(inkOfSpan(grid, reason, "failed:").foreground).toBe(REPL_PALETTE.failure); }); it("G1: an entry that never closed reads as waiting, and says so", function* () { @@ -533,10 +597,12 @@ describe("REPL presentation: what one row's cells say it is", () => { ); // The overlay is what this process is producing, so it reads as output - // rather than as one more fact about an event. - const live = placed(observed, "line:live:0"); + // rather than as one more fact about an event. Re-anchored for #881 PR 2 + // onto the reading's Output half, which now also says it is still arriving. + const live = placed(observed, "reading:output:live:0"); expect(textOf(grid, live)).toContain("building the plan"); - expect(inkOf(grid, live).foreground).toBe(REPL_PALETTE.output); + expect(inkOfSpan(grid, live, "building the plan").foreground).toBe(REPL_PALETTE.output); + expect(textOf(grid, placed(observed, "reading:caption:output"))).toContain("live"); }); it("G1: an empty screen's placeholders are subordinate, and the draft is a surface", function* () { @@ -1149,12 +1215,19 @@ describe("REPL presentation: what a drawer says it is showing", () => { describe("REPL presentation: a row stays inside the pane it was measured for", () => { beforeAll(() => useTempFileCompiler()); - it("R3: long metadata is fitted, and the row beneath it is its own", function* () { + it("R3: a long reading is fitted, and the row beneath it is its own", function* () { // An entry submitted by its host path, which in this checkout is longer // than any pane the frame has room for. The engine clips nothing, so a row // written unbounded wraps over the cells of the row beneath it: that is the // artifact the complete gallery caught in the Transcript pane. - const model = yield* submittedByPath(); + // + // Re-anchored for #881 PR 2. The rows under test were the transcript's + // metadata records, bounded by shortening them; the transcript now holds + // the entry's reading, fitted by measuring it. Both claims are kept — what + // is drawn in a row is what that row contributed, and no row reaches the + // pane beside it — and the case still needs a row that would overflow if + // nothing bounded it. + const model = yield* submittedWithLongSource(); let exercised = false; for (const size of [WIDE, MEDIUM]) { @@ -1167,8 +1240,7 @@ describe("REPL presentation: a row stays inside the pane it was measured for", ( throw new Error(`the ${size.columns}x${size.rows} frame published no transcript interior`); } - const lines = observed.keys.filter((key) => key.startsWith("line:")); - const recordOf = (key: string) => model.transcript[Number(key.split(":")[1])]; + const lines = observed.keys.filter((key) => key.startsWith("reading:")); // Every transcript row holds what its own node contributed and nothing // else. This is the whole discrimination: an unbounded row leaves its @@ -1181,35 +1253,23 @@ describe("REPL presentation: a row stays inside the pane it was measured for", ( expect([size.columns, key, drawn]).toEqual([size.columns, key, contributed]); } - // The rows that name where something came from: an entry's path, a - // scope's name, an agent's identity. What a document or a provider - // *said* stays unbounded on purpose — that text is the thing a reader - // came for. - // - // A generated fragment's source is the one member of this class left - // unbounded. An accepted journey reads the branch a program did not take - // off this screen, which only whole source can show, so bounding it is a - // decision about what the screen owes a reader rather than a formatting - // one; it is reported with this correction rather than taken. - const bounded = new Set(["entry", "scope", "agent"]); - const metadata = lines.filter((key) => { - const record = recordOf(key); - return record !== undefined && bounded.has(record.kind); - }); - expect(metadata.length).toBeGreaterThan(0); - - for (const key of metadata) { + // Every row of the reading, held to the pane it was measured for. Each + // one is as wide as the interior and ends where the interior ends, so + // nothing of it reaches the pane beside it — which is what the engine, + // left to itself, does not do. + expect(lines.length).toBeGreaterThan(0); + for (const key of lines) { const bounds = placed(observed, key); - // As wide as the inside of its pane, and no wider. expect([key, bounds.width]).toEqual([key, inside.width]); - // And ending where the interior ends, so nothing of it reaches the - // pane beside it. expect([size.columns, key, bounds.x + bounds.width]).toEqual([ size.columns, key, inside.x + inside.width, ]); - if ((observed.cells.get(key) ?? "").length >= inside.width) { + // A row that is the continuation of a longer line: without the + // measurement that cut it, that line is what would have landed on the + // cells of the row beneath. + if (key.startsWith("reading:src:") && key.includes("+")) { exercised = true; } } @@ -1260,9 +1320,12 @@ describe("REPL presentation: the one guidance row", () => { // What is drawn in the row is what the row contributed, and so is every // transcript row beneath it: an overlong sentence lands on the cells of // the row below, which is where it was seen. - for (const key of ["guidance", ...observed.keys.filter((one) => one.startsWith("line:"))]) { - // A narrow frame describes the transcript's rows and places none of - // them, so there is nothing of theirs on this screen to read. + for (const key of [ + "guidance", + ...observed.keys.filter((one) => one.startsWith("reading:")), + ]) { + // A narrow frame describes the reading's rows and places none of them, + // so there is nothing of theirs on this screen to read. const at = key === "guidance" ? bounds : observed.boundsOf(key); if (at === undefined) { continue; @@ -1608,9 +1671,17 @@ describe("REPL presentation: the surfaces a reading is drawn on", () => { region, surface, ]); + // The bottom of the pane's own moving content, not the bottom of the + // pane. Re-anchored for #881 PR 2: the transcript's last row is now the + // reading's `[\u2193 later]` control, and a control carries the draft's + // surface wherever it is — which is this terminal's existing rule, not a + // new one. The claim is unchanged: the area a pane holds that no control + // covers is that pane's own surface. + const floor = + viewportBounds(observed, region === "transcript" ? READING_WINDOW : region) ?? bounds; expect([ region, - grid.styleAt(bounds.x + bounds.width - 1, bounds.y + bounds.height - 1).background, + grid.styleAt(bounds.x + bounds.width - 1, floor.y + floor.height - 1).background, ]).toEqual([region, surface]); } diff --git a/specs/repl-spec.md b/specs/repl-spec.md index 5908f2d6b..06cb658a3 100644 --- a/specs/repl-spec.md +++ b/specs/repl-spec.md @@ -619,6 +619,71 @@ it, and an entry that finishes takes its own with it. Source that is still on the screen and a record the history retained prove only that something was written and something was recorded — never that anything is running now. +## One entry, read as output and then source + +The transcript pane holds one entry's reading: what it produced, and then the +source that produced it. The two share one vertical window, so going from an +answer to the reason for it is one movement rather than two panes to reconcile. +A reading belongs to an entry; with nothing selected it is the last entry the +prefix admitted, which is what a one-entry execution has always shown. + +Output says which of four things is true, and never two of them. Text still +arriving is `Output · live`. The retained final result replaces it once and the +label becomes `Output`. A root that settled having rendered nothing reads `No +rendered output.` and then the outcome it closed with, and a recorded reason +beside it. A prefix that retained no output for its entry reads `No entry +output recorded at this checkpoint.` — never text borrowed from a later +position or from a run still going. + +Which of those is shown is decided by what the record says, not by the words in +it. A document whose own prose contains `failed` is still output; a root that +closed `err` is a failure whatever it rendered. Nothing is attributed to an +`` or a ``, reconstructed by concatenating block results, or +invented as a receipt for a bound value that emitted nothing. + +Source is the exact text the entry admitted. Beside each row is a rail saying +which region the row is in, and against the pane's right inner edge is the +reading of the element that owns it — glyph and word together, so the reading +survives a reader who cannot tell two of these colours apart. Only the first +row of each delimiter carries one: a tag written across several rows is one +element, not two phases. + +Nesting comes from where the delimiters are, and from nothing else. An element +whose span lies inside another's is that one's child; one that merely follows it +is its sibling. Source nothing has been observed in gets the rail that means +exactly that, and acquires no phase from retained syntax. + +An `` that admitted a generated fragment shows that fragment where its +producer was written. The enclosure bytes stay exactly as authored and only what +they enclose is replaced, so the tags a reader sees are the ones in their file; a +self-closing one keeps its row and the fragment sits underneath it. The fragment +keeps its own offsets, because those are the only ones its own recorded +positions were ever counted in. A refused, absent or ambiguous admission keeps +the producer: nothing is matched by name or by sibling order. + +Replacing what is displayed rewrites no submitted source and no record. + +## Everything on this screen was measured + +No text is clipped and none is estimated. Every width is an answer from the +engine that will draw it, asked through a probe that draws nothing, and every +break is at a grapheme boundary — a UTF-16 code unit is not a cell, and a cut +between a character and its combining mark makes two rows neither of which is a +character. + +A line too long for its region is wrapped at the last word boundary that fits, +and a word longer than the region is broken at the longest grapheme that fits. +Whitespace is kept where it was typed, blank lines stay rows, and concatenating +one line's rows recovers exactly the line. The rail, the gap after it and the +status column are reserved first, from measurements rather than character +counts, and the column is wide enough for every reading a badge can hold — +including a cleanup wait, which says two things at once — so an element +settling cannot reflow the document beside it. + +A region with no room for even one grapheme is the frame refusal that already +recovers on resize. It is never a clip: shortening somebody's source would be +this screen editing the content it exists to show. + ## What is retained, and what is not Each execution is one file of serialized ordinary `DurableEvent`s — the same From 3d8419678f0bdd1f20def4a35fad4dca414207bd Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 08:26:52 -0400 Subject: [PATCH 10/19] =?UTF-8?q?=F0=9F=9A=A7=20Close=20the=20four=20claim?= =?UTF-8?q?s=20the=20handback=20had=20left=20open?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **A pending permission is a waiting element.** The authority holds a `"permission"` wait on the element the request was asked inside, released in `ensure` — so a request abandoned at teardown releases its wait without inventing a decision nobody made. L2's third reason is now counted like the other two, and two cases in `repl-agent-execution.test.ts` assert it on the `` whose turn owns the request, not on the session. **Each call of one element is its own reading.** Several occurrences at one authored position — what a `` produces — are read in the order they were observed, each in its own source group with its own badge and its own rail. Showing only the last said the earlier calls never happened. **A continuation keeps its own column.** A wrapped line's later rows are set in to the whitespace its first row was written at. Without it a continuation sat further left than the row it continues and read as a new, shallower line — which is a claim about structure the source does not make. Display only: the line is still recovered exactly from its rows. **C3 and C4 are completed.** An observed run is compared with an unobserved one byte for byte, not screen for screen: same elements, same identities, same positions, same rendered result. A reader that takes one phase and stops, and a reader whose scope is cancelled mid-expansion, each delay and cancel nothing. Three new controls join the five: don't hold the permission wait; read only the last call; start a continuation at the margin. All eight break their frozen suites and restore byte-identically. Core 53 tests / 407 steps, CLI 108 / 363, both exit 0. `deno check --frozen` clean, `git diff --check` clean. The spec says all three of the new behaviours. --- packages/cli/src/repl/agent.ts | 23 ++- packages/cli/src/repl/fitting.ts | 35 ++++- packages/cli/src/repl/session.ts | 2 +- packages/cli/src/repl/source-reading.ts | 64 ++++++-- .../cli/tests/repl-agent-execution.test.ts | 61 ++++++++ .../cli/tests/repl-source-reading.test.ts | 76 ++++++++++ .../core/tests/component-expansion.test.ts | 139 ++++++++++++++++++ specs/repl-spec.md | 19 ++- 8 files changed, 391 insertions(+), 28 deletions(-) diff --git a/packages/cli/src/repl/agent.ts b/packages/cli/src/repl/agent.ts index 71153a8e2..964ed8524 100644 --- a/packages/cli/src/repl/agent.ts +++ b/packages/cli/src/repl/agent.ts @@ -72,6 +72,7 @@ import type { AgentPromptPublisher, ExecutionInstallation, } from "@executablemd/core/host"; +import type { ReplWaits } from "./lifecycle.ts"; import { DurableContext } from "@executablemd/durable-streams"; import type { DurableEvent } from "@executablemd/durable-streams"; @@ -426,7 +427,18 @@ function remove(attachment: Attachment, request: LiveRequest): void { * so no one is woken. No teardown path appends a record, writes an audit or * closes a coroutine. */ -export function useReplAgent(mode: PermissionMode): Operation { +export function useReplAgent( + mode: PermissionMode, + /** + * Where a pending request says the element asking for it is waiting, or none. + * + * Optional because the authority is complete without it: counting a wait is + * something a reading wants, not something deciding a permission needs. A + * kernel given none counts nothing, which is what an execution with no + * session reading behaves like. + */ + waits?: ReplWaits, +): Operation { return resource(function* (provide) { const changes = createSignal(); /** @@ -642,6 +654,15 @@ export function useReplAgent(mode: PermissionMode): Operation { // Decided before anything is published: an unowned request publishes no // reading and no key, and never becomes a denial. const held = owner(attachment, yield* currentCoroutine()); + // The element this request is being asked on behalf of is waiting from + // here until somebody answers. Released in `ensure`, so abandoning the + // request at teardown releases the wait without inventing a decision — + // and so a request that is never answered leaves no element reading as + // waiting after its scope has gone. + const release = waits === undefined ? undefined : yield* waits.hold("permission"); + if (release !== undefined) { + yield* ensure(release); + } return yield* action(function (resolve) { let settled = false; const live: LiveRequest = { diff --git a/packages/cli/src/repl/fitting.ts b/packages/cli/src/repl/fitting.ts index ab28c1830..d26575cef 100644 --- a/packages/cli/src/repl/fitting.ts +++ b/packages/cli/src/repl/fitting.ts @@ -72,6 +72,20 @@ export interface ReplPreparedRow { readonly continuation: boolean; readonly rail: ReplReadingLine["rail"]; readonly depth: number; + /** + * How far this row is set in from the start of the content region. + * + * The nesting depth's own indent, and on a continuation the leading + * whitespace of the logical line it continues as well — so a line that + * wrapped is still read at the column it was written at. Without it a + * continuation sits further left than the row above it and reads as a new, + * shallower line, which is a claim about structure that the source does not + * make. + * + * Display only. No source byte and no offset moves, and concatenating a + * line's rows still recovers exactly its text. + */ + readonly indent: number; /** Present on a logical line's first row only. */ readonly badge: readonly ReplTokenRun[] | undefined; readonly style: ReplReadingLine["style"]; @@ -235,7 +249,7 @@ export function* prepareReading( const rows: ReplPreparedRow[] = []; for (const [index, one] of cut.entries()) { const width = measured.value[index]; - const indent = Math.min(one.depth * 2, Math.max(0, reservation.content - 1)); + const indent = Math.min(one.depth * 2 + one.indent, Math.max(0, reservation.content - 1)); if (width > reservation.content - indent) { return Err( new ReplFitRefusal( @@ -258,24 +272,31 @@ function* fitLine( // A blank line is a row. Measuring it would ask the engine the width of // nothing, and dropping it would edit the shape of somebody's document. if (line.text.length === 0) { - return Ok([row(line, "", 0, false)]); + return Ok([row(line, "", 0, false, 0)]); } const whole = yield* widths(renderer, size, [line.text]); if (!whole.ok) { return whole; } if (whole.value[0] <= room) { - return Ok([row(line, line.text, 0, false)]); + return Ok([row(line, line.text, 0, false, 0)]); } + // Where this line begins, so its continuations begin there too. Bounded well + // inside the region: an indent that left no room for text would make a row + // that consumes nothing, and this loop would not terminate. + const hanging = Math.min( + line.text.length - line.text.trimStart().length, + Math.max(0, Math.floor(room / 2)), + ); const rows: ReplPreparedRow[] = []; let at = 0; while (at < line.text.length) { const rest = line.text.slice(at); - const cut = yield* cutAt(renderer, size, rest, room); + const cut = yield* cutAt(renderer, size, rest, at > 0 ? room - hanging : room); if (!cut.ok) { return cut; } - rows.push(row(line, rest.slice(0, cut.value), at, at > 0)); + rows.push(row(line, rest.slice(0, cut.value), at, at > 0, hanging)); at += cut.value; } return Ok(Object.freeze(rows)); @@ -377,11 +398,13 @@ function row( shown: string, from: number, continuation: boolean, + hanging: number, ): ReplPreparedRow { return Object.freeze({ // Replaced by the engine's answer for this exact row before the reading is // returned; nothing reads it in between. width: 0, + indent: continuation ? hanging : 0, key: continuation ? `${line.key}+${from}` : line.key, text: shown, runs: slicedRuns(line.runs, from, from + shown.length), @@ -437,7 +460,7 @@ export function readingRuns( one: ReplPreparedRow, ): readonly ReplTokenRun[] { const { reservation } = prepared; - const indent = Math.min(one.depth * 2, Math.max(0, reservation.content - 1)); + const indent = Math.min(one.depth * 2 + one.indent, Math.max(0, reservation.content - 1)); const parts: { readonly text: string; readonly token: ReplTokenRun["token"] }[] = [ { text: RAIL, token: one.rail }, { text: SEPARATOR, token: "punctuation" }, diff --git a/packages/cli/src/repl/session.ts b/packages/cli/src/repl/session.ts index 229b6bb67..7f577d388 100644 --- a/packages/cli/src/repl/session.ts +++ b/packages/cli/src/repl/session.ts @@ -455,7 +455,7 @@ function* start( // middleware it owns belongs to this session's scope and dies with it. An // execution elsewhere would otherwise inherit an observer watching for a // session that is gone. - const agent = yield* useReplAgent(permissionMode ?? "deny-all"); + const agent = yield* useReplAgent(permissionMode ?? "deny-all", lifecycle); // The scope every entry task is started in. One session, one owner: a task // started anywhere else would outlive the observer and the kernels it // reports through. diff --git a/packages/cli/src/repl/source-reading.ts b/packages/cli/src/repl/source-reading.ts index bccafee5c..00f4bc747 100644 --- a/packages/cli/src/repl/source-reading.ts +++ b/packages/cli/src/repl/source-reading.ts @@ -415,7 +415,40 @@ class Build { depth: number, prefix: string, ): void { - const observed = this.#observed(element, owner, generated); + // One reading per actual call, in the order they were observed, each in + // its own source group. An element nothing was observed of is read once + // and unobserved, which is the same shape with no call in it. + const calls = this.#occurrences(element, owner, generated); + if (calls.length === 0) { + this.#call(text, elements, element, owner, generated, depth, prefix, undefined); + return; + } + for (const [index, one] of calls.entries()) { + this.#call( + text, + elements, + element, + owner, + generated, + depth, + calls.length === 1 ? prefix : `${prefix}@${index}`, + one, + ); + } + } + + /** One call of one element, as its delimiters and what they enclose. */ + #call( + text: string, + elements: readonly SourceElement[], + element: SourceElement, + owner: ReplScope | undefined, + generated: string | undefined, + depth: number, + prefix: string, + call: ReplOccurrence | undefined, + ): void { + const observed = this.#observed(call); // A self-closing element has one delimiter, so whatever would have been // said beside its closing tag is said beside the only tag it has. Dropping // it would leave an element that plainly settled reading as unobserved. @@ -551,12 +584,7 @@ class Build { * observations at all, so every element in it reads as unobserved — which is * the truth: static syntax does not prove execution. */ - #observed( - element: SourceElement, - owner: ReplScope | undefined, - generated: string | undefined, - ): Observation { - const one = this.#occurrence(element, owner, generated); + #observed(one: ReplOccurrence | undefined): Observation { if (one === undefined) { return UNOBSERVED; } @@ -590,17 +618,26 @@ class Build { } } - #occurrence( + /** + * Every call of this element, in the order they were observed. + * + * A document that writes one element inside a ``, or writes the same + * element twice, produces several *calls* of it at one source position. Each + * is its own reading: showing only the last would say the earlier ones never + * happened, and showing one badge for all of them would say several calls + * were one. + */ + #occurrences( element: SourceElement, owner: ReplScope | undefined, generated: string | undefined, - ): ReplOccurrence | undefined { + ): readonly ReplOccurrence[] { const { lifecycle, entry } = this.#request; if (lifecycle.entry !== entry.key) { - return undefined; + return []; } const path = owner?.path; - let found: ReplOccurrence | undefined; + const found: ReplOccurrence[] = []; for (const one of lifecycle.occurrences) { const position = one.position; if (position === undefined || position.offset !== element.opening.start) { @@ -612,10 +649,7 @@ class Build { if (generated === undefined && path !== undefined && position.path !== path) { continue; } - // Several calls of one authored element share its position. The reading - // shown beside the source a reader is looking at is the one that is - // happening now, which is the last observed. - found = one; + found.push(one); } return found; } diff --git a/packages/cli/tests/repl-agent-execution.test.ts b/packages/cli/tests/repl-agent-execution.test.ts index 0ff0936ec..eff91a92f 100644 --- a/packages/cli/tests/repl-agent-execution.test.ts +++ b/packages/cli/tests/repl-agent-execution.test.ts @@ -1163,6 +1163,67 @@ describe("P1 — exact policy and per-turn suspension", () => { }); }); +describe("L2 — a pending permission is a waiting element (#881 PR 2)", () => { + beforeAll(() => useTempFileCompiler()); + + it("L2: the element the request was asked on behalf of is waiting, and stops when it is answered", function* () { + const stub = createStub({ + one: { permission: { toolCallId: "call-1", kind: "execute" }, deltas: ["reply"] }, + }); + yield* useStub(stub); + const holder = execution(); + const session = opened(yield* start(holder, ONE_PROMPT, "approve-reads")); + + yield* spawn(function* () { + yield* reported(session, "a pending request", (reading) => reading.requests.length === 1); + const pending = session.agent.requests[0]!; + + // The waiting is counted on the element the request was asked inside — + // the `` whose turn owns it — and not on the session. A reading + // that said "busy" would name every element here. + const waiting = session.lifecycle.occurrences.filter((one) => one.waiting.length > 0); + expect(waiting.map((one) => `${one.name}:${one.waiting.join()}`)).toEqual([ + "Prompt:permission", + ]); + + // Answering it releases that element and nothing else. + expect(session.permissions.choose(pending.key, "once")).toBe(true); + yield* sleep(0); + expect(session.lifecycle.occurrences.filter((one) => one.waiting.length > 0)).toEqual([]); + }); + + const outcome = yield* session.join(); + expect(outcome.ok).toBe(true); + // And the reading goes with the entry, the way every other one does. + yield* sleep(0); + expect(session.lifecycle.occurrences).toEqual([]); + }); + + it("L2: a request abandoned at teardown releases its wait without deciding anything", function* () { + const stub = createStub({ + one: { permission: { toolCallId: "call-1", kind: "execute" }, deltas: ["reply"] }, + }); + yield* useStub(stub); + const holder = execution(); + // Held inside a scope of its own, so leaving the scope is the teardown. + const left = yield* scoped(function* () { + const session = opened(yield* start(holder, ONE_PROMPT, "approve-reads")); + yield* reported(session, "a pending request", (reading) => reading.requests.length === 1); + expect(session.lifecycle.occurrences.some((one) => one.waiting.includes("permission"))).toBe( + true, + ); + // Nobody answers. + return session; + }); + yield* sleep(0); + // The scope went away and took the reading with it. No decision was + // invented on the way out: a denial recorded here would be a decision + // nobody made. + expect(left.lifecycle.occurrences).toEqual([]); + expect(stub.outcomes.get("call-1")).toBe(undefined); + }); +}); + describe("P2 — one live request, one direct settlement", () => { beforeAll(() => useTempFileCompiler()); diff --git a/packages/cli/tests/repl-source-reading.test.ts b/packages/cli/tests/repl-source-reading.test.ts index 633455935..6a484ccaa 100644 --- a/packages/cli/tests/repl-source-reading.test.ts +++ b/packages/cli/tests/repl-source-reading.test.ts @@ -401,6 +401,45 @@ describe("the reading one entry is shown as", () => { })); } + it("sets a continuation in to the column its own line was written at", () => + withRenderer(function* (renderer) { + // An indented line, long enough to wrap. Its continuations have to + // start where it started: a continuation further left than the row it + // continues reads as a new, shallower line, which is a claim about + // structure the source does not make. + const indented = + " " + + "an indented line of prose, written long enough that it cannot be held on one row"; + const reading = entryReading({ + entry: entryOf(indented + "\n"), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + const prepared = yield* prepareReading(renderer, WIDE, reading.source.lines, 56); + expect(prepared.ok).toBe(true); + if (!prepared.ok) { + return; + } + const rows = prepared.value.rows; + expect(rows.length).toBeGreaterThan(1); + // The first row carries the source's own whitespace in its text; each + // continuation carries the same amount as a display indent instead. + expect(rows[0].indent).toBe(0); + for (const row of rows.slice(1)) { + expect(row.indent).toBe(6); + } + // Each composed row therefore begins its text at the same column. + const columns = rows.map((one) => { + const whole = runText(readingRuns(prepared.value, one)); + return whole.length - whole.trimStart().length; + }); + expect(new Set(columns).size).toBe(1); + // And the line is still recoverable exactly: the indent is display, + // and no source byte moved. + expect(recovered(prepared.value).get(reading.source.lines[0].key)).toBe(indented); + })); + it("never measures a row wider than the region it was cut for", () => withRenderer(function* (renderer) { const reading = entryReading({ @@ -749,6 +788,43 @@ describe("the reading one entry is shown as", () => { } }); + it("gives each call of one element its own reading, in its own source group", function* () { + // Two calls of one authored element — what a `` produces. Showing + // only the last would say the first never happened, and one badge for both + // would say two calls were one. + const source = '\n'; + const reading = entryReading({ + entry: entryOf(source), + lifecycle: observing([ + { key: "entry-1#1", name: "Step", position: at(0), phase: "settled" }, + { key: "entry-1#2", name: "Step", position: at(0), phase: "active" }, + ]), + live: "", + inspected: false, + }); + const rows = reading.source.lines.filter((one) => one.text.includes(" runText(one.badge ?? []))).toEqual([ + `${LIFECYCLE.settled.glyph} ${LIFECYCLE.settled.word}`, + `${LIFECYCLE.active.glyph} ${LIFECYCLE.active.word}`, + ]); + // And each is its own group: two rows, two keys, two rails. + expect(new Set(rows.map((one) => one.key)).size).toBe(2); + expect(rows.map((one) => one.rail)).toEqual(["rail-settled", "rail-active"]); + }); + + it("reads an element nothing was observed of exactly once", function* () { + const source = '\n'; + const reading = entryReading({ + entry: entryOf(source), + lifecycle: NO_LIFECYCLE, + live: "", + inspected: false, + }); + expect(reading.source.lines.filter((one) => one.text.includes(" withRenderer(function* (renderer) { const source = '\n\n'; diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts index 9579245ab..eb742dbd1 100644 --- a/packages/core/tests/component-expansion.test.ts +++ b/packages/core/tests/component-expansion.test.ts @@ -340,6 +340,145 @@ describe("Tier CX — what surrounds one expansion", () => { expect(observed.report).toBe(unobserved); }); + it("CX3: an observed run writes the same Journal bytes as an unobserved one", function* () { + // The strongest statement of inertness this tier can make: not that the + // screen agreed, but that the record did. A run watched through the public + // chain must serialize byte for byte as the same run watched by nobody — + // otherwise observation is a participant in what the execution durably + // said, however carefully it declines to be one everywhere else. + const source = [ + '1 + 1', + "", + "", + "", + "", + "", + ].join("\n"); + const definitions = { + Hello: component("Hello", function* () { + return "hi"; + }), + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }; + const journal = function* (observe: boolean): Operation { + const written: string[] = []; + const run = yield* scoped(function* () { + const env: EvalEnv = { values: {} }; + yield* Component.around({ env: () => env }, { at: "min" }); + yield* Component.around( + { + // deno-lint-ignore require-yield + *importComponent([name]) { + const definition = definitions[name as keyof typeof definitions]; + if (!definition) { + throw new Error(`no component ${name}`); + } + return definition; + }, + }, + { at: "min" }, + ); + // What this run durably said, in the order it said it: every element + // the public chain carried, with the identity and position the record + // would have been written under. + yield* Component.around({ + *expand([request], next) { + written.push( + JSON.stringify({ + id: request.expansion.id, + name: request.expansion.name, + position: request.expansion.position ?? null, + }), + ); + if (!observe) { + yield* next(request); + return; + } + const owner: Scope = yield* useScope(); + owner.run(function* () { + for (const _ of yield* each(request.phases)) { + yield* each.next(); + } + }); + yield* next(request); + }, + }); + try { + return renderSegments(yield* expandSegments(scanSegments(source), {}, {}, new Set())); + } catch (error) { + return String(error); + } + }); + yield* sleep(0); + return JSON.stringify({ run, written }); + }; + expect(yield* journal(true)).toBe(yield* journal(false)); + }); + + it("CX4: a reader that never finishes reading delays nothing", function* () { + // A subscriber that takes its first phase and then stops asking. The + // execution must not be waiting on it: the element completes, the document + // renders, and the reader is simply behind. + let taken = 0; + const observed = yield* watch( + "\n", + { + Slow: component("Slow", function* () { + return "done"; + }), + }, + function* (request, next, read, owner) { + read(() => {}); + owner.run(function* () { + // One phase, then never `each.next()` again. + for (const _ of yield* each(request.phases)) { + taken += 1; + yield* sleep(50_000); + yield* each.next(); + } + }); + yield* next(request); + }, + ); + expect(observed.rendered.trim()).toBe("done"); + expect(observed.failure).toBe(undefined); + // It really did start reading, so this is a slow reader rather than none. + expect(taken).toBe(1); + // And the element finished regardless, which is what the whole sequence a + // *working* reader saw shows. + const phases = observed.watched.seen.get(observed.watched.requests[0].expansion.id) ?? []; + expect(phases[phases.length - 1]?.phase).toBe("complete"); + }); + + it("CX4: a reader whose scope is cancelled cancels nothing", function* () { + // The reader is torn down while the element is still expanding. Nothing + // about the execution may notice: it renders, it completes, and the + // registration that went away leaves no gap behind it. + const observed = yield* watch( + "\n", + { + Steady: component("Steady", function* () { + return "steady"; + }), + }, + function* (request, next, _read, owner) { + const reader = owner.run(function* () { + for (const _ of yield* each(request.phases)) { + yield* each.next(); + } + }); + yield* reader.halt(); + yield* next(request); + }, + ); + expect(observed.rendered.trim()).toBe("steady"); + expect(observed.failure).toBe(undefined); + const phases = observed.watched.seen.get(observed.watched.requests[0].expansion.id) ?? []; + expect(phases.map((one) => one.phase)).toContain("complete"); + }); + it("CX1: structural work crosses the seam once, and only where it runs", function* () { const source = [ '', diff --git a/specs/repl-spec.md b/specs/repl-spec.md index 06cb658a3..aed575814 100644 --- a/specs/repl-spec.md +++ b/specs/repl-spec.md @@ -607,9 +607,10 @@ that is where it is — a component with a destructor has not finished until the destructor has. Waiting is counted, not guessed. An element waits when something it is actually -waiting on says so: a question nobody has answered, a permission request -attributed to the turn that asked for it, a hold the expansion controller is -keeping. Each of those removes itself when it resolves, opening and closing a +waiting on says so: a question nobody has answered, a permission request the +turn that asked for it owns, a hold the expansion controller is keeping. A +request nobody answers releases its wait when its scope goes, and decides +nothing on the way out. Each of those removes itself when it resolves, opening and closing a drawer changes none of them, and ordinary suspension is not waiting at all. Two questions at once are two waiting elements rather than one screen that is busy. @@ -650,7 +651,13 @@ element, not two phases. Nesting comes from where the delimiters are, and from nothing else. An element whose span lies inside another's is that one's child; one that merely follows it -is its sibling. Source nothing has been observed in gets the rail that means +is its sibling. + +A document that writes one element inside a ``, or writes the same element +twice, makes several *calls* of it at one position. Each is its own reading, in +its own group, in the order they were observed: showing only the last would say +the earlier ones never happened, and one badge for all of them would say several +calls were one. An element nothing was observed of is read once, unobserved. Source nothing has been observed in gets the rail that means exactly that, and acquires no phase from retained syntax. An `` that admitted a generated fragment shows that fragment where its @@ -674,7 +681,9 @@ character. A line too long for its region is wrapped at the last word boundary that fits, and a word longer than the region is broken at the longest grapheme that fits. Whitespace is kept where it was typed, blank lines stay rows, and concatenating -one line's rows recovers exactly the line. The rail, the gap after it and the +one line's rows recovers exactly the line. A continuation is set in to the +column its own line was written at, so a wrapped line is still read at its own +depth; that indent is display, and no source byte or offset moves with it. The rail, the gap after it and the status column are reserved first, from measurements rather than character counts, and the column is wide enough for every reading a badge can hold — including a cleanup wait, which says two things at once — so an element From 7f185e4f687f03c760d90e93be683f7e84c20eae Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 08:43:22 -0400 Subject: [PATCH 11/19] =?UTF-8?q?=F0=9F=9A=A7=20Finish=20C2=20and=20L3's?= =?UTF-8?q?=20ordering,=20and=20correct=20a=20claim=20that=20was=20wrong?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **C2's remaining rows.** An import that returned is not an element that finished: while the body is held the element is entered and has no terminal phase at all. A printed failure — a return the schema refuses, or a body whose component prints its own errors — completes `Ok` and puts the problem in the document, which is the frozen "preserve printed semantic failure" and exactly why a reading takes its outcome from the phase and never from the prose. Recovering a child's failure does not fail the parent, with the unrecovered case beside it so the assertion is not about a parent that can never fail. COMPLETE follows the whole dispatch, stated as the thing that ordering decides: a subscription on the handler's own frame never sees it and one on an owner that outlives the dispatch does. Three of those four assertions were first written as guesses and two were backwards. A probe against the real engine replaced them: the product completes a printed failure `Ok`, and the drain order of an asynchronous consumer cannot witness a publication order. **L3's ordering.** An installation of the entry's own reads, at the moment it is released, what the session was still saying about itself — so the claim that everything the entry held comes down before `live = false` and the ready wake is observed rather than read off the comment that states it. Plus the wake arriving with no input, and a late update failing to revive a reading the entry took. **A correction.** The last handback reported that a fence-admitted generated fragment's source is not substituted. There is no such fragment: `components/Evaluate.ts` is the only caller of the generated-XMD admission, so `` is the only element that makes one and the frozen rule covers every admission there is. The claim is withdrawn, not explained. K9 joins the controls: say the entry is not live before releasing what it held, and L3's ordering case fails. All nine break and restore byte-identically. The frozen focused command, run exactly as written: Core 53 / 411 steps, CLI 94 / 313, both exit 0. `repl-lifecycle` and `repl-agent-execution` are reported separately at 14 / 52 rather than folded into it. --- .controls.json | 139 +++++++++++++ packages/cli/tests/repl-lifecycle.test.ts | 67 ++++++- .../core/tests/component-expansion.test.ts | 186 +++++++++++++++++- 3 files changed, 390 insertions(+), 2 deletions(-) create mode 100644 .controls.json diff --git a/.controls.json b/.controls.json new file mode 100644 index 000000000..56a23ede7 --- /dev/null +++ b/.controls.json @@ -0,0 +1,139 @@ +[ + { + "id": "K1-rails", + "says": "remove the rails", + "file": "packages/cli/src/repl/source-reading.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (62ms)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "restored": true + }, + { + "id": "K2-badges", + "says": "remove the lifecycle glyphs and words", + "file": "packages/cli/src/repl/source-reading.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts", + "packages/cli/tests/repl-presentation-style.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 12 passed (65 steps) | 1 failed (9 steps) (1s)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "restored": true + }, + { + "id": "K3-appended", + "says": "append the generated source instead of replacing the producer", + "file": "packages/cli/src/repl/source-reading.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (67ms)", + "firstFailure": "error: Error: expect(received).not.toContain(expected) // indexOf", + "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "restored": true + }, + { + "id": "K4-clipped", + "says": "clip the last wrapped row instead of keeping it", + "file": "packages/cli/src/repl/fitting.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts", + "packages/cli/tests/repl-presentation-style.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 11 passed (67 steps) | 2 failed (7 steps) (1s)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", + "bytesAfter": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", + "restored": true + }, + { + "id": "K5-rescued", + "says": "rescue a caught canonical failure instead of reporting it", + "file": "packages/core/src/component-expansion.ts", + "suites": [ + "packages/core/tests/component-expansion.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (19 steps) | 1 failed (3 steps) (208ms)", + "firstFailure": "error: Error: expect(received).toContain(expected) // indexOf", + "bytesBefore": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", + "bytesAfter": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", + "restored": true + }, + { + "id": "K6-unheld", + "says": "let a pending permission request count no wait", + "file": "packages/cli/src/repl/agent.ts", + "suites": [ + "packages/cli/tests/repl-agent-execution.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 12 passed (42 steps) | 1 failed (2 steps) (1s)", + "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", + "bytesBefore": "1a0102d6abe95a8f722e7e9dd31bc0dd5527992423410ba74af9282ec933ef54", + "bytesAfter": "1a0102d6abe95a8f722e7e9dd31bc0dd5527992423410ba74af9282ec933ef54", + "restored": true + }, + { + "id": "K7-collapsed", + "says": "read only the last call of a repeated element", + "file": "packages/cli/src/repl/source-reading.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (68ms)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", + "restored": true + }, + { + "id": "K8-unindented", + "says": "start a continuation at the margin instead of its own column", + "file": "packages/cli/src/repl/fitting.ts", + "suites": [ + "packages/cli/tests/repl-source-reading.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (73ms)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", + "bytesAfter": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", + "restored": true + }, + { + "id": "K9-early-liveness", + "says": "say the entry is not live before releasing what it held", + "file": "packages/cli/src/repl/session.ts", + "suites": [ + "packages/cli/tests/repl-lifecycle.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (270ms)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", + "bytesAfter": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", + "restored": true + } +] diff --git a/packages/cli/tests/repl-lifecycle.test.ts b/packages/cli/tests/repl-lifecycle.test.ts index 5256a673d..c04563e70 100644 --- a/packages/cli/tests/repl-lifecycle.test.ts +++ b/packages/cli/tests/repl-lifecycle.test.ts @@ -12,7 +12,7 @@ import { beforeAll, describe, it } from "@executablemd/test-support/bdd"; import { expect } from "@executablemd/test-support/expect"; import { useTempFileCompiler } from "@executablemd/core"; import { InMemoryStream } from "@executablemd/durable-streams"; -import { each, scoped, sleep, spawn } from "effection"; +import { each, ensure, scoped, sleep, spawn } from "effection"; import type { Operation, Result } from "effection"; import { openReplSession } from "../src/repl/session.ts"; @@ -182,6 +182,71 @@ describe("Tier L — the reading one entry leaves behind", () => { }); }); + it("L3: everything this entry held is released before the session says it is not live", function* () { + // The frozen ordering, observed rather than read off the comment that + // states it. An installation of this entry's own records, at the moment it + // is released, what the session was still saying about itself. If the + // liveness finalizer had been registered after the things this entry + // acquires, it would run before them and this would read `false` — and a + // reader woken then would be told the entry was over while its provider, + // its middleware and its Agent attachment were still standing. + yield* scoped(function* () { + let liveWhenReleased: boolean | undefined; + let released = false; + const session = opened( + yield* openReplSession({ + execution: execution(), + installations: [ + { + *install(): Operation { + yield* ensure(() => { + released = true; + liveWhenReleased = session.live; + }); + }, + }, + ], + }), + ); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + // The installation really was released, so this is an ordering rather + // than an assertion about something that never ran. + expect(released).toBe(true); + expect(liveWhenReleased).toBe(true); + // And by now the session says what it is. + expect(session.live).toBe(false); + // The wake arrived with no input: nothing was typed, nothing activated, + // and a reader waiting for the entry to end was still told. + expect(watched.readings.length).toBeGreaterThan(0); + expect(watched.readings[watched.readings.length - 1].occurrences).toEqual([]); + expect(watched.readings[watched.readings.length - 1].entry).toBe(undefined); + }); + }); + + it("L3: a late producer update cannot revive a reading the entry took with it", function* () { + yield* scoped(function* () { + const session = opened(yield* openReplSession({ execution: execution() })); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + expect(session.lifecycle.occurrences).toEqual([]); + + // Whatever is still draining from the entry that closed — a terminal + // phase published as its dispatch unwound — arrives after the generation + // it belonged to is gone, and is refused by generation rather than + // appended to nothing. + for (let turn = 0; turn < 5; turn += 1) { + yield* sleep(0); + } + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.lifecycle.entry).toBe(undefined); + }); + }); + it("L3: observing changes neither the outcome nor what the document rendered", function* () { const source = '\n'; const rendered: string[] = []; diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts index eb742dbd1..679176ba1 100644 --- a/packages/core/tests/component-expansion.test.ts +++ b/packages/core/tests/component-expansion.test.ts @@ -12,10 +12,11 @@ import { describe, it } from "@executablemd/test-support/bdd"; import { expect } from "@executablemd/test-support/expect"; -import { each, ensure, scoped, sleep, useScope, withResolvers } from "effection"; +import { each, ensure, scoped, sleep, spawn, useScope, withResolvers } from "effection"; import type { Scope } from "effection"; import type { Operation } from "effection"; import { Component } from "../src/component-api.ts"; +import { printErrors } from "../src/component-failures.ts"; import type { ComponentExpansionPhase, ComponentExpansionRequest } from "../src/component-api.ts"; import { expandSegments } from "../src/expand.ts"; import { renderSegments } from "../src/render.ts"; @@ -340,6 +341,189 @@ describe("Tier CX — what surrounds one expansion", () => { expect(observed.report).toBe(unobserved); }); + it("CX2: an import that returned is not an element that finished", function* () { + // The whole of C2's claim in one shape: the import resolving is not the + // element settling. While the body is held the element is entered and has + // no terminal phase at all — a reading that completed it here would say + // the run was over when its work had not started. + const holding = withResolvers(); + const started = withResolvers(); + const whileHeld: string[] = []; + const observed = yield* watch( + "\n", + { + Held: component("Held", function* () { + started.resolve(); + yield* holding.operation; + return "let go"; + }), + }, + function* (request, next, read, owner) { + read((phase) => whileHeld.push(phase.phase)); + owner.run(function* () { + // The body has begun, so the import has already returned. + yield* started.operation; + yield* sleep(0); + holding.resolve(); + }); + yield* next(request); + }, + ); + expect(observed.rendered.trim()).toBe("let go"); + // Nothing terminal had been published while the body was held. + const held = whileHeld.slice(0, whileHeld.indexOf("exit")); + expect(held).toContain("enter"); + expect(held).not.toContain("complete"); + expect(held).not.toContain("cancelled"); + // And the element did finish, once its body did. + const phases = observed.watched.seen.get(observed.watched.requests[0].expansion.id) ?? []; + expect(phases[phases.length - 1]?.phase).toBe("complete"); + }); + + it("CX2: a printed failure completes the element Ok, and says so in the document", function* () { + // Two ways a failure is reported as content rather than raised: a return + // the schema refuses, and a body whose component prints its own errors. + // Both complete `Ok` — the element did not fail the *run*, it reported a + // problem as text — and both put the problem in the document. + // + // This is the frozen "preserve printed semantic failure", and it is why a + // reading takes an outcome from the phase and never from the prose: the + // text here says ERROR and the answer is success, which is exactly the + // pair a reading that read the words would get backwards. + const cases: readonly { + readonly source: string; + readonly said: string; + readonly definitions: Record; + }[] = [ + { + source: '\n', + said: "Return validation failed", + definitions: { + Wrong: { + kind: "function" as const, + name: "Wrong", + props: NO_PROPS, + returns: { type: "number" }, + // deno-lint-ignore require-yield + *fn() { + return "not a number"; + }, + }, + }, + }, + { + source: "\n", + said: "printed, not thrown", + definitions: { + Shown: { + kind: "function" as const, + name: "Shown", + props: NO_PROPS, + fn: printErrors(function* () { + throw new Error("printed, not thrown"); + }), + }, + }, + }, + ]; + for (const one of cases) { + const observed = yield* watch(one.source, one.definitions); + // Nothing propagated out of the document. + expect([one.said, observed.failure]).toEqual([one.said, undefined]); + expect(observed.rendered).toContain(one.said); + const phases = observed.watched.seen.get(observed.watched.requests[0].expansion.id) ?? []; + const terminal = phases[phases.length - 1]; + expect([one.said, terminal?.phase]).toEqual([one.said, "complete"]); + expect([one.said, terminal?.phase === "complete" && terminal.result.ok]).toEqual([ + one.said, + true, + ]); + // And it did pass through EXIT on the way, having returned. + expect([one.said, phases.map((phase) => phase.phase)]).toEqual([ + one.said, + ["enter", "active", "exit", "complete"], + ]); + } + }); + + it("CX2: recovering a child's failure does not fail the parent", function* () { + const definitions = { + Boom: component("Boom", function* () { + throw new Error("the child said no"); + }), + }; + const outcome = ( + observed: { readonly watched: Watched }, + name: string, + ): boolean | undefined => { + const request = observed.watched.requests.find((one) => one.expansion.name === name); + const phases = observed.watched.seen.get(request?.expansion.id ?? "") ?? []; + const terminal = phases[phases.length - 1]; + return terminal?.phase === "complete" ? terminal.result.ok : undefined; + }; + + // Recovered: the region continues past the child's failure, so the parent + // that encloses it returned and completes Ok. + const recovered = yield* watch( + "\n\n\n\n\n", + definitions, + ); + expect(recovered.failure).toBe(undefined); + expect(recovered.rendered).toContain("the child said no"); + expect(outcome(recovered, "If")).toBe(true); + + // The control, in the same case: with nothing recovering it, the same + // child failure does reach the same parent. Without this the assertion + // above would pass for a parent that can never fail. + const unrecovered = yield* watch("\n\n\n", definitions); + expect(unrecovered.failure).not.toBe(undefined); + expect(outcome(unrecovered, "If")).toBe(false); + }); + + it("CX2: COMPLETE follows the whole dispatch, so a handler cannot be its reader", function* () { + // The frozen ordering, stated as the thing it decides. A subscription + // spawned on the handler's own frame is torn down when that frame unwinds + // — which happens *before* completion is published, because completion + // waits for the whole dispatch, this handler's own cleanup included. One + // on an owner that outlives the dispatch is told. + // + // Asserted as the difference between the two readers rather than as a + // timestamp: both read the same stream, and only the placement differs. + const onFrame: string[] = []; + const onOwner: string[] = []; + const observed = yield* watch( + "\n", + { + Plain: component("Plain", function* () { + return "done"; + }), + }, + function* (request, next, _read, owner) { + // This frame's own reader. + yield* spawn(function* () { + for (const phase of yield* each(request.phases)) { + onFrame.push(phase.phase); + yield* each.next(); + } + }); + // A reader that outlives the dispatch. + owner.run(function* () { + for (const phase of yield* each(request.phases)) { + onOwner.push(phase.phase); + yield* each.next(); + } + }); + yield* next(request); + }, + ); + expect(observed.rendered.trim()).toBe("done"); + expect(onOwner).toContain("complete"); + expect(onFrame).not.toContain("complete"); + // The frame's reader did run — this is a reader that died, not one that + // never started. + expect(onFrame).toContain("enter"); + }); + it("CX3: an observed run writes the same Journal bytes as an unobserved one", function* () { // The strongest statement of inertness this tier can make: not that the // screen agreed, but that the record did. A run watched through the public From ce0ce3a671bcac9197beee78d5f57c0108279369 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 08:58:11 -0400 Subject: [PATCH 12/19] =?UTF-8?q?=F0=9F=9A=A7=20Give=20the=20narrow=20outl?= =?UTF-8?q?et=20the=20reading=20it=20routes=20a=20reader=20to?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Entries surface is the catalog *and* the reading of the entry it has selected. A narrow frame has one column for both, so both are in it: the catalog takes its own height while it fits and its share when it does not — exactly the rule the sidebar already uses — and the reading takes what is left. This is not a routing change. Which surface a narrow frame shows is still the route's, and the footer still keeps its seven rows. What changes is that the Entries outlet shows what the Entries surface *is*: routing a reader to the surface their entry is on and then showing them nothing of it was the defect, and every 72×20 capture in the gallery showed it. `UI13` now asserts the reading is placed at all three profiles, in whichever region the profile has for it — `content` at narrow, `transcript` above it. Its old narrow leg asserted the opposite, that no row is placed there at all; that premise is what this replaces, and the claim it was making (the reason is drawn inside its own region, footer untouched) is unchanged and now made at every size rather than two. `TL6` skips a covered line that is only a window-control label. Both the outlet and the drawer spell `[^ earlier]` the same way, so finding one inside the drawer's rectangle says the drawer has its own rather than that something behind it showed through — a false positive this slice created by giving narrow a second pair of controls, not a coverage defect. K10 joins the controls: route a narrow frame to Entries and show it no reading. All ten break and restore byte-identically. Frozen focused command as written: Core 53 / 411, CLI 94 / 313, both exit 0; `repl-lifecycle` + `repl-agent-execution` beside it at 14 / 52. --- .controls.json | 25 ++++++++++++---- packages/cli/src/repl/application.ts | 38 +++++++++++++++++++------ packages/cli/tests/repl-entries.test.ts | 20 +++++++------ packages/cli/tests/repl-journey.test.ts | 9 +++++- specs/repl-spec.md | 7 ++++- 5 files changed, 75 insertions(+), 24 deletions(-) diff --git a/.controls.json b/.controls.json index 56a23ede7..65321706e 100644 --- a/.controls.json +++ b/.controls.json @@ -39,7 +39,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (67ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", "firstFailure": "error: Error: expect(received).not.toContain(expected) // indexOf", "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", @@ -70,7 +70,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (19 steps) | 1 failed (3 steps) (208ms)", + "summary": "FAILED | 0 passed (19 steps) | 1 failed (3 steps) (205ms)", "firstFailure": "error: Error: expect(received).toContain(expected) // indexOf", "bytesBefore": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", "bytesAfter": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", @@ -100,7 +100,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (68ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", @@ -115,7 +115,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (73ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (61ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", "bytesAfter": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", @@ -130,10 +130,25 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (270ms)", + "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (255ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", "bytesAfter": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", "restored": true + }, + { + "id": "K10-narrow-empty", + "says": "route a narrow frame to Entries and show it no reading", + "file": "packages/cli/src/repl/application.ts", + "suites": [ + "packages/cli/tests/repl-entries.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 18 passed (64 steps) | 1 failed (1 step) (1s)", + "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", + "bytesBefore": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", + "bytesAfter": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", + "restored": true } ] diff --git a/packages/cli/src/repl/application.ts b/packages/cli/src/repl/application.ts index f57fd128f..c9a6e31dc 100644 --- a/packages/cli/src/repl/application.ts +++ b/packages/cli/src/repl/application.ts @@ -2494,13 +2494,7 @@ function described(view: ReplView, context: ReplPresentationContext): DescribedS ), ); if (prepared !== undefined) { - // A narrow frame routes one outlet and has no transcript pane, so it has - // no window over this reading either. Its rows are described and placed - // nowhere, which is what the transcript's rows have always done at this - // size: the frame offers the reading, and the profile decides there is - // nowhere to put it. - const rows = readingRows(prepared); - items.push(...(narrow ? rows : shown(rows, context, READING_WINDOW))); + items.push(...shown(readingRows(prepared), context, READING_WINDOW)); } items.push( row( @@ -4586,10 +4580,38 @@ export function presentationFor( // every region would be a wide screen with the columns removed: the reader // would scroll past three lists to reach the one they asked for, and every // row of the other two would still be a target. + // + // The Entries surface is the catalog *and* the reading of whichever entry + // it has selected — the same two things the sidebar and the transcript are + // at a wider size, stacked because there is one column to put them in. A + // narrow frame that showed the catalog alone would route a reader to the + // surface their entry is on and then show them nothing of it. + // + // The catalog takes its own height while it fits and its share when it does + // not, exactly as it does in the sidebar; the reading takes what is left. const routed = view.state.route.surface === "sessions" ? listColumn("content", "sessions-fixed", "sessions", SESSIONS_WINDOW) - : listColumn("content", "entries-fixed", "entries", ENTRIES_WINDOW); + : [ + box({ + id: "box:content:entries", + region: "content", + props: stackProps(context.entriesRows === undefined ? sharedColumnRows(size) : "fit"), + children: listColumn( + "content", + "entries-fixed", + "entries", + ENTRIES_WINDOW, + context.entriesRows, + ), + }), + box({ + id: "box:content:reading", + region: "content", + props: stackProps("grow"), + children: listColumn("content", "reading-fixed", "reading", READING_WINDOW), + }), + ]; regions.push({ region: "content", id: "box:content" }); columns.push( box({ diff --git a/packages/cli/tests/repl-entries.test.ts b/packages/cli/tests/repl-entries.test.ts index 77a9eaad8..0a6838bf2 100644 --- a/packages/cli/tests/repl-entries.test.ts +++ b/packages/cli/tests/repl-entries.test.ts @@ -3348,18 +3348,20 @@ describe("REPL entries: what a failed entry says it failed with", () => { // The rail opens every reading row, so the reason is found by what the // row says rather than by what the row begins with. const failed = cells.find((cell) => cell.text.includes("failed: ")); - const region = frame.region("transcript"); + // The pane the reading is placed in at this size. A narrow frame routes + // one outlet and the Entries surface is it, so the reading is in + // `content` there and in `transcript` at the two wider profiles — the + // same claim about the same rows, in whichever region the profile has + // for them. + const region = frame.region("transcript") ?? frame.region("content"); if (region === undefined) { - // The narrow profile mounts one routed outlet, and the transcript is - // not one of them: `content` carries the navigation and whichever - // catalog the route chose. No transcript row is placed at this size at - // all, which is asserted rather than assumed — a reason that cannot be - // drawn cannot overflow, and a row claiming to measure one here would - // be measuring nothing. - expect([size.columns, cells.length]).toEqual([size.columns, 0]); - expect([size.columns, failed]).toEqual([size.columns, undefined]); + throw new Error(`the ${size.columns}-column frame placed the reading nowhere`); } else { + // Every profile places it, the narrow one included: routing a reader + // to the surface their entry is on and then showing them nothing of + // it is the defect this leg of the case exists for. + expect([size.columns, cells.length > 0]).toEqual([size.columns, true]); expect([size.columns, failed !== undefined]).toEqual([size.columns, true]); const drawn = failed?.bounds; // Inside its own region, by its own geometry: it starts where the diff --git a/packages/cli/tests/repl-journey.test.ts b/packages/cli/tests/repl-journey.test.ts index ea111bf03..b942b5740 100644 --- a/packages/cli/tests/repl-journey.test.ts +++ b/packages/cli/tests/repl-journey.test.ts @@ -3899,8 +3899,15 @@ describe("REPL journey: what an open drawer covers, through the terminal", () => // And none of the lines it covered is anywhere inside it. Read as cells // rather than as descriptions: the blank interior of a short modal line // is exactly where a drawer without a background lets text through. + // A window control the drawer offers *itself* cannot discriminate: both + // panes spell `[^ earlier]` and `[v later]` the same way, so finding one + // inside the rectangle says the drawer has its own, not that something + // behind it showed through. Narrow routes one outlet holding the catalog + // and the entry's reading, each with its own pair, so a fragment of one + // of those labels is now among the covered lines. + const shared = ["[\u2191 earlier]", "[\u2193 later]", "[close]"]; for (const line of covered.split("\n").map((one) => one.trim())) { - if (line.length < 4) { + if (line.length < 4 || shared.some((control) => control.includes(line))) { continue; } expect([label, line, inside.includes(line)]).toEqual([label, line, false]); diff --git a/specs/repl-spec.md b/specs/repl-spec.md index aed575814..dfbc057cc 100644 --- a/specs/repl-spec.md +++ b/specs/repl-spec.md @@ -623,7 +623,12 @@ written and something was recorded — never that anything is running now. ## One entry, read as output and then source The transcript pane holds one entry's reading: what it produced, and then the -source that produced it. The two share one vertical window, so going from an +source that produced it. A narrow frame has no transcript pane; its one routed +Entries outlet holds the catalog and the reading of the entry the catalog has +selected — the same two things the sidebar and the transcript are at a wider +size, stacked because there is one column for them. The catalog takes its own +height while it fits and its share when it does not, and the reading takes what +is left. The two share one vertical window, so going from an answer to the reason for it is one movement rather than two panes to reconcile. A reading belongs to an entry; with nothing selected it is the last entry the prefix admitted, which is what a one-entry execution has always shown. From 8c9543af5298952057034de679862301f1c28b57 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 10:39:00 -0400 Subject: [PATCH 13/19] =?UTF-8?q?=F0=9F=90=9B=20R1=E2=80=93R3=20from=20the?= =?UTF-8?q?=20Planner's=20independent=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **R1 — a terminal carried a request its invocation did not issue.** The brand check proved a request was Core's and unspent; nothing proved it was *this* element's. An authentic, unconsumed request from another live invocation, delegated through this one's `next`, reached the claim — it spent that element's one claim and ran this body, and the refusal that followed came after the effect. Each terminal now compares the delegated request with the one it issued, by identity, before the claim and before any body. The Planner's probe went from `bodies:["A"]` to `bodies:[]`. **R2 — the lexical envelope disagreed with the installed extractor**, and the assertion in `parseSource` turned that into a refusal of documents the engine accepts. I wrote the helper from the delimiter prose; the real rule came from comparing against `matter()` over twenty-four envelope shapes. A BOM is never body even with no header; an opener with no closing line consumes the whole text; a closing line *starts with* `---` and the body begins immediately after those three characters, plus one line ending if one is there. `SI2: an unterminated header is not a header` asserted the opposite of all of this and is corrected: that text is a header with no body, and its value parser refuses it outright, so inspection claiming an executable element inside a document nothing will run was the worse of the two answers. A new case checks offset *and* suffix against `matter()` across every shape. **R3 — published observations were mutable.** One phase object reaches every subscriber and is retained as the latest, so a reader could rewrite a terminal phase to `active` and a late reader would be told that. Phases are frozen before publication, and an AggregateError's `errors` array is frozen as well as the error around it. Also corrected, as the review requires: `renderer.measure` already returns a frozen copy of each bound, so the handback's claim that `boundsOf` closes over live engine state was wrong. The geometry snapshot it justified is removed — the journeys pass without it, which is the test that says it was never the fix. K11–K13 join the controls, one per finding. All thirteen break and restore byte-identically. Frozen commands: Core 53 / 414, CLI 94 / 313, supplemental 14 / 52, all exit 0. --- .controls.json | 59 ++++++++- packages/cli/src/repl/program.ts | 17 +-- packages/core/src/component-api.ts | 14 ++ packages/core/src/component-expansion.ts | 17 ++- packages/core/src/source-inspection.ts | 27 +++- .../core/tests/component-expansion.test.ts | 120 ++++++++++++++++++ packages/core/tests/source-inspection.test.ts | 68 +++++++++- specs/executable-mdx-spec.md | 16 ++- 8 files changed, 301 insertions(+), 37 deletions(-) diff --git a/.controls.json b/.controls.json index 65321706e..ec05793cb 100644 --- a/.controls.json +++ b/.controls.json @@ -8,7 +8,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (62ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", @@ -39,7 +39,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (61ms)", "firstFailure": "error: Error: expect(received).not.toContain(expected) // indexOf", "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", @@ -70,10 +70,10 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (19 steps) | 1 failed (3 steps) (205ms)", + "summary": "FAILED | 0 passed (21 steps) | 1 failed (3 steps) (218ms)", "firstFailure": "error: Error: expect(received).toContain(expected) // indexOf", - "bytesBefore": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", - "bytesAfter": "f230870a067c5fd8cb1565e29f1341f3afe676a79d485125cd88f981016320d1", + "bytesBefore": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", + "bytesAfter": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", "restored": true }, { @@ -100,7 +100,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", + "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (59ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", @@ -130,7 +130,7 @@ ], "outcome": "BROKEN", "exit": 1, - "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (255ms)", + "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (251ms)", "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", "bytesBefore": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", "bytesAfter": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", @@ -150,5 +150,50 @@ "bytesBefore": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", "bytesAfter": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", "restored": true + }, + { + "id": "K11-foreign", + "says": "let a terminal carry a request its invocation did not issue (R1)", + "file": "packages/core/src/component-api.ts", + "suites": [ + "packages/core/tests/component-expansion.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (23 steps) | 1 failed (1 step) (213ms)", + "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", + "bytesBefore": "8711622e0622d342b960d2bc4c60e4a7d984cea91ebec01cb285dde4e99f2e55", + "bytesAfter": "8711622e0622d342b960d2bc4c60e4a7d984cea91ebec01cb285dde4e99f2e55", + "restored": true + }, + { + "id": "K12-mutable-phase", + "says": "publish a phase a reader can rewrite (R3)", + "file": "packages/core/src/component-expansion.ts", + "suites": [ + "packages/core/tests/component-expansion.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (23 steps) | 1 failed (1 step) (214ms)", + "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", + "bytesBefore": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", + "bytesAfter": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", + "restored": true + }, + { + "id": "K13-envelope", + "says": "let the lexical envelope disagree with the extractor (R2)", + "file": "packages/core/src/source-inspection.ts", + "suites": [ + "packages/core/tests/source-inspection.test.ts" + ], + "outcome": "BROKEN", + "exit": 1, + "summary": "FAILED | 0 passed (12 steps) | 1 failed (1 step) (17ms)", + "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", + "bytesBefore": "e6978c0d5ee73b2c1e94c9f2212bca067b32e7d64b1e55fb4bc50657b1d3064a", + "bytesAfter": "e6978c0d5ee73b2c1e94c9f2212bca067b32e7d64b1e55fb4bc50657b1d3064a", + "restored": true } ] diff --git a/packages/cli/src/repl/program.ts b/packages/cli/src/repl/program.ts index 01a67c1e0..baad4822a 100644 --- a/packages/cli/src/repl/program.ts +++ b/packages/cli/src/repl/program.ts @@ -85,7 +85,7 @@ import type { ReplFrames } from "./frame.ts"; import { committedOps, flatten, profileFor, skeletonOps } from "./layout.ts"; import { prepareReading } from "./fitting.ts"; import { readingLines } from "./source-reading.ts"; -import type { ReplBounds, ReplBox, ReplLayoutManifest, ReplRegion } from "./layout.ts"; +import type { ReplBox, ReplLayoutManifest, ReplRegion } from "./layout.ts"; import { capacityOf, NOTHING_ADMITTED } from "./layout-admission.ts"; import type { ReplAdmission } from "./layout-admission.ts"; import { resolvePointer, useReplRenderer } from "./renderer.ts"; @@ -1420,19 +1420,6 @@ export function* prepareFrame( if (!third.ok) { return third; } - // Every answer this pass gave, copied out before anything else is measured. - // The engine's reported geometry is only valid until the next render, and the - // reading below renders probes — so a `boundsOf` read afterwards answers from - // a tree the frame never described. Measured: it reported capacities from the - // probe pass, which admitted a question drawer short of the one on screen and - // took a field's Tab stop away with it. - const geometry = new Map(); - for (const one of flatten(measured.manifest.root)) { - const bounds = third.value.boundsOf(one.id); - if (bounds !== undefined) { - geometry.set(one.id, bounds); - } - } // The entry reading, fitted to the transcript's measured inner width. It // happens here — after the widths are known and before anything is admitted — // because the rows it produces are what the window has to admit and what the @@ -1458,7 +1445,7 @@ export function* prepareFrame( manifest: measured.manifest, widths, reading: reading.value, - boundsOf: (id: string) => geometry.get(id), + boundsOf: (id: string) => third.value.boundsOf(id), }); const context: ReplPresentationContext = { widths, diff --git a/packages/core/src/component-api.ts b/packages/core/src/component-api.ts index 87fbcb4de..d8fbdbc61 100644 --- a/packages/core/src/component-api.ts +++ b/packages/core/src/component-api.ts @@ -17,6 +17,7 @@ import { type Api, createApi, type Operations } from "@effectionx/context-api"; import type { Operation, Result, Stream } from "effection"; import type { EvalScope } from "@effectionx/scope-eval"; import { settle } from "./errors.ts"; +import { ComponentExpansionProtocolError } from "./component-expansion.ts"; import type { BoundExecRequest } from "./bound-exec.ts"; import type { Expansion } from "./expansion.ts"; import type { @@ -471,6 +472,19 @@ export function expandThroughTerminal( ...COMPONENT_DEFAULTS, registry: new Map(), *expand(delegated: ComponentExpansionRequest): Operation { + // This terminal is one element's continuation, so the only request it + // may carry is the one that element issued. An authentic request from + // *another* live invocation would otherwise reach the claim below and + // consume somebody else's work while running this body — refusing after + // the body has run is too late, because the effect has happened. + // + // Identity, not shape: a request that merely looks like this one was + // issued for different work. + if (delegated !== request) { + throw new ComponentExpansionProtocolError( + "delegated an expansion this invocation did not issue", + ); + } yield* terminal(delegated); }, }); diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts index b166f9314..6052c1aeb 100644 --- a/packages/core/src/component-expansion.ts +++ b/packages/core/src/component-expansion.ts @@ -55,9 +55,15 @@ function createPhasePublication(): PhasePublication { let closed = false; const deliver = (phase: ComponentExpansionPhase): void => { - latest = phase; + // Frozen before anybody can hold it. One object reaches every subscriber + // and is kept as `latest`, so a reader that changed a field would change + // what the other readers — and every reader registering afterwards — are + // told this element did. An observation is a reading, and a reading + // somebody can edit is not one. + const published = Object.freeze(phase); + latest = published; for (const queue of subscribers) { - queue.add(phase); + queue.add(published); } }; @@ -286,6 +292,13 @@ export function reported(raised: unknown, depth = 0): Error { if (explained?.cause !== undefined) { detached.cause = explained.cause; } + // Freezing an AggregateError leaves its `errors` array writable, so one + // reader could rewrite the explanation every other reader is holding. The + // members are already detached reports; this is what stops them being + // edited in place. + if (detached instanceof AggregateError) { + Object.freeze(detached.errors); + } return Object.freeze(detached); } diff --git a/packages/core/src/source-inspection.ts b/packages/core/src/source-inspection.ts index c2dc49c5e..8242560c2 100644 --- a/packages/core/src/source-inspection.ts +++ b/packages/core/src/source-inspection.ts @@ -81,21 +81,31 @@ function shifted(element: SourceElement, by: number): SourceElement { * header, and the body is the whole text. */ export function envelopeBody(text: string): number { + // A byte-order mark is never part of the body, whether or not a header + // follows it. A document with no header at all still starts after it. const mark = text.charCodeAt(0) === 0xfeff ? 1 : 0; if (!text.startsWith("---", mark) || text.charAt(mark + 3) === "-") { - return 0; + return mark; } + // An opener with nothing after it consumes the whole text: there is a header + // and no body, rather than a body that happens to look like a delimiter. const opened = text.indexOf("\n", mark + 3); if (opened === -1) { - return 0; + return text.length; } const closed = closingDelimiter(text, opened + 1); if (closed === -1) { - return 0; + return text.length; } - // Past the closing line's own newline, and the carriage return before it. - const line = text.indexOf("\n", closed); - return line === -1 ? text.length : line + 1; + // Immediately after the three characters that close it, and then one line + // ending if one is there. A closing line with anything after the delimiter + // keeps that text: it is the first thing in the body, not part of the + // header. + const after = closed + 3; + if (text.startsWith("\r\n", after)) { + return after + 2; + } + return text.startsWith("\n", after) ? after + 1 : after; } /** Where the line that is exactly the closing delimiter begins, or -1. */ @@ -105,7 +115,10 @@ function closingDelimiter(text: string, from: number): number { const end = text.indexOf("\n", at); const stop = end === -1 ? text.length : end; const line = text.slice(at, stop).replace(/\r$/, ""); - if (line === "---") { + // Starts with the delimiter rather than being only it: the extractor ends + // the header at the first line that opens with `---`, and whatever follows + // on that line is the first thing in the body. + if (line.startsWith("---")) { return at; } if (end === -1) { diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts index 679176ba1..5c365d18f 100644 --- a/packages/core/tests/component-expansion.test.ts +++ b/packages/core/tests/component-expansion.test.ts @@ -262,6 +262,126 @@ describe("Tier CX — what surrounds one expansion", () => { expect(report).toContain("did not issue"); }); + it("CX1: an authentic request from another invocation runs neither body", function* () { + // R1. Not a fabricated object and not a copy — a *real* request belonging + // to another invocation that is live and has not been delegated yet, + // offered to this one's `next`. The brand is genuine and the claim is + // unspent, so nothing about the request itself says no; what says no is + // that this terminal is one element's continuation and that request was + // issued for another. + // + // It has to be refused before the body runs. Refusing afterwards is too + // late: the effect has happened, and the other element's one claim has + // been spent by the wrong invocation. + // + // Two spawned siblings, so both expansions really are in flight at once: + // in a sequential document the first element's request is already spent by + // the time the second is offered it, which tests the wrong thing. + const ran: string[] = []; + const lent = withResolvers(); + const tried = withResolvers(); + const observed = yield* watch( + "\n\n\n\n", + { + Held: component("Held", function* () { + ran.push("Held"); + return "held"; + }), + Other: component("Other", function* () { + ran.push("Other"); + return "other"; + }), + }, + function* (request, next) { + if (request.expansion.name === "Held") { + // Lent out before it is delegated, so what the other invocation is + // offered is unconsumed. + lent.resolve(request); + yield* tried.operation; + yield* next(request); + return; + } + if (request.expansion.name !== "Other") { + yield* next(request); + return; + } + const theirs = yield* lent.operation; + let refused: unknown; + try { + yield* next(theirs); + } catch (error) { + refused = error; + } + tried.resolve("done"); + expect(String(refused)).toContain("did not issue"); + // Neither body ran on the invalid delegation. + expect(ran).toEqual([]); + yield* next(request); + }, + ); + // Both elements ran, each through its own terminal. + expect(ran.sort()).toEqual(["Held", "Other"]); + expect(observed.failure).toBe(undefined); + expect(observed.rendered).toContain("held"); + expect(observed.rendered).toContain("other"); + // And the lent request was still its own element's to spend. + const theirs = observed.watched.requests.find((one) => one.expansion.name === "Held"); + const phases = observed.watched.seen.get(theirs?.expansion.id ?? "") ?? []; + expect(phases[phases.length - 1]?.phase).toBe("complete"); + }); + + it("CX3: a published phase and its explanation cannot be edited by a reader", function* () { + // R3. One phase object reaches every subscriber and is kept as the latest + // for whoever registers next, so a reader that could write to it would be + // rewriting what this element did for everybody else. + const seen: ComponentExpansionPhase[] = []; + const observed = yield* watch( + "\n", + { + Boom: component("Boom", function* () { + throw new AggregateError([new Error("one"), new Error("two")], "both failed"); + }), + }, + function* (request, next, read, owner) { + read((phase) => { + seen.push(phase); + // A reader trying to rewrite the observation it was handed. + try { + (phase as { phase: string }).phase = "active"; + } catch { + // Frozen in strict mode, which is the point. + } + }); + yield* next(request); + // A late reader, registered after the terminal phase was published. + owner.run(function* () { + for (const phase of yield* each(request.phases)) { + expect(phase.phase).not.toBe("active"); + yield* each.next(); + } + }); + }, + ); + expect(observed.failure).not.toBe(undefined); + expect(seen.length).toBeGreaterThan(0); + for (const phase of seen) { + expect(Object.isFrozen(phase)).toBe(true); + } + // The terminal observation is still the one Core published. + const terminal = seen[seen.length - 1]; + expect(terminal.phase).toBe("complete"); + if (terminal.phase === "complete" && !terminal.result.ok) { + const report = terminal.result.error; + expect(Object.isFrozen(report)).toBe(true); + // An AggregateError's members are an array, and freezing the error does + // not freeze it: one reader could otherwise rewrite the explanation + // every other reader is holding. + if (report instanceof AggregateError) { + expect(Object.isFrozen(report.errors)).toBe(true); + } + } + }); + it("CX1: delegating the same request twice runs the body once", function* () { let ran = 0; const { report } = yield* watch( diff --git a/packages/core/tests/source-inspection.test.ts b/packages/core/tests/source-inspection.test.ts index 96d4f678b..411055d2d 100644 --- a/packages/core/tests/source-inspection.test.ts +++ b/packages/core/tests/source-inspection.test.ts @@ -10,7 +10,8 @@ import { describe, it } from "@executablemd/test-support/bdd"; import { expect } from "@executablemd/test-support/expect"; -import { inspectSource } from "../src/source-inspection.ts"; +import matter from "gray-matter"; +import { envelopeBody, inspectSource } from "../src/source-inspection.ts"; import type { SourceElement } from "../src/source-inspection.ts"; import { scanSegments } from "../src/scanner.ts"; @@ -162,11 +163,68 @@ describe("Tier SI — what a source text says it is made of", () => { expect(inspect(text, "document").map((one) => one.name)).toEqual(["Plan"]); }); - it("SI2: an unterminated header is not a header", function* () { + it("SI2: an unterminated header is a header, and encloses no element", function* () { const text = "---\ntitle: x\n\n"; - // gray-matter's value parser refuses this text; inspection never calls it, - // and reads the whole thing as body. - expect(inspect(text, "document").map((one) => one.name)).toEqual(["Json"]); + // Corrected for R2. This case previously asserted the opposite — that the + // whole text reads as body and the `` is an element in it — which + // was this helper disagreeing with the installed extractor rather than a + // reading of the document. + // + // The extractor ends an unterminated header at the end of the text: there + // is a header and no body. Its *value* parser then refuses this one + // outright, so execution accepts the document not at all — and inspection + // claiming an executable element inside a document nothing will run is + // the worse of the two answers. + // + // Inspection still never calls that parser, which is why it answers here + // at all instead of throwing. + expect(inspect(text, "document")).toEqual([]); + // Read as a fragment — no envelope — the same text is all body. + expect(inspect(text, "fragment").map((one) => one.name)).toEqual(["Json"]); + }); + + it("SI2: the envelope is the installed extractor's, shape for shape", function* () { + // R2. The one boundary, checked against the thing it has to agree with + // rather than against my reading of it. `parseSource` asserts this + // equality at execution time, so a disagreement is not a cosmetic drift — + // it refuses a document the engine would otherwise accept. + const shapes = [ + "\uFEFF\n", + "\n", + "", + "\uFEFF", + "---\ntitle: hi\n", + "---\ntitle: hi\n---suffix\n\n", + "---\ntitle: hi\n---\n\n", + "\uFEFF---\ntitle: hi\n---\n\n", + "---\r\ntitle: hi\r\n---\r\n\r\n", + "----\ntitle: hi\n----\n\n", + "---yaml\ntitle: hi\n---\n\n", + "---\n---\n\n", + "---\n", + "---", + "---\ntitle: hi\n---", + "text\n---\ntitle: hi\n---\nmore\n", + "---\ntitle: a---b\n---\nbody\n", + "\n---\ntitle: hi\n---\nbody\n", + "---\ntitle: hi\n----\nbody\n", + "---\ntitle: hi\n--- \nbody\n", + "---\n\n---\nbody\n", + "\uFEFF---\n", + "---\r\ntitle: hi\r\n---", + "--- \ntitle: hi\n---\nbody\n", + ]; + for (const text of shapes) { + // What the extractor says, read the way `parseSource` reads it: the body + // is a verbatim suffix, so its start is a length difference. + const extracted = text.length - matter(text).content.length; + expect([text, envelopeBody(text)]).toEqual([text, extracted]); + // And the suffix itself, not just its offset. + expect([text, text.slice(envelopeBody(text))]).toEqual([text, matter(text).content]); + } + // A BOM is never body, with or without a header: the case R2 named. + expect(envelopeBody("\uFEFF\n")).toBe(1); + expect(inspect("\uFEFF\n", "document").map((one) => one.name)).toEqual(["Hello"]); }); it("SI1: text with no elements is success, not a refusal", function* () { diff --git a/specs/executable-mdx-spec.md b/specs/executable-mdx-spec.md index 5d2ddb69a..b74096ca9 100644 --- a/specs/executable-mdx-spec.md +++ b/specs/executable-mdx-spec.md @@ -5597,7 +5597,21 @@ An observer decides nothing. What a handler returns is ignored; catching what canonical expansion raised does not rescue it; a handler may refuse the work by throwing or by returning without delegating. A copied, foreign or repeated request runs nothing, and `Component.expand` called outside canonical dispatch -refuses an unissued request. A failure is reported as a detached, frozen +refuses an unissued request. + +Each element's terminal carries only the request that element issued. A +request belonging to *another* live invocation is authentic and unspent, so +nothing about the request itself refuses it; what refuses it is the terminal +it was handed to, before the body runs and before the claim is taken. Refusing +afterwards would be too late twice over — the effect has happened, and the +other element's one claim has been spent by the wrong invocation. + +Published phases are immutable observations. One phase object reaches every +subscriber and is kept as the latest for whoever registers next, so it is +frozen before publication; a reader cannot change what this element did for +the other readers, or for a reader that has not registered yet. The same holds +for the explanation a failure carries, whose aggregate members are frozen as +well as the error around them. A failure is reported as a detached, frozen `Error` preserving the selected name, message and explanatory causes — no canonical error identity, binding or resource object crosses. From 94a36e9210c8f90f2426ae6850637a2d65e9f69a Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 10:50:18 -0400 Subject: [PATCH 14/19] =?UTF-8?q?=F0=9F=9A=A8=20Take=20the=20scratch=20out?= =?UTF-8?q?=20of=20the=20product=20commit,=20and=20make=20K1=20a=20control?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Planner's journey review found three things beyond R1–R3, all mine. **A 2.8 MB test log was committed into the branch.** `.cliall.log` entered at `108fa00c` and `.controls.json` at `a210e4eb`; `git diff --check c7d54769..HEAD` exits 2 on the log's trailing whitespace, so the branch-level whitespace gate has been failing while the working-tree check I was running said clean. An empty working tree does not check the committed change. Both are gone and `.gitignore` now names them: a test log and a control record are evidence, and evidence belongs under `.reviewer/`. **K1 was not the control it said it was.** It claimed "remove the rails" and recoloured one — and when I made it actually remove them, it came back UNBROKEN. Nothing asserted a rail reaches a row: every case read `line.rail`, which is the model's answer, so the reading could have lost its rails entirely and the suite would have passed. `repl-source-reading.test.ts` now checks that every composed row opens with the rail glyph, under the rail role naming the region the row is in, with an observed rail among them so painting every row alike does not satisfy it. K1 removes the rails and fails; the recolouring mutation stays as K1b, named for what it does. **A control record kept only the matcher line.** `expect(received).toBe( expected)` says nothing about what broke. The runner now preserves the whole first failure, so K1's record reads `- "│" + " "` against the row key. Fourteen controls, all breaking and restoring byte-identically. Frozen commands: Core 53 / 414, CLI 94 / 314, supplemental 14 / 52, all exit 0. --- .cliall.log | 79907 ---------------- .controls.json | 199 - .gitignore | 7 + .../cli/tests/repl-source-reading.test.ts | 33 + 4 files changed, 40 insertions(+), 80106 deletions(-) delete mode 100644 .cliall.log delete mode 100644 .controls.json diff --git a/.cliall.log b/.cliall.log deleted file mode 100644 index 1a619e351..000000000 --- a/.cliall.log +++ /dev/null @@ -1,79907 +0,0 @@ -Task test deno test --allow-all --frozen 'packages/cli/tests/' -Check packages/cli/tests/agent-adapters.test.ts -Check packages/cli/tests/agent-cli.test.ts -Check packages/cli/tests/agent-config.test.ts -Check packages/cli/tests/agent-options-cli.test.ts -Check packages/cli/tests/agent-options.test.ts -Check packages/cli/tests/agent-session-coordinator.test.ts -Check packages/cli/tests/cli-help.test.ts -Check packages/cli/tests/command.test.ts -Check packages/cli/tests/compiled-upgrade.test.ts -Check packages/cli/tests/document-suites/inline/inline-markdown.test.ts -Check packages/cli/tests/document-suites/plan/plan-markdown.test.ts -Check packages/cli/tests/document-suites/props/props-markdown.test.ts -Check packages/cli/tests/document-suites/syntax/syntax-markdown.test.ts -Check packages/cli/tests/document-suites/targets/targets-markdown.test.ts -Check packages/cli/tests/document-suites/verbose/verbose-markdown.test.ts -Check packages/cli/tests/evaluate-component.test.ts -Check packages/cli/tests/evaluate-workflow.test.ts -Check packages/cli/tests/fetch-cli.test.ts -Check packages/cli/tests/file-stream.test.ts -Check packages/cli/tests/github-zero-effect.test.ts -Check packages/cli/tests/inline-cli.test.ts -Check packages/cli/tests/launch-timeout.test.ts -Check packages/cli/tests/packaged-document.test.ts -Check packages/cli/tests/plan-args.test.ts -Check packages/cli/tests/plan-cli.test.ts -Check packages/cli/tests/plan-command-document.test.ts -Check packages/cli/tests/plan-component.test.ts -Check packages/cli/tests/plan-host-acts.test.ts -Check packages/cli/tests/plan.test.ts -Check packages/cli/tests/plugin-cli.test.ts -Check packages/cli/tests/plugin-host.test.ts -Check packages/cli/tests/plugin-modules.test.ts -Check packages/cli/tests/plugin-selection.test.ts -Check packages/cli/tests/process-retention.test.ts -Check packages/cli/tests/props-cli.test.ts -Check packages/cli/tests/props-schema.test.ts -Check packages/cli/tests/props-sources.test.ts -Check packages/cli/tests/pull-request-read-fork.test.ts -Check packages/cli/tests/repl-admission.test.ts -Check packages/cli/tests/repl-agent-execution.test.ts -Check packages/cli/tests/repl-agent-interface.test.ts -Check packages/cli/tests/repl-agent-journey.test.ts -Check packages/cli/tests/repl-boundaries.test.ts -Check packages/cli/tests/repl-composition.test.ts -Check packages/cli/tests/repl-entries.test.ts -Check packages/cli/tests/repl-execution.test.ts -Check packages/cli/tests/repl-exit-pty.test.ts -Check packages/cli/tests/repl-forms.test.ts -Check packages/cli/tests/repl-journey.test.ts -Check packages/cli/tests/repl-layout-admission.test.ts -Check packages/cli/tests/repl-lifecycle.test.ts -Check packages/cli/tests/repl-model.test.ts -Check packages/cli/tests/repl-presentation-style.test.ts -Check packages/cli/tests/repl-route.test.ts -Check packages/cli/tests/repl-terminal.test.ts -Check packages/cli/tests/run-composition-deno.test.ts -Check packages/cli/tests/run-composition-nested.test.ts -Check packages/cli/tests/run-composition.test.ts -Check packages/cli/tests/run-deadline.test.ts -Check packages/cli/tests/run-profile.test.ts -Check packages/cli/tests/run-timeouts.test.ts -Check packages/cli/tests/secret-detection-cli.test.ts -Check packages/cli/tests/service-document.test.ts -Check packages/cli/tests/service-host.test.ts -Check packages/cli/tests/session-launch-cli.test.ts -Check packages/cli/tests/stdin-cli.test.ts -Check packages/cli/tests/stdout-delivery.test.ts -Check packages/cli/tests/syntax-cli.test.ts -Check packages/cli/tests/targets-cli.test.ts -Check packages/cli/tests/test-root-profile.test.ts -Check packages/cli/tests/test-target.test.ts -Check packages/cli/tests/testing-activation.test.ts -Check packages/cli/tests/testing-execution-host.test.ts -Check packages/cli/tests/upgrade-cli.test.ts -Check packages/cli/tests/upgrade-command-document.test.ts -Check packages/cli/tests/upgrade-output.test.ts -Check packages/cli/tests/value-root.test.ts -Check packages/cli/tests/verbose-component.test.ts -Check packages/cli/tests/workflow-agent-sessions.test.ts -Check packages/cli/tests/workflow-agent.test.ts -Check packages/cli/tests/workflow-cli.test.ts -Check packages/cli/tests/workflow-crash.test.ts -Check packages/cli/tests/workflow-declaration.test.ts -Check packages/cli/tests/workflow-export-publication.test.ts -Check packages/cli/tests/workflow-fetch.test.ts -Check packages/cli/tests/workflow-fork.test.ts -Check packages/cli/tests/workflow-host.test.ts -Check packages/cli/tests/workflow-inspection.test.ts -Check packages/cli/tests/workflow-installation.test.ts -Check packages/cli/tests/workflow-lifecycle-control.test.ts -Check packages/cli/tests/workflow-retention.test.ts -Check packages/cli/tests/workflow-suspension.test.ts -running 1 test from ./packages/cli/tests/agent-adapters.test.ts -Tier AE — embedded adapters on the run and plan paths ... - AE1: the run path resolves an embedded agent to this build's own adapter ... ok (2ms) - AE2: an agent this build carries no snapshot for resolves as it always did ... ok (1ms) - AE3: the plan path's ceiling hands its provider the same registry ... ok (1ms) - AE4: preparing an agent this build carries nothing for writes nothing ... ok (1ms) - AE6: the plan profile prepares its adapter through the host, not the document ... ok (288ms) - AE5: a settled stack carries this host's own adapter root ... ok (0ms) -Tier AE — embedded adapters on the run and plan paths ... ok (296ms) -running 2 tests from ./packages/cli/tests/agent-cli.test.ts -Tier CA — xmd run agent stack ... - CA1: an unknown --agent-provider fails before the document executes ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Unknown agent provider "bogus" ------ post-test output end ----- - CA1: an unknown --agent-provider fails before the document executes ... ok (1s) - CA2: mutually exclusive permission flags fail before the document executes ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---approve-all, --approve-reads, and --deny-all are mutually exclusive ------ post-test output end ----- - CA2: mutually exclusive permission flags fail before the document executes ... ok (1s) - CA3: a document that never uses an agent runs with default flags ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -PLAIN_MARKER - -No agent here. ------ post-test output end ----- - CA3: a document that never uses an agent runs with default flags ... ok (1s) - CA5: the default agent resolves environment, then flag, with the flag winning ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -BEFORE_MARKER - -agent "xmd-env-only-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-env-only-agent; command=xmd-env-only-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-380ff196-705e-4b41-82b9-a33b7c339246/work; Failed to spawn agent command: xmd-env-only-agent) -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -BEFORE_MARKER - -agent "xmd-flag-only-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-flag-only-agent; command=xmd-flag-only-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-f1a5fe5e-e48c-4255-95eb-b9edd44b83dd/work; Failed to spawn agent command: xmd-flag-only-agent) -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -BEFORE_MARKER - -agent "xmd-flag-wins-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-flag-wins-agent; command=xmd-flag-wins-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-623c90d5-bf80-4370-a544-1d088618b414/work; Failed to spawn agent command: xmd-flag-wins-agent) ------ post-test output end ----- - CA5: the default agent resolves environment, then flag, with the flag winning ... ok (4s) - CA6: an unavailable agent aborts expansion, for and for a bare ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -BEFORE_MARKER - -agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-b792598d-bad0-4562-bd18-422b95008b22/work; Failed to spawn agent command: xmd-nonexistent-agent) -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -BEFORE_MARKER - -agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-9988ee77-5f97-4f17-bcf4-3a63df9b7a07/work; Failed to spawn agent command: xmd-nonexistent-agent) ------ post-test output end ----- - CA6: an unavailable agent aborts expansion, for and for a bare ... ok (3s) - CA7: xmd test rejects every agent-only option at argument parsing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --agent-provider — agent options are exclusive to xmd run and xmd plan -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --default-agent — agent options are exclusive to xmd run and xmd plan -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --approve-all — agent options are exclusive to xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --approve-reads — agent options are exclusive to xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --deny-all — agent options are exclusive to xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd test: --agent-provider=acpx — agent options are exclusive to xmd run and xmd plan ------ post-test output end ----- - CA7: xmd test rejects every agent-only option at argument parsing ... ok (7s) -Tier CA — xmd run agent stack ... ok (20s) -Tier CO — xmd agent options ... - CO1: a command line this command does not define is refused before an agent is asked ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd agent names an action — write `xmd agent options [agent] [--model ] [--json]`. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd agent does not have a "list" action. The one action is `xmd agent options`. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd agent options accepts at most one agent name. claude is an extra argument. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd agent options does not recognize --effort. It accepts one optional agent name and these options: --model, --json. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---model needs a model id — write `--model ` with the exact id the agent advertises. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---json does not take a value. Use it by itself. ------ post-test output end ----- - CO1: a command line this command does not define is refused before an agent is asked ... ok (8s) - CO2: an agent that is not there fails without printing a partial answer ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -agent "definitely-not-an-agent-command" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=definitely-not-an-agent-command; command=definitely-not-an-agent-command; cwd=/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-ca-3b31b49a-a1ef-43f2-9820-2ebfc38b7dee/work; Failed to spawn agent command: definitely-not-an-agent-command) ------ post-test output end ----- - CO2: an agent that is not there fails without printing a partial answer ... ok (1s) - CO3: the help says what inspecting costs, and what it does not ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd agent [OPTIONS] [action] [agent] - -Arguments: - [action] the one action: `options` - [agent] agent to ask (default: the agent `xmd run` would use) - -Options: - --model [MODEL] read effort choices for this exact model id instead of the current one - --json write the choices as version-1 JSON instead of text [default: false] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Inspecting an agent reads the choices it advertises for a session, so xmd -creates one, reads it, and closes it without sending a prompt. The provider -may keep that empty conversation in its own history. - -The command runs no document, spends no model turn, writes no xmd journal and -creates no durable xmd session. - - xmd agent options - xmd agent options codex - xmd agent options codex --model gpt-5.4 - xmd agent options codex --model gpt-5.4 --json - -Ids are exact provider ids, and they are what a writes: - ------ post-test output end ----- - CO3: the help says what inspecting costs, and what it does not ... ok (1s) -Tier CO — xmd agent options ... ok (11s) -running 1 test from ./packages/cli/tests/agent-config.test.ts -Tier AF — agent flag parsing ... - AF1: no permission flag selects approve-reads ... ok (3ms) - AF2: each explicit permission flag selects its own mode ... ok (1ms) - AF3: more than one permission flag is an error ... ok (0ms) - AF4: the explicit default agent passes through untouched ... ok (1ms) -Tier AF — agent flag parsing ... ok (10ms) -running 1 test from ./packages/cli/tests/agent-options-cli.test.ts -Tier CX — xmd agent options against an agent ... - CX1: one session, no prompt, closed — and nothing of the run left behind ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-38828c02-b64d-41bf-844d-49e8d26a1833/acp-agent -Selected model: gpt-5.4 - -Models - gpt-5.4 GPT-5.4 — the current one (selected) - Group mini Small - gpt-5.4-mini GPT-5.4 Mini - -Effort levels for gpt-5.4 - low Low - medium Medium (selected) - high High ------ post-test output end ----- - CX1: one session, no prompt, closed — and nothing of the run left behind ... ok (1s) - CX2: the text a person reads is the agent's own order and grouping ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-71432c30-da25-42bf-8451-50d59f119583/acp-agent -Selected model: gpt-5.4 - -Models - gpt-5.4 GPT-5.4 — the current one (selected) - Group mini Small - gpt-5.4-mini GPT-5.4 Mini - -Effort levels for gpt-5.4 - low Low - medium Medium (selected) - high High ------ post-test output end ----- - CX2: the text a person reads is the agent's own order and grouping ... ok (1s) - CX3: --model is applied, verified, and its own effort choices reported ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -{ - "version": 1, - "agent": "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-216faa21-1e6f-4939-8d2c-4a1511806712/acp-agent", - "model": { - "selected": "gpt-5.4-mini", - "options": [ - { - "id": "gpt-5.4", - "name": "GPT-5.4", - "description": "the current one", - "group": null - }, - { - "id": "gpt-5.4-mini", - "name": "GPT-5.4 Mini", - "description": null, - "group": { - "id": "mini", - "name": "Small" - } - } - ] - }, - "effort": { - "selected": "low", - "options": [ - { - "id": "low", - "name": "Low", - "description": null, - "group": null - } - ] - } -} ------ post-test output end ----- - CX3: --model is applied, verified, and its own effort choices reported ... ok (1s) - CX4: with no agent named, the one an `xmd run` would use is asked ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-8c734a86-d009-4528-8684-69570e678031/acp-agent -Selected model: gpt-5.4 - -Models - gpt-5.4 GPT-5.4 — the current one (selected) - Group mini Small - gpt-5.4-mini GPT-5.4 Mini - -Effort levels for gpt-5.4 - low Low - medium Medium (selected) - high High ------ post-test output end ----- - CX4: with no agent named, the one an `xmd run` would use is asked ... ok (1s) - CX5: an agent that advertises nothing says so rather than printing nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Agent: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-460f0e90-981d-490b-a93e-dd8a085d761f/acp-agent - -Model choices are unavailable for /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-460f0e90-981d-490b-a93e-dd8a085d761f/acp-agent. - -Effort choices are unavailable for the current model. ------ post-test output end ----- - CX5: an agent that advertises nothing says so rather than printing nothing ... ok (1s) - CX6: a model this agent does not offer is refused, and nothing is printed ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Unknown model "gpt-x" for agent "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-cx-5ad51377-8906-4274-82b0-3371e8b24f26/acp-agent". -Available options are: gpt-5.4, gpt-5.4-mini ------ post-test output end ----- - CX6: a model this agent does not offer is refused, and nothing is printed ... ok (1s) - CX7: the help says what asking costs before anyone asks ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd agent [OPTIONS] [action] [agent] - -Arguments: - [action] the one action: `options` - [agent] agent to ask (default: the agent `xmd run` would use) - -Options: - --model [MODEL] read effort choices for this exact model id instead of the current one - --json write the choices as version-1 JSON instead of text [default: false] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Inspecting an agent reads the choices it advertises for a session, so xmd -creates one, reads it, and closes it without sending a prompt. The provider -may keep that empty conversation in its own history. - -The command runs no document, spends no model turn, writes no xmd journal and -creates no durable xmd session. - - xmd agent options - xmd agent options codex - xmd agent options codex --model gpt-5.4 - xmd agent options codex --model gpt-5.4 --json - -Ids are exact provider ids, and they are what a writes: - ------ post-test output end ----- - CX7: the help says what asking costs before anyone asks ... ok (1s) - CX8: a malformed answer is refused whole, and says nothing the agent sent ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -this agent's model selector advertises no list of choices ------ post-test output end ----- - CX8: a malformed answer is refused whole, and says nothing the agent sent ... ok (1s) -Tier CX — xmd agent options against an agent ... ok (12s) -running 2 tests from ./packages/cli/tests/agent-options.test.ts -Tier AG — the agent-options grammar ... - AG1: the accepted forms read as themselves ... ok (4ms) - AG2: everything else is refused, and says what is accepted ... ok (1ms) -Tier AG — the agent-options grammar ... ok (12ms) -Tier AG — what the command prints ... - AG3: a person reads ids first, in the provider's own order ... ok (1ms) - AG4: absent choices say so rather than printing an empty list ... ok (1ms) - AG5: the JSON is version 1, in its settled order, with null for absence ... ok (0ms) - AG6: neither rendering carries a path, a session identity or a credential ... ok (1ms) -Tier AG — what the command prints ... ok (5ms) -running 1 test from ./packages/cli/tests/agent-session-coordinator.test.ts -Tier HC — host session ownership ... - HC1: only a host with advisory locking builds a coordinator ... ok (2ms) - HC2: the coordination namespace is the machine-wide one, not a run's ... ok (1ms) - HC3: a provider with no coordinator refuses before contacting the agent ... ok (3ms) - HC4: a coordinator this host can build gets past the ownership question ... ok (17ms) - HC6: an agent that names its own sessions needs a route store too ... ok (2ms) - HC7: a provider-returned agent performs no route work at all ... ok (14ms) - HC8: the shipped default advertises exactly the adapters that were proven ... ok (1ms) - HC9: a default Claude launch reaches the launcher here, and refuses elsewhere ... ok (37ms) - HC10: an unadvertised agent keeps ordinary behavior on every runtime ... ok (1ms) - HC5: the Deno and compiled entrypoints assemble machine sessions; Node and Bun do not ... ok (2ms) - HC11: an agent that names its own sessions needs an observer too ... ok (1ms) - HC12: the two advertised sets are separate, and this host states both ... ok (0ms) -Tier HC — host session ownership ... ok (90ms) -running 1 test from ./packages/cli/tests/cli-help.test.ts -Tier CH — xmd help ... - CH1: program help lists the commands ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH1: program help lists the commands ... ok (678ms) - CH2: xmd run --help prints run help instead of a missing-argument error ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - CH2: xmd run --help prints run help instead of a missing-argument error ... ok (590ms) - CH3: xmd test --help prints test help ... -------- post-test output ------- -Usage: xmd test [OPTIONS] [path] - -Arguments: - [path] markdown document or directory to test (defaults to the current directory) [default: .] - -Options: - --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH3: xmd test --help prints test help ... ok (565ms) - CH12: program help lists syntax, and syntax help lists only its two options ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. -Usage: xmd syntax [OPTIONS] [component] - -Arguments: - [component] component to describe in full — `xmd syntax Elicit` renders its catalog metadata and long-form documentation instead of the compact catalog - -Options: - --include ... component search directory [default: components,.] - --json write the symbols as version-2 JSON instead of markdown [default: false] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH12: program help lists syntax, and syntax help lists only its two options ... ok (1s) - CH13: run and test help are unchanged by the syntax command ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. -Usage: xmd test [OPTIONS] [path] - -Arguments: - [path] markdown document or directory to test (defaults to the current directory) [default: .] - -Options: - --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH13: run and test help are unchanged by the syntax command ... ok (1s) - CH14: program help lists upgrade, and its help performs no upgrade ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. -Usage: xmd upgrade [OPTIONS] [tag] - -Arguments: - [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) - -Options: - --status report how the selected release compares, and change nothing [default: false] - --allow-downgrade consent to installing a release older than the installed one [default: false] - --allow-prerelease consent to installing the exact prerelease tag named [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -With no tag, xmd upgrade installs the latest published stable release. Name -an exact tag instead to select one release and only that release: - xmd upgrade - xmd upgrade v1.2.3 - xmd upgrade v1.3.0-rc.1 --allow-prerelease - - --status - Report the installed version, the selected release, how the two - compare and the exact release URL. It downloads no binary, locks - nothing and changes no files, and it accepts any published exact tag - without consent — so neither consent option may be written with it. - - --allow-downgrade - Consent to installing a release older than the installed one. It is - refused when the selected release is not older. - - --allow-prerelease - Consent to installing the exact prerelease tag named. It is refused - without one, because no implicit selection ever chooses a prerelease. - - --journal , -j - Write a diagnostic JSONL trace of this run to a new file. The path - must not exist. The trace is evidence only: it is never read back, it - resumes nothing, and it changes no output, release choice or consent. - With --status it is the one file the command writes. - -Only a compiled xmd on macOS or Linux can replace itself: - - compiled binary macOS or Linux: self-upgrade - Windows: use the installer or a release asset - npm or Node update with npm - Bun update with Bun - Deno or repository source update the package version or the checkout - -Every other combination stops with instructions for that installation before -the command reads release metadata or changes any files. - -An install downloads the release binary for this platform, checks it against -the published SHA-256 checksum, runs the verified candidate and requires it -to report the selected version, and only then replaces the binary that ran -this command with one atomic rename. Anything that fails before that rename -leaves the installed xmd exactly as it was. ------ post-test output end ----- - CH14: program help lists upgrade, and its help performs no upgrade ... ok (1s) - CH4: --version prints the version ... -------- post-test output ------- -0.13.1 ------ post-test output end ----- - CH4: --version prints the version ... ok (578ms) - CH5: a missing document still fails, so help detection does not mask errors ... -------- post-test output ------- -xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` ------ post-test output end ----- - CH5: a missing document still fails, so help detection does not mask errors ... ok (618ms) - CH6: no command named targets is registered ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH6: no command named targets is registered ... ok (569ms) - CH7: a document named targets gets ordinary shorthand run help ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by targets - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in targets - - targets#Prepare - Install what the later sections read from. - - targets#Verify ------ post-test output end ----- - CH7: a document named targets gets ordinary shorthand run help ... ok (581ms) - CH15: run help states the standard-input form and the pipeline it serves ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - CH15: run help states the standard-input form and the pipeline it serves ... ok (571ms) - CH8: run help teaches the document-reference grammar ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - CH8: run help teaches the document-reference grammar ... ok (562ms) - CH10: generic run help reads no document and shows neither section ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - CH10: generic run help reads no document and shows neither section ... ok (556ms) - CH11: a file-backed form adds both contextual sections to the same run help ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by doc.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in doc.md - - doc.md#Prepare - Install what the later sections read from. - - doc.md#Verify ------ post-test output end ----- - CH11: a file-backed form adds both contextual sections to the same run help ... ok (606ms) - CH9: test help is unchanged by the reference grammar ... -------- post-test output ------- -Usage: xmd test [OPTIONS] [path] - -Arguments: - [path] markdown document or directory to test (defaults to the current directory) [default: .] - -Options: - --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - CH9: test help is unchanged by the reference grammar ... ok (582ms) - CH12: program help lists repl, and its own help describes the one entry ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. -Usage: xmd repl [OPTIONS] [location] - -Arguments: - [location] a location this REPL printed earlier — `xmd://repl//...` — to reopen that retained history and the exact view it names - -Options: - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -ONE ENTRY - - xmd repl opens an empty draft in a full-screen terminal. Type or paste one - XMD entry and submit it; the REPL runs it, and you can pause its expansion, - look at an earlier point in its history, answer a question it asks and read - what it produced. - - An execution admits exactly one entry. The screen always shows a location - of the form xmd://repl//..., and when the command ends it - prints the whole xmd repl that reopens the one it ended at. Running - it reopens the same retained history and selects the same view — in this - process or another one, from the history file alone. ------ post-test output end ----- - CH12: program help lists repl, and its own help describes the one entry ... ok (1s) - CH13: xmd repl refuses a bad command line before it opens anything ... -------- post-test output ------- -xmd repl takes at most one location. This REPL admits one entry per execution, so there is no second document to name. -unrecognized option for xmd repl: --json — xmd repl takes one optional location and the agent options --agent-provider, --default-agent, --approve-all, --approve-reads and --deny-all -xmd repl: a REPL location begins with xmd://repl/ ------ post-test output end ----- - CH13: xmd repl refuses a bad command line before it opens anything ... ok (1s) - C1: repl states the same five Agent options as run, described the same way ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. -Usage: xmd repl [OPTIONS] [location] - -Arguments: - [location] a location this REPL printed earlier — `xmd://repl//...` — to reopen that retained history and the exact view it names - -Options: - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -ONE ENTRY - - xmd repl opens an empty draft in a full-screen terminal. Type or paste one - XMD entry and submit it; the REPL runs it, and you can pause its expansion, - look at an earlier point in its history, answer a question it asks and read - what it produced. - - An execution admits exactly one entry. The screen always shows a location - of the form xmd://repl//..., and when the command ends it - prints the whole xmd repl that reopens the one it ended at. Running - it reopens the same retained history and selects the same view — in this - process or another one, from the history file alone. ------ post-test output end ----- - C1: repl states the same five Agent options as run, described the same way ... ok (1s) - C1: each Agent option is accepted, and a wrong line refuses before the terminal ... -------- post-test output ------- -xmd repl: the REPL runs where a terminal is: it is not available over a pipe. -xmd repl: the REPL runs where a terminal is: it is not available over a pipe. -xmd repl: the REPL runs where a terminal is: it is not available over a pipe. -xmd repl: the REPL runs where a terminal is: it is not available over a pipe. -xmd repl: the REPL runs where a terminal is: it is not available over a pipe. ---approve-all, --approve-reads, and --deny-all are mutually exclusive -Unknown agent provider "nope" -xmd repl: --default-agent requires a value -xmd repl takes at most one location. This REPL admits one entry per execution, so there is no second document to name. ------ post-test output end ----- - C1: each Agent option is accepted, and a wrong line refuses before the terminal ... ok (5s) -Tier CH — xmd help ... ok (20s) -running 1 test from ./packages/cli/tests/command.test.ts -Tier XC — the xmd command ... - XC1: with no adapter installed, command reports that rather than guessing ... ok (2ms) - XC2: an adapter appends the arguments it is given ... ok (1ms) - XC3: ordinary middleware wraps the entrypoint's base provider ... ok (0ms) - XC4: this runtime's entrypoint relaunches a worker from another directory ... -------- post-test output ------- -# Test-agent smoke - -One complete availability/session/prompt/text/teardown path through the -real ACPX runtime and a real `xmd test-agent` worker. - - - - - - - - - - - - -> ✅ **AssertStringIncludes** passed -> actual: "\n\nThe review of **packages/core** at `abc123` passed.\n\n" -> expected: "The review of **packages/core** at `abc123` passed." - - -> ✅ **AssertStringIncludes** passed -> actual: "\n\nThe review of **packages/core** passed.\n" -> expected: "The review of **packages/core** passed." - - - - `` has a second placement. Written as a declaration inside an - `` it scripts the agent a *child* document reaches, and - `` says what the child's elicitations are answered with. The child - below is written the way an ordinary document is — it asks an agent to review - a change, then asks a person whether to accept the answer — and nothing in it - knows it is under test. The declarations are what make it deterministic. - - The child is written here rather than referenced, because a target resolves - from the working directory and this document is run from several. - - - - - A bound execution keeps its assertion body to itself, so what the child - produced is shown here, where the person running this can read it: - - -The review is one conversation, so it is sent inside a named session. - - - - - - - -The review of **packages/core** at `abc123` passed. - - - -Now the decision, which only a person can make. - - - -You chose to approve the review. - - - ------ post-test output end ----- - XC4: this runtime's entrypoint relaunches a worker from another directory ... ok (7s) -Tier XC — the xmd command ... ok (7s) -running 1 test from ./packages/cli/tests/compiled-upgrade.test.ts -Tier UH — the compiled upgrade host ... - UH1: every platform maps to the exact artifact the release publishes ... ok (2ms) - UH2: only an eligible compiled host carries the components at all ... ok (0ms) - UH3: a successful upgrade replaces the bytes once and reports the facts ... ok (325ms) - UH4: --status reads metadata and touches the installation not at all ... ok (41ms) - UH5: an exact tag reads the tag endpoint and installs that release ... ok (152ms) - UH6: a tag GitHub does not publish is a missing release, not a broken read ... ok (40ms) - UH7: a draft never reaches installation, however it is selected ... ok (172ms) - UH8: metadata that is malformed, oversized or incomplete is refused as such ... ok (152ms) - UH9: a release missing this target's binary or its checksums is refused ... ok (70ms) - UH10: a checksum set must name this binary exactly once ... ok (98ms) - UH11: a checksum mismatch stops before the candidate is made executable ... ok (45ms) - UH12: a candidate that does not report the selected version never replaces anything ... ok (248ms) - UH13: stdout is the version only after its own terminal line ending ... ok (174ms) - UH14: a download that leaves the GitHub boundary is refused, however it leaves ... ok (212ms) - UH15: GitHub's own signed delivery host is followed, and only so far ... ok (185ms) - UH16: a download that is short, oversized or interrupted never installs ... ok (189ms) - UH17: a failed replacement leaves the original byte-identical ... ok (131ms) - UH18: an invoked symbolic link is refused rather than followed ... ok (25ms) - UH19: a destination that is not a regular file is refused ... ok (24ms) - UH20: an unwritable installation directory is refused before the network ... ok (22ms) - UH21: a second upgrade of the same installation waits for nobody ... -------- post-test output ------- -held ------ post-test output end ----- - UH21: a second upgrade of the same installation waits for nobody ... ok (211ms) - UH22: cancelling before the commit keeps the original and leaves no candidate ... ok (48ms) - UH23: cancelling after the commit keeps the new binary ... ok (145ms) - UH24: the request never carries a credential or a caller's header ... ok (144ms) - UH25: only this invocation's own identities authorize a phase ... ok (3ms) - UH27: a redirect inside this repository is still bound to this exact download ... ok (82ms) - UH28: a release page URL that names another tag is not a release fact ... ok (157ms) - UH29: a host operation that throws becomes an answer, not a stack trace ... ok (249ms) - UH30: a lock this host cannot open is refused, not raised ... ok (27ms) - UH31: staging is owned only once its exclusive create has succeeded ... ok (52ms) - UH32: a chunk is written completely, however many writes that takes ... ok (0ms) - UH33: a sink that stops accepting bytes fails rather than truncating ... ok (0ms) - UH34: a candidate write that fails reaches the approved refusal, not a throw ... ok (37ms) - UH35: a probe name that belongs to somebody else is neither deleted nor replaced ... ok (41ms) - UH36: a healthy probe leaves neither name behind ... ok (133ms) - UH37: a cancelled download closes the candidate rather than only unlinking it ... ok (49ms) - UH39: a phase cannot be skipped, repeated or run out of order ... ok (100ms) - UH38: the command's own exit status follows the outcome ... -------- post-test output ------- -# Upgrade XMD - -Compares the installed XMD version with the selected release without downloading -a binary or changing the installation. - -## Select a release - -Reads release information from `taras/executable.md`. Ignores drafts and -releases with invalid tags. - -## Release status - -The installed and selected versions were compared using semantic version -precedence. - -Installed version: 0.10.2 -Selected release: v0.11.0 (newer) -Release notes: https://github.com/taras/executable.md/releases/tag/v0.11.0 -No files were changed. -# Upgrade XMD - -Compares the installed XMD version with the selected release without downloading -a binary or changing the installation. - -## Select a release - -Reads release information from `taras/executable.md`. Ignores drafts and -releases with invalid tags. - -## Release status - -The installed and selected versions were compared using semantic version -precedence. - -Installed version: 0.10.2 -Selected release: v0.11.0 (newer) -Release notes: https://github.com/taras/executable.md/releases/tag/v0.11.0 -No files were changed. -# Upgrade XMD ------ post-test output end ----- - UH38: the command's own exit status follows the outcome ... ok (106ms) -Tier UH — the compiled upgrade host ... ok (3s) -running 1 test from ./packages/cli/tests/document-suites/inline/inline-markdown.test.ts -Tier IE — checked-in Markdown suite ... - runs Inline.test.md once under the production run host ... ok (949ms) -Tier IE — checked-in Markdown suite ... ok (950ms) -running 1 test from ./packages/cli/tests/document-suites/plan/plan-markdown.test.ts -Tier PMT — checked-in Markdown suite ... - runs Plan.test.md once under the production run host ...'Tier PMT — checked-in Markdown suite' has been running for over (1m0s) - ok (1m41s) -Tier PMT — checked-in Markdown suite ... ok (1m41s) -running 1 test from ./packages/cli/tests/document-suites/props/props-markdown.test.ts -Tier PC — checked-in Markdown suite ... - runs Props.test.md once under the production run host ... ok (731ms) -Tier PC — checked-in Markdown suite ... ok (733ms) -running 1 test from ./packages/cli/tests/document-suites/syntax/syntax-markdown.test.ts -Tier SM — checked-in Markdown suite ... - runs Syntax.test.md once under the production run host ... ok (4s) -Tier SM — checked-in Markdown suite ... ok (4s) -running 1 test from ./packages/cli/tests/document-suites/targets/targets-markdown.test.ts -Tier CT — checked-in Markdown suite ... - runs Targets.test.md once under the production run host ... ok (1s) -Tier CT — checked-in Markdown suite ... ok (1s) -running 1 test from ./packages/cli/tests/document-suites/verbose/verbose-markdown.test.ts -Tier VB — checked-in Markdown suite ... - runs Verbose.test.md once under the production run command ... ok (6s) -Tier VB — checked-in Markdown suite ... ok (6s) -running 3 tests from ./packages/cli/tests/evaluate-component.test.ts -Tier FE — the ordinary run profile ... - FE21: `xmd run` states a profile, and a fragment reads the caller's files ... -------- post-test output ------- - - -"the retained note\n\n" ------ post-test output end ----- - FE21: `xmd run` states a profile, and a fragment reads the caller's files ... ok (818ms) - FE5: the ordinary profile admits writes and deletions, and nothing else ... -------- post-test output ------- - - - -done ------ post-test output end ----- - FE5: the ordinary profile admits writes and deletions, and nothing else ... ok (826ms) - FE21: a fragment searches and reads through the profile's own operations ... -------- post-test output ------- - - -"\n[\n \"doc.md\",\n \"notes.md\"\n]\n" ------ post-test output end ----- - FE21: a fragment searches and reads through the profile's own operations ... ok (834ms) - FE21: a fragment cannot reach an operation the ordinary profile withheld ... -------- post-test output ------- -a generated fragment names a component this host did not admit. ------ post-test output end ----- - FE21: a fragment cannot reach an operation the ordinary profile withheld ... ok (1s) -Tier FE — the ordinary run profile ... ok (3s) -Tier FE — the one spelling this host accepts ... - FE19: every profile refuses `source`, which is no longer a spelling ... -------- post-test output ------- -Prop validation failed for : - - "/source" must NOT have additional properties ------ post-test output end ----- - FE19: every profile refuses `source`, which is no longer a spelling ... ok (828ms) - FE19: every profile refuses `program`, which was never released ... -------- post-test output ------- -Prop validation failed for : - - "/program" must NOT have additional properties ------ post-test output end ----- - FE19: every profile refuses `program`, which was never released ... ok (833ms) -Tier FE — the one spelling this host accepts ... ok (1s) -Tier FE — what the source symbols report ... - FE28: source symbols carry `Evaluate` with a protected origin ... ok (159ms) - FE28: no host bootstrap is needed to make the name available ... ok (88ms) -Tier FE — what the source symbols report ... ok (247ms) -running 1 test from ./packages/cli/tests/evaluate-workflow.test.ts -Tier FE — the workflow host's profile ... - FE22: the directory capability is the host's, and Git is what supplies it ... ok (17ms) - FE23: Git's directory entry is the exact identity retained history holds ... ok (1ms) - FE19: `source` and `text` behave identically here, and neither warns ... ok (131ms) - FE19: `program` is a spelling no profile has ... ok (26ms) - FE21: the workflow fragment reaches the run's Workspace, not the caller's disk ... ok (42ms) - FE20: a request outside the stated ceiling is refused, and none is admitted by default ... ok (40ms) -Tier FE — the workflow host's profile ... ok (263ms) -running 1 test from ./packages/cli/tests/fetch-cli.test.ts -Tier FT — diagnostic retention of a Fetch ... - FTC1: a run without --journal performs the request and keeps nothing ... -------- post-test output ------- -# Reads - - ------ post-test output end ----- - FTC1: a run without --journal performs the request and keeps nothing ... ok (855ms) - FTC2: a run with --journal retains the normalized request and the response ... -------- post-test output ------- -# Reads - - ------ post-test output end ----- - FTC2: a run with --journal retains the normalized request and the response ... ok (850ms) -Tier FT — diagnostic retention of a Fetch ... ok (1s) -running 1 test from ./packages/cli/tests/file-stream.test.ts -FileStream ... - writes exactly the bytes the shared serializer produces ... ok (6ms) - reads back every appended event in append order ... ok (2ms) -FileStream ... ok (15ms) -running 1 test from ./packages/cli/tests/github-zero-effect.test.ts -describing the bundled profile costs nothing ... - renders the syntax catalog without reading GitHub configuration ... ok (186ms) - validates a Plan draft without reading GitHub configuration ... ok (244ms) - refuses the same draft when the Git Plugin is not in the profile ... ok (79ms) -describing the bundled profile costs nothing ... ok (513ms) -running 1 test from ./packages/cli/tests/inline-cli.test.ts -Tier IE — inline root documents ... - IE1: both command forms run the same document ... -------- post-test output ------- -# Hello# Hello----- post-test output end ----- - IE1: both command forms run the same document ... ok (1s) - IE2: a path and --eval together name two root documents ... -------- post-test output ------- -README.md and --eval both supply a root document — a run takes exactly one, either `xmd run README.md` or `xmd run -e ''` ------ post-test output end ----- - IE2: a path and --eval together name two root documents ... ok (672ms) - IE3: --eval given twice fails ... -------- post-test output ------- ---eval was given more than once — a run has exactly one root document ------ post-test output end ----- - IE3: --eval given twice fails ... ok (604ms) - IE4: --eval with no value fails ... -------- post-test output ------- ---eval requires a markdown document — write `-e ''` ------ post-test output end ----- - IE4: --eval with no value fails ... ok (613ms) - IE5: `-e -` does not read stdin ... ok (598ms) - IE6: the alias has no inline value form ... -------- post-test output ------- --e takes a separate value — write `-e ` or `--eval=` ------ post-test output end ----- - IE6: the alias has no inline value form ... ok (607ms) - IE7: no source at all fails, in both command forms ... -------- post-test output ------- -xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` -xmd run requires a root document — `xmd run `, `xmd run -`, or `xmd run --eval ''` ------ post-test output end ----- - IE7: no source at all fails, in both command forms ... ok (1s) - IE8: a numeric document is text, not a number ... -------- post-test output ------- -42----- post-test output end ----- - IE8: a numeric document is text, not a number ... ok (815ms) - IE9: a document that reads like an option is still a document ... -------- post-test output ------- ---props-h----- post-test output end ----- - IE9: a document that reads like an option is still a document ... ok (1s) - IE10: the token after --eval is taken verbatim ... -------- post-test output ------- ---verbose- item----- post-test output end ----- - IE10: the token after --eval is taken verbatim ... ok (1s) - IE11a: --eval accepts an explicitly empty value ... ok (815ms) - IE12: inline frontmatter declares properties ... -------- post-test output ------- - -Hello Ada -Hello Grace -Hello Alan----- post-test output end ----- - IE12: inline frontmatter declares properties ... ok (2s) - IE13: help describes the inline source and the document's properties ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - IE13: help describes the inline source and the document's properties ... ok (640ms) - IE14: an inline value root prints only its JSON result ... -------- post-test output ------- -{"ok":true} -[yield] import_component:__root__ → ok { path: '' } - -rendered body - -[close] root → ok -{"ok":true} ------ post-test output end ----- - IE14: an inline value root prints only its JSON result ... ok (1s) - IE17: repository components resolve from the invocation directory ... -------- post-test output ------- -Hello from a component - -Hello from a component - ------ post-test output end ----- - IE17: repository components resolve from the invocation directory ... ok (1s) - IE25: repeated includes are searched in caller order, replacing the defaults ... -------- post-test output ------- -from the first include - ------ post-test output end ----- - IE25: repeated includes are searched in caller order, replacing the defaults ... ok (829ms) - IE18: running an inline document leaves the directory as it was ... -------- post-test output ------- -Hello from a component - ------ post-test output end ----- - IE18: running an inline document leaves the directory as it was ... ok (841ms) - IE19: --journal records the supplied identity and text ... -------- post-test output ------- -# Hello ------ post-test output end ----- - IE19: --journal records the supplied identity and text ... ok (831ms) - IE20: ordinary run flags apply to an inline document ... -------- post-test output ------- -[yield] import_component:__root__ → ok { path: '' } -[close] root → ok -# Hello----- post-test output end ----- - IE20: ordinary run flags apply to an inline document ... ok (826ms) - IE21: inline documents are exclusive to xmd run ... -------- post-test output ------- -unrecognized option for xmd test: --eval — inline documents are exclusive to xmd run ------ post-test output end ----- - IE21: inline documents are exclusive to xmd run ... ok (594ms) - IE22: inline help describes properties and offers no target section ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - IE22: inline help describes properties and offers no target section ... ok (639ms) - IE29: the shorthand form runs the file named `-`, not stdin ... ok (1s) - IE30: a reference selects a section of that file, not stdin ... ok (794ms) - IE31: another command's `-` keeps that command's meaning ... ok (618ms) - IE24: an uncaught failure exits 1 with the prefix kept and one diagnostic ... -------- post-test output ------- -PREFIX-PROSE - -stage classifier failed ------ post-test output end ----- - IE24: an uncaught failure exits 1 with the prefix kept and one diagnostic ... ok (825ms) -Tier IE — inline root documents ... ok (25s) -running 1 test from ./packages/cli/tests/launch-timeout.test.ts -Harness deadline — an abandoned xmd run keeps its account ... - the failure names the deadline and carries both channels ... -------- post-test output ------- -lingering-outlingering-err----- post-test output end ----- - the failure names the deadline and carries both channels ... ok (10s) -Harness deadline — an abandoned xmd run keeps its account ... ok (10s) -running 1 test from ./packages/cli/tests/packaged-document.test.ts -packaged documents ... - reads the plan command document from beside its module, whatever the cwd is ... ok (9ms) - reads the packaged Component from beside its module, whatever the cwd is ... ok (5ms) - reads the upgrade command document from beside its module too ... ok (3ms) - says which build is missing a document rather than behaving differently ... ok (1ms) -packaged documents ... ok (19ms) -running 1 test from ./packages/cli/tests/plan-args.test.ts -Tier PR — xmd plan fixed grammar ... - PS1: exactly one request, kept byte for byte ... ok (3ms) - PS1: every retained option is accepted, before and after the request ... ok (1ms) - PS2: every --run spelling reports the migration, and establishes nothing ... ok (1ms) - PS3: every other removed option reports the one generic refusal ... ok (2ms) - PO7: the two authorship options are accepted, and their aliases are not ... ok (1ms) - PO7: an option that reaches this grammar after --journal is that option, not a path ... ok (1ms) - PS2/PS3: the removal is decidable beside --help, in either order ... ok (0ms) - PS3: a name that merely begins like a property option is an unknown one ... ok (1ms) - PS3: an option this command does not define is refused, not dropped ... ok (0ms) -Tier PR — xmd plan fixed grammar ... ok (16ms) -running 2 tests from ./packages/cli/tests/plan-cli.test.ts -Tier PR — the xmd plan command lifecycle ... - PS4: plan help states the retained grammar and both compositions ... -------- post-test output ------- -Usage: xmd plan [OPTIONS] [request] - -Arguments: - [request] the request the coding agent should turn into an XMD Plan - -Options: - --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) - --session [SESSION] logical name for the assistant session (default: unique to this invocation) - --verbose show generated drafts and XMD check diagnostics on stderr [default: false] - --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) - --include ... component search directory [default: components,.] - --agent-provider agent provider for Plan authorship [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one request is required. It describes the program you want the coding -agent to create, rather than a path. Quote it so the shell passes it as one -argument: - xmd plan "Prepare the release program." - -A first-party command document turns the request into an XMD Plan. xmd checks -each draft, and you approve, request changes, or stop before source leaves the -command. - -The approved Plan is the only result. Without --output, stdout contains its -exact source bytes and nothing else. With --output, the path is created -exclusively after approval; an existing path is left unchanged. - -Planning never runs the approved program. Compose planning and execution -explicitly through standard input: - xmd plan "Prepare the release program." | xmd run - - -Or preserve the artifact and run it later: - xmd plan "Prepare the release program." --output release.md && xmd run release.md - -A named --session continues the planning conversation. Without it, this -invocation uses a unique session. - -Secret detection checks journal entries before they are recorded, but it may not -catch every sensitive detail. The journal can contain prompts, drafts, and review -answers. -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - PS4: plan help states the retained grammar and both compositions ... ok (1s) - PS5: xmd run --help still exposes every option it configures ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by greeter.md - - --props-name - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - PS5: xmd run --help still exposes every option it configures ... ok (1s) - PS2: every --run spelling reports the migration and reaches nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd plan --run was removed because xmd plan only produces approved source. -Run the program explicitly: - xmd plan "..." | xmd run - - xmd plan "..." --output release.md && xmd run release.md ------ post-test output end ----- - PS2: every --run spelling reports the migration and reaches nothing ... ok (12s) - PS3: every other removed option refuses before authorship ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --timeout-exec — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --timeout-fetch — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --approve-all — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --deny-all — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --no-secret-detection — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --props — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --props-name — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --no-props-loud — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --timeout-exec — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --secret-detection — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --raw — configure the program when you run the approved source with xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --propspective -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --no-propspective -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --no-props ------ post-test output end ----- - PS3: every other removed option refuses before authorship ... ok (22s) - PS1: exactly one request, and an unknown option is refused not dropped ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized argument for xmd plan: second — the command takes exactly one request -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --not-a-thing -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --save — the approved Plan goes to stdout, and --output writes it to a file -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---session needs a name — write `--session ` or leave it out for a session unique to this invocation ------ post-test output end ----- - PS1: exactly one request, and an unknown option is refused not dropped ... ok (5s) - PS1: inline source is refused before any phase begins ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --eval — inline documents are exclusive to xmd run -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --eval — inline documents are exclusive to xmd run ------ post-test output end ----- - PS1: inline source is refused before any phase begins ... ok (2s) - PS1: the retired spelling names no command and reaches no authorship ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd prompt is not a command — use `xmd plan ""` to create a Plan, or `xmd run ./prompt` to run a document named `prompt` ------ post-test output end ----- - PS1: the retired spelling names no command and reaches no authorship ... ok (1s) - PS1: the retired token is refused before it can be read as a document path ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd prompt is not a command — use `xmd plan ""` to create a Plan, or `xmd run ./prompt` to run a document named `prompt` -# Retired token probe - - ------ post-test output end ----- - PS1: the retired token is refused before it can be read as a document path ... ok (2s) - PS6: approval writes the exact source once to stdout, and runs none of it ... ok (289ms) - PS7: --output creates the artifact after teardown, and never replaces one ... ok (362ms) - PS8: a Plan declaring a required root property is produced with no value ... ok (184ms) - PS9: every ending but approval delivers nothing at all ... ok (1s) - PS10: a named session continues the conversation and still starts no program ... ok (325ms) - PS12: the shipped documentation states what each command does ... ok (8ms) - PS9: --timeout bounds the whole invocation, and it is the only deadline ... -------- post-test output ------- ---timeout must be a duration like 500ms, 30s, or 5min, got "abc" -the run exceeded its --timeout of 1ms and was cancelled ------ post-test output end ----- - PS9: --timeout bounds the whole invocation, and it is the only deadline ... ok (1s) -Tier PR — the xmd plan command lifecycle ... ok (53s) -Tier PO — observable xmd plan authorship ... - PO6: progress is stderr's and the approved bytes are stdout's ... ok (525ms) - PO7: both authorship options work either side of the request; the aliases do not ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - -## Preparing the Plan - -Getting the available XMD components and constructs and setting up the planning session. -agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-08bd3bde-7a97-4245-84b1-9942aefa9678/home/.xmd/plan/sessions/480ca01eacebf92e5130376305a1bc81d95f3ffffb9c285ae6afdcf3d0c46417; Failed to spawn agent command: xmd-nonexistent-agent) - -## Preparing the Plan - -Getting the available XMD components and constructs and setting up the planning session. -agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-08bd3bde-7a97-4245-84b1-9942aefa9678/home/.xmd/plan/sessions/b3cf9845c7a6aa797a0f4d107681890ec8d3da0a2abb93a96942e403f934e407; Failed to spawn agent command: xmd-nonexistent-agent) -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: -V — write `--verbose` -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: -j — write `--journal ` -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd plan: --trace ------ post-test output end ----- - PO7: both authorship options work either side of the request; the aliases do not ... ok (6s) - PO7: a retained option written where the journal path goes refuses before any phase ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm ---journal needs a path — write `--journal ` or leave it out to record no journal -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd plan [OPTIONS] [request] - -Arguments: - [request] the request the coding agent should turn into an XMD Plan - -Options: - --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) - --session [SESSION] logical name for the assistant session (default: unique to this invocation) - --verbose show generated drafts and XMD check diagnostics on stderr [default: false] - --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) - --include ... component search directory [default: components,.] - --agent-provider agent provider for Plan authorship [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one request is required. It describes the program you want the coding -agent to create, rather than a path. Quote it so the shell passes it as one -argument: - xmd plan "Prepare the release program." - -A first-party command document turns the request into an XMD Plan. xmd checks -each draft, and you approve, request changes, or stop before source leaves the -command. - -The approved Plan is the only result. Without --output, stdout contains its -exact source bytes and nothing else. With --output, the path is created -exclusively after approval; an existing path is left unchanged. - -Planning never runs the approved program. Compose planning and execution -explicitly through standard input: - xmd plan "Prepare the release program." | xmd run - - -Or preserve the artifact and run it later: - xmd plan "Prepare the release program." --output release.md && xmd run release.md - -A named --session continues the planning conversation. Without it, this -invocation uses a unique session. - -Secret detection checks journal entries before they are recorded, but it may not -catch every sensitive detail. The journal can contain prompts, drafts, and review -answers. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd plan [OPTIONS] [request] - -Arguments: - [request] the request the coding agent should turn into an XMD Plan - -Options: - --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) - --session [SESSION] logical name for the assistant session (default: unique to this invocation) - --verbose show generated drafts and XMD check diagnostics on stderr [default: false] - --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) - --include ... component search directory [default: components,.] - --agent-provider agent provider for Plan authorship [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one request is required. It describes the program you want the coding -agent to create, rather than a path. Quote it so the shell passes it as one -argument: - xmd plan "Prepare the release program." - -A first-party command document turns the request into an XMD Plan. xmd checks -each draft, and you approve, request changes, or stop before source leaves the -command. - -The approved Plan is the only result. Without --output, stdout contains its -exact source bytes and nothing else. With --output, the path is created -exclusively after approval; an existing path is left unchanged. - -Planning never runs the approved program. Compose planning and execution -explicitly through standard input: - xmd plan "Prepare the release program." | xmd run - - -Or preserve the artifact and run it later: - xmd plan "Prepare the release program." --output release.md && xmd run release.md - -A named --session continues the planning conversation. Without it, this -invocation uses a unique session. - -Secret detection checks journal entries before they are recorded, but it may not -catch every sensitive detail. The journal can contain prompts, drafts, and review -answers. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd plan [OPTIONS] [request] - -Arguments: - [request] the request the coding agent should turn into an XMD Plan - -Options: - --output [OUTPUT] write the approved source here instead of to stdout (path must not exist) - --session [SESSION] logical name for the assistant session (default: unique to this invocation) - --verbose show generated drafts and XMD check diagnostics on stderr [default: false] - --journal [JOURNAL] record the planning process as diagnostic JSONL (path must not exist) - --include ... component search directory [default: components,.] - --agent-provider agent provider for Plan authorship [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --timeout [TIMEOUT] deadline for the whole planning invocation, as a duration (500ms, 30s, 5min) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one request is required. It describes the program you want the coding -agent to create, rather than a path. Quote it so the shell passes it as one -argument: - xmd plan "Prepare the release program." - -A first-party command document turns the request into an XMD Plan. xmd checks -each draft, and you approve, request changes, or stop before source leaves the -command. - -The approved Plan is the only result. Without --output, stdout contains its -exact source bytes and nothing else. With --output, the path is created -exclusively after approval; an existing path is left unchanged. - -Planning never runs the approved program. Compose planning and execution -explicitly through standard input: - xmd plan "Prepare the release program." | xmd run - - -Or preserve the artifact and run it later: - xmd plan "Prepare the release program." --output release.md && xmd run release.md - -A named --session continues the planning conversation. Without it, this -invocation uses a unique session. - -Secret detection checks journal entries before they are recorded, but it may not -catch every sensitive detail. The journal can contain prompts, drafts, and review -answers. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - -## Preparing the Plan - -Getting the available XMD components and constructs and setting up the planning session. -agent "xmd-nonexistent-agent" is unavailable [ACP_BACKEND_UNAVAILABLE]: embedded ACP runtime probe failed (agent=xmd-nonexistent-agent; command=xmd-nonexistent-agent; cwd=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-plan-26a65308-ec39-4715-92fa-3705adeeaf81/home/.xmd/plan/sessions/664798881d1c949818b4f00fe68850eef119e5868e67c557bb7b48b1aa80dcdf; Failed to spawn agent command: xmd-nonexistent-agent) -Journal file already exists: kept.jsonl. Choose a different --journal path. ------ post-test output end ----- - PO7: a retained option written where the journal path goes refuses before any phase ... ok (15s) - PO8: no journal writes no file, and one records authorship as ordinary JSONL ... ok (448ms) - PO9: an existing journal is refused untouched, before anything else happens ... ok (5ms) - PO10: a secret in a draft reaches neither the progress nor the journal ... ok (240ms) - PI12: the journal holds the complete request and its findings, as data ... ok (204ms) - PI12: a secret in the findings stops before they are disclosed ... ok (79ms) - PO11: a secret in a failed check's diagnostics is kept out of both, too ... ok (236ms) - PO12: an entry the journal will not take ends authorship and keeps the prefix ... ok (58ms) - PO16: an ordinary failure leaves a whole, readable journal behind ... ok (59ms) - PO13: a progress destination that fails cancels authorship and delivers nothing ... ok (53ms) - PO14: every existing ending keeps its order, and progress claims no delivery ... ok (217ms) - PO15: the catalog is built once, from inside the command document ... ok (162ms) -Tier PO — observable xmd plan authorship ... ok (24s) -running 4 tests from ./packages/cli/tests/plan-command-document.test.ts -the packaged plan command document ... - C2: returns the approved candidate's exact bytes and never reaches exhaustion ... ok (168ms) - C9: every conditional branch of the review schema declares its own type ... ok (67ms) - PO1: every phase precedes the work it announces, and arrives while it runs ... ok (64ms) - PO1: an early phase reaches the operator while the turn is still blocked ... ok (47ms) - PO2: repair and attempt counters come from the document's own bounds ... ok (123ms) - PO2: the attempt counter reaches the tenth and stops there ... ok (207ms) - PO3: Stop announces itself before teardown and keeps its exact diagnostic ... ok (57ms) - PO3: exhaustion announces itself, explains once, and asks nobody anything ... ok (562ms) - PO5: default progress discloses nothing, and verbose adds exactly two blocks ... ok (133ms) - PO15: the packaged adapter builds the catalog once, and says nothing itself ... ok (52ms) -the packaged plan command document ... ok (1s) -Tier PI — read-only information requests ... - PI2, PI12: findings reach the next turn, and default progress says only how many ... ok (68ms) - PI12: verbose adds the complete request and findings, after they settle ... ok (71ms) - PI10: a refused request is one safe retry, and names no host detail ... ok (61ms) - PI7: successes and refusals share one budget, and the ninth is not evaluated ... ok (132ms) - PI7: requests interleave with the initial, repair and revision turns ... ok (111ms) - PI1: named documentation comes back, then an ordinary Plan ... ok (64ms) - PI10: an unknown documented name is one retry, not a stopped invocation ... ok (62ms) - PI2: an empty match renders as an empty array ... ok (61ms) - PI4: a prohibited operation anywhere in the request refuses before any read ... ok (59ms) - PI6, PI12: nothing is disclosed or asked until the request has settled ... ok (66ms) - PI12: a secret in the findings ends the run before anything is disclosed ... ok (49ms) - PI6: findings and the following turn wait for cleanup to finish ... ok (66ms) - PI6: a recoverable refusal is disclosed, then the following turn begins ... ok (64ms) - PI3: a titled draft is never evaluated ... ok (49ms) -Tier PI — read-only information requests ... ok (988ms) -Tier PI — the ordinary ceiling admits the question with the write ... - EL1: the ordinary write table holds canonical `` once, and the read table none ... ok (1ms) - EL3: a read-only information request that asks a question is refused whole ... ok (57ms) -Tier PI — the ordinary ceiling admits the question with the write ... ok (59ms) -the scripted agent ... - fails loudly on a turn nobody scripted, naming it ... ok (47ms) -the scripted agent ... ok (48ms) -running 3 tests from ./packages/cli/tests/plan-component.test.ts -Tier PC — in an ordinary document ... - PC1: the body is the Prompt, and the approved bytes arrive under `as` ... ok (177ms) - PC1b: the packaged Plan writes the public , and its catalog reaches the first turn once ... ok (79ms) - PC1c: a catalog reference that fails reaches no session, turn, review or Plan ... ok (40ms) - PC2: the Prompt is not emitted, and no Plan source is printed ... ok (60ms) - PC3: an empty Prompt reaches no catalog, session, turn or review ... ok (32ms) - PC4: a body that fails reaches no preparation at all ... ok (29ms) - PC5: a host whose provider gives no Agent context refuses before placement ... ok (32ms) - PC6: the private capabilities resolve nowhere a document can write ... ok (160ms) - PC6b: the two information privates declare the contract they were accepted under ... ok (0ms) - Tier PI — information requests from an embedded ... - PI4: an embedded Plan reads through the document host's own profile ... ok (76ms) - PI12: an embedded request emits no command progress into the document ... ok (70ms) - PI4: a prohibited operation in the request refuses with no effect ... ok (68ms) - PI8: a completed request replays with every live reader tripped ... ok (90ms) - PI8: a partial continuation resumes at the first unrecorded effect ... ok (120ms) - PI8: a retained selection refusal restores without asking the provider again ... ok (125ms) - PI8: a changed request refuses rather than resuming ... ok (90ms) - Tier PI — information requests from an embedded ... ok (640ms) - PC7: the catalog advertises and none of its private names ... ok (76ms) - PC7b: a repository file under a private name answers for nothing anywhere ... ok (133ms) - PC8: two sites are two conversations, and a default directory is handed back ... ok (81ms) - PC9: a completed authorship restores from the enclosing journal ... ok (94ms) - PC10: the turns belong to the enclosing journal, and no private one exists ... ok (50ms) - PC11: a Plan declaring required properties is admitted and returned ... ok (51ms) - PC12: a Plan that is not structurally a program binds nothing ... ok (58ms) - PC13: stopping is the Component's own ending, in its component words ... ok (50ms) - PC15: an omitted session's directory is handed back after teardown ... ok (50ms) - PC16: an authored session's directory is still there afterwards ... ok (47ms) - PC17: the same site and name continue the same placement ... ok (94ms) - PC18: two sites writing one name are two conversations ... ok (77ms) - PC19: the emitted source survives the CLI's own output normalization ... ok (51ms) - PO4: neither ordinary form emits a planning phase, whatever verbosity says ... ok (200ms) - PC20: the retained artifact carries the approved bytes and their digest ... ok (50ms) - PC21: a stopped Plan leaves no artifact for a later evaluation to begin from ... ok (49ms) - PC22: a completed Plan restores without authoring or admitting it again ... ok (90ms) - PC23: a continuation replays the retained root, so a changed body never runs ... ok (89ms) - PC24: instructions that render differently refuse in the frozen inputs ... ok (77ms) - PC25: a retained inputs record this version cannot read produces nothing ... ok (209ms) - PC27: the Plan's syntax record is core's closed record, and a hostile one produces nothing ... ok (179ms) - PC26: a retained artifact this version cannot read produces nothing ... ok (500ms) - PC14: nothing the Component does reaches the caller's filesystem ... ok (45ms) -Tier PC — in an ordinary document ... ok (3s) -Tier FE — Plan produces text, Evaluate runs it ... - FE22: the approved bytes are inert text `` then runs ... ok (51ms) - FE22: an approved program is not run when no `` is written ... ok (45ms) - FE8: a Plan inside `` is told the admitted vocabulary alone ... ok (59ms) - FE8: a fragment naming the wide-only component refuses with no operation ... ok (58ms) - FE9: a deferred Plan keeps its own site's wider vocabulary ... ok (61ms) - FE9: a later narrower Evaluate refuses text the wider site allowed ... ok (57ms) -Tier FE — Plan produces text, Evaluate runs it ... ok (331ms) -Tier MDK — the Plan declarations state their kind ... - MDK2: both constructors state kind component for the same packaged bytes ... ok (9ms) -Tier MDK — the Plan declarations state their kind ... ok (9ms) -running 1 test from ./packages/cli/tests/plan-host-acts.test.ts -Tier PH — the acts xmd plan performs as the host ... - PH1: opening the review form reaches a command the document cannot ... ok (271ms) -Tier PH — the acts xmd plan performs as the host ... ok (273ms) -running 1 test from ./packages/cli/tests/plan.test.ts -Tier PR — xmd plan writing a Plan ... - C2, C3, C14: the packaged program's own words ask for the document ... ok (264ms) - C3, C14: every turn that asks for a Plan states the whole requirement ... ok (196ms) - C4: one Session carries every turn, and --session names it ... ok (727ms) - C4, C13: a default session's directory belongs to its invocation ... -------- post-test output ------- -xmd plan stopped at your request. Nothing was output. -agent prompt failed with stop reason "refusal" ------ post-test output end ----- - C4, C13: a default session's directory belongs to its invocation ... ok (560ms) - C13: a default directory is handed back before final admission ... ok (76ms) - C4, C13: the namespace is the command's own, and the retired one is untouched ... -------- post-test output ------- -xmd plan stopped at your request. Nothing was output. ------ post-test output end ----- - C4, C13: the namespace is the command's own, and the retired one is untouched ... ok (211ms) - C5: the Plan writer profile's ceiling is the host's, and no flag widens it ... -------- post-test output ------- -the agent asked for permission to use a native tool, which this host grants to no agent. The request was denied and the turn it belongs to failed. ------ post-test output end ----- - C5: the Plan writer profile's ceiling is the host's, and no flag widens it ... ok (232ms) - C5: two cases' profile roots cannot see or remove one another ... ok (138ms) - C6: a candidate is inert until the approved document runs ... -------- post-test output ------- -xmd plan stopped at your request. Nothing was output. ------ post-test output end ----- - C6: a candidate is inert until the approved document runs ... ok (67ms) - C7: a candidate defect earns a repair turn ... ok (436ms) - C8: one base draft, three repairs, and ten presentations ... -------- post-test output ------- -xmd plan stopped at your request. Nothing was output. -xmd plan stopped at your request. Nothing was output. ------ post-test output end ----- - C8: one base draft, three repairs, and ten presentations ... ok (481ms) - C9: arbitrary source cannot close the presentation, and stopping is authored ... ok (860ms) - C3, C9: a tenth draft that cannot be repaired is explained automatically ... ok (635ms) - C10, C11: the approved bytes are what the command delivers ... -------- post-test output ------- -xmd plan stopped at your request. Nothing was output. ------ post-test output end ----- - C10, C11: the approved bytes are what the command delivers ... ok (219ms) - C10: the host's own gate refuses after the command document has settled ... ok (142ms) - C14: an interleaved Plan survives approval and delivery byte for byte ... ok (143ms) - C3, C9: what you read says each thing once, however many rounds it took ... ok (433ms) -Tier PR — xmd plan writing a Plan ... ok (5s) -running 9 tests from ./packages/cli/tests/plugin-cli.test.ts -PC1 — selected Plugins compose around the document, in the order written ... - nests two wrappers with the first one written outermost ... -------- post-test output ------- -one open - -two open - -document body - - -two close - - -one close ------ post-test output end ----- - nests two wrappers with the first one written outermost ... ok (733ms) - reverses the composition when the selection is reversed ... -------- post-test output ------- -two open - -one open - -document body - - -one close - - -two close ------ post-test output end ----- - reverses the composition when the selection is reversed ... ok (723ms) - projects the document once for each placeholder a wrapper writes ... -------- post-test output ------- -document body - - -document body - ------ post-test output end ----- - projects the document once for each placeholder a wrapper writes ... ok (717ms) - shows every Plugin the complete list, in the order it was written ... -------- post-test output ------- -active: @executablemd/git, active, wrapper-one - -one open - -document body - - -one close ------ post-test output end ----- - shows every Plugin the complete list, in the order it was written ... ok (718ms) - composes the root's metadata without touching anything else ... -------- post-test output ------- - -badge is authored - -badge is composed ------ post-test output end ----- - composes the root's metadata without touching anything else ... ok (1s) -PC1 — selected Plugins compose around the document, in the order written ... ok (4s) -PC2 — a Plugin declares components, and a checkout cannot answer for them ... - resolves a declared component, and leaves the checkout's own components alone ... -------- post-test output ------- -hello from the selected Plugin - - -the selected declaration, not the checkout's - - -an unrelated checkout component - ------ post-test output end ----- - resolves a declared component, and leaves the checkout's own components alone ... ok (908ms) - refuses two Plugins declaring one component name, before the document runs ... -------- post-test output ------- -"Greeting" was declared as Markdown twice. One execution declares a name once. ------ post-test output end ----- - refuses two Plugins declaring one component name, before the document runs ... ok (842ms) -PC2 — a Plugin declares components, and a checkout cannot answer for them ... ok (1s) -PC3 — a selection that cannot be honored costs nothing ... - refuses a module that exports no Plugin ... -------- post-test output ------- ---plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/no-default.mjs: a Plugin module's default export is a Plugin value; this module exports none ------ post-test output end ----- - refuses a module that exports no Plugin ... ok (813ms) - refuses a default export carrying no name ... -------- post-test output ------- ---plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/unnamed.mjs: a Plugin module's default export carries a non-empty string `name` ------ post-test output end ----- - refuses a default export carrying no name ... ok (592ms) - refuses a default export whose install is not callable ... -------- post-test output ------- ---plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/bad-install.mjs: a Plugin module's default export carries a callable `install`, and bad-install carries string ------ post-test output end ----- - refuses a default export whose install is not callable ... ok (600ms) - refuses a module that is not there ... -------- post-test output ------- ---plugin /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/absent.mjs could not be loaded: Module not found "file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/plugins/absent.mjs". ------ post-test output end ----- - refuses a module that is not there ... ok (664ms) - refuses two selections claiming one Plugin name ... -------- post-test output ------- -two selected Plugins are named wrapper-one. A Plugin name identifies one Plugin to this command, so the selection is refused before any of them is installed. ------ post-test output end ----- - refuses two selections claiming one Plugin name ... ok (595ms) - refuses a remote specifier without fetching anything ... -------- post-test output ------- ---plugin https://example.invalid/plugin.mjs could not be loaded: --plugin https://example.invalid/plugin.mjs names a remote module, and xmd loads no code over the network. Name a package installed where this command is running, or a path to a module on this filesystem. ------ post-test output end ----- - refuses a remote specifier without fetching anything ... ok (660ms) - refuses a selection with no value ... -------- post-test output ------- ---plugin names a module to load — write `--plugin ` or `--plugin=` ------ post-test output end ----- - refuses a selection with no value ... ok (656ms) -PC3 — a selection that cannot be honored costs nothing ... ok (4s) -PC4 — nothing is discovered, and nothing unselected runs ... - loads no external module when none was selected ... -------- post-test output ------- -document body ------ post-test output end ----- - loads no external module when none was selected ... ok (778ms) - leaves an unselected module beside a selected one inert ... -------- post-test output ------- -one open - -document body - - -one close ------ post-test output end ----- - leaves an unselected module beside a selected one inert ... ok (761ms) - loads nothing for help or the version ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. -0.13.1 ------ post-test output end ----- - loads nothing for help or the version ... ok (1s) - describes the option in its own help ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - describes the option in its own help ... ok (576ms) -PC4 — nothing is discovered, and nothing unselected runs ... ok (3s) -PC5 — a Plugin reads configuration, never document properties ... - reads every Config value the command line settled ... -------- post-test output ------- -verbose: false -timeout: undefined -timeoutExec: undefined -timeoutFetch: undefined - -document body -[yield] import_component:__root__ → ok { path: 'doc.md' } -[close] root → ok -verbose: true -timeout: 30000 -timeoutExec: 10000 -timeoutFetch: 5000 - -document body ------ post-test output end ----- - reads every Config value the command line settled ... ok (1s) - leaves root properties spelled like CLI options out of the configuration ... -------- post-test output ------- -verbose: false -timeout: undefined -timeoutExec: undefined -timeoutFetch: undefined - - -props are yes and 99s ------ post-test output end ----- - leaves root properties spelled like CLI options out of the configuration ... ok (870ms) -PC5 — a Plugin reads configuration, never document properties ... ok (2s) -PC6 — every surface of one command sees one vocabulary ... - describes a selected Plugin's declarations in xmd syntax ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `fixture/declaring/Greeting.md` (declared Markdown) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `fixture/declaring/Shadowed.md` (declared Markdown) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. ------ post-test output end ----- - describes a selected Plugin's declarations in xmd syntax ... ok (800ms) - describes the bundled vocabulary, and no unselected Plugin's, by default ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. ------ post-test output end ----- - describes the bundled vocabulary, and no unselected Plugin's, by default ... ok (805ms) - describes a structural construct a Plugin declared, and expands it in a run ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Frame the lines written inside it. - -**Syntax:** - -```md -… -``` - -**Forms:** `…` - -**Placement:** written wherever a document may write structure. - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The lines this banner frames. - -**Origin:** `fixture/structural` (installed structural syntax) - -### `` - -One line of a banner. - -**Syntax:** - -```md -… -``` - -**Forms:** `…` - -**Placement:** written directly inside ``, and nowhere else. - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The line's own content. - -**Origin:** `fixture/structural` (installed structural syntax) - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. -structural-fixture: expanded framed - ------ post-test output end ----- - describes a structural construct a Plugin declared, and expands it in a run ... ok (1s) - describes none of that construct where the Plugin was not selected ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. ------ post-test output end ----- - describes none of that construct where the Plugin was not selected ... ok (781ms) -PC6 — every surface of one command sees one vocabulary ... ok (3s) -PC9 — the review graph arrives only when it is selected ... - is absent from every command that would run it, until it is named ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. -Failed to import component Finding: Cannot resolve component: Finding (searched: components, .) ------ post-test output end ----- - is absent from every command that would run it, until it is named ... ok (1s) - arrives for run and syntax when it is named ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Flag new files whose names suggest a speculative abstraction. `` reports created TypeScript files named like factories, adapters or helpers, so a reviewer can ask what consumes them. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `pattern` | `string` | no | | -| `severity` | `string` | no | | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "pattern": { - "type": "string", - "default": "factory|abstract|base|provider|strategy|adapter|helper|util" - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string", - "default": "New abstraction files: {names}. Verify 3+ consumers." - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/AbstractionNames.md` (declared Markdown) - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Report structural bloat in a pull request. `` renders a Structural section covering unreferenced type and interface declarations, `any` density, empty function bodies, console statements and the sensor's structural signals. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `diagnostics` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "diagnostics": { - "type": "object" - } - }, - "required": [ - "pr", - "diagnostics" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/policies/BloatPolicy.md` (declared Markdown) - -### `` - -File and retire GitHub issues for the repository's worst cleanup clusters. `` keeps one labelled issue per file in the top five and closes the ones that dropped out. It does nothing without `GITHUB_TOKEN` and `GITHUB_REPOSITORY`. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `cleanupAnalysis` | `object` | yes | | -| `diagnostics` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "cleanupAnalysis": { - "type": "object" - }, - "diagnostics": { - "type": "object" - } - }, - "required": [ - "cleanupAnalysis", - "diagnostics" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/CleanupIssues.md` (declared Markdown) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Review the pull request's code comments for ones that only restate the code. `` asks the model in scope which are redundant, reads replies to earlier suggestions, and renders what remains outstanding. When findings remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/CommentReview.md` (declared Markdown) - -### `` - -Collect the pull request's existing review comments and replies. `` prepares the pairs and prior finding state used by review classification. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**`as`:** The normalized review-comment pairs, previous findings, and reply groups. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "pairs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "comment": { - "type": "string" - }, - "code": { - "type": "string" - }, - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - } - }, - "required": [ - "comment", - "code", - "file", - "lineNumber" - ], - "additionalProperties": false - } - }, - "hasPairs": { - "type": "boolean" - }, - "pairsText": { - "type": "string" - }, - "previousFindings": { - "type": "array", - "items": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - } - }, - "required": [ - "file", - "lineNumber" - ], - "additionalProperties": false - } - }, - "dismissedReplies": { - "type": "array", - "items": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - }, - "comment": { - "type": "string" - }, - "botCommentId": { - "type": "number" - }, - "replyText": { - "type": "string" - }, - "replyId": { - "type": "number" - }, - "alreadyProcessed": { - "type": "boolean" - } - }, - "required": [ - "file", - "lineNumber", - "replyText" - ], - "additionalProperties": false - } - }, - "repliesForClassification": { - "type": "array", - "items": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - }, - "comment": { - "type": "string" - }, - "botCommentId": { - "type": "number" - }, - "replyText": { - "type": "string" - }, - "replyId": { - "type": "number" - }, - "alreadyProcessed": { - "type": "boolean" - } - }, - "required": [ - "file", - "lineNumber", - "replyText" - ], - "additionalProperties": false - } - }, - "hasRepliesToClassify": { - "type": "boolean" - }, - "repliesText": { - "type": "string" - } - }, - "required": [ - "pairs", - "hasPairs", - "pairsText", - "previousFindings", - "dismissedReplies", - "repliesForClassification", - "hasRepliesToClassify", - "repliesText" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -Build the pending review-comment update from classified review data. `` decides which findings and dismissals remain. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `data` | `object` | yes | | -| `classificationResult` | `string` | yes | | -| `sampleResult` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "data": { - "type": "object" - }, - "classificationResult": { - "type": "string", - "default": "" - }, - "sampleResult": { - "type": "string", - "default": "" - } - }, - "required": [ - "pr", - "data", - "classificationResult", - "sampleResult" - ], - "additionalProperties": false -} -``` - -**`as`:** The checklist text, pending findings, and new dismissal replies. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "hasChecklist": { - "type": "boolean" - }, - "checklistMd": { - "type": "string" - }, - "hasFindings": { - "type": "boolean" - }, - "pendingFindings": { - "type": "array", - "items": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - }, - "comment": { - "type": "string" - }, - "code": { - "type": "string" - } - }, - "required": [ - "comment", - "code", - "file", - "lineNumber" - ], - "additionalProperties": false - } - }, - "newDismissReplies": { - "type": "array", - "items": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "lineNumber": { - "type": "number" - }, - "comment": { - "type": "string" - }, - "botCommentId": { - "type": "number" - }, - "replyText": { - "type": "string" - }, - "replyId": { - "type": "number" - }, - "alreadyProcessed": { - "type": "boolean" - } - }, - "required": [ - "file", - "lineNumber", - "replyText" - ], - "additionalProperties": false - } - } - }, - "required": [ - "hasChecklist", - "checklistMd", - "hasFindings", - "pendingFindings", - "newDismissReplies" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -Flag a change that mixes configuration and source edits. `` reports when both appear in a pull request larger than `minFiles`. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `minFiles` | `number` | no | | -| `severity` | `string` | no | | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "minFiles": { - "type": "number", - "default": 5 - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string", - "default": "PR mixes config and source changes." - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/ConfigSourceMix.md` (declared Markdown) - -### `` - -Answer this document's `` calls from DeepInfra. `…` handles samples that name that model and samples that name none, and passes the rest outward. It requires `DEEPINFRA_TOKEN`. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `model` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "model": { - "type": "string" - } - }, - "required": [ - "model" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose samples this provider answers. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/DeepInfraProvider.md` (declared Markdown) - -### `` - -Require a pull-request description that explains the change. `` reports a body shorter than `minLength`. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `minLength` | `number` | no | | -| `severity` | `string` | no | | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "minLength": { - "type": "number", - "default": 50 - }, - "severity": { - "type": "string", - "default": "error" - }, - "message": { - "type": "string", - "default": "PR description must explain what and why." - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/DescriptionCheck.md` (declared Markdown) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Inspect whether the checkout is ready for review analysis. `` reports pinned tool availability, TypeScript support, analyzed files, and actionable setup guidance. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `tsconfigPath` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "tsconfigPath": { - "type": "string", - "default": ".reviews/tsconfig.oxlint.json" - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**`as`:** The checkout readiness report used by review and repository analysis. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "oxlintInstalled": { - "type": "boolean" - }, - "oxlintVersion": { - "type": "string" - }, - "tsgolintInstalled": { - "type": "boolean" - }, - "tsgolintVersion": { - "type": "string" - }, - "tsconfigExists": { - "type": "boolean" - }, - "nodeModulesExists": { - "type": "boolean" - }, - "typeAwareAvailable": { - "type": "boolean" - }, - "filesAnalyzed": { - "type": "number" - }, - "filesSkipped": { - "type": "number" - }, - "importErrors": { - "type": "number" - }, - "availableRuleIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "bloatRulesAvailable": { - "type": "array", - "items": { - "type": "string" - } - }, - "bloatRulesMissing": { - "type": "array", - "items": { - "type": "string" - } - }, - "recommendation": { - "type": "string" - }, - "nativeSpecifiers": { - "type": "object", - "properties": { - "count": { - "type": "number" - }, - "files": { - "type": "array", - "items": { - "type": "string" - } - }, - "jsr": { - "type": "number" - }, - "npm": { - "type": "number" - } - }, - "required": [ - "count", - "files", - "jsr", - "npm" - ], - "additionalProperties": false - } - }, - "required": [ - "oxlintInstalled", - "oxlintVersion", - "tsgolintInstalled", - "tsgolintVersion", - "tsconfigExists", - "nodeModulesExists", - "typeAwareAvailable", - "filesAnalyzed", - "filesSkipped", - "importErrors", - "availableRuleIds", - "bloatRulesAvailable", - "bloatRulesMissing", - "recommendation", - "nativeSpecifiers" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Install the review's pinned Oxlint and tsgolint binaries. `` downloads them into the sensor directory and verifies each against a known checksum, so a review measures the version it expects. It fails on a platform it ships no build for. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `dir` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "dir": { - "type": "string", - "default": ".reviews/.oxlint" - } - }, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/EnsureOxlint.md` (declared Markdown) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Review a pull request for code that should not be there. `` asks the model in scope to weigh the sensor's violation density against the specific patterns behind it, and skips changes of twenty lines or fewer. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `diagnostics` | `object` | yes | | -| `doctor` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "diagnostics": { - "type": "object" - }, - "doctor": { - "type": "object" - } - }, - "required": [ - "pr", - "diagnostics", - "doctor" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/policies/ExtraneousCodePolicy.md` (declared Markdown) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Report one review finding. `` renders a severity icon and the message when `when` holds, and nothing when it does not — so a rule can be written unconditionally and stay quiet. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `when` | `boolean` | yes | | -| `severity` | `string` | no | | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "when": { - "type": "boolean" - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string" - } - }, - "required": [ - "when", - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Finding.md` (declared Markdown) - -### `` - -Reformat its content as Markdown. `…` renders the content, normalizes it through remark and trims the result. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown to reformat. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Format.md` (declared Markdown) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Authorize the GitHub requests made inside it. `…` adds a bearer token to requests to `api.github.com` over HTTPS and leaves every other host untouched. Without `GITHUB_TOKEN` it adds nothing and the requests still run. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose GitHub requests are authorized. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/GitHubAuth.md` (declared Markdown) - -### `` - -Publish the review as one comment on the pull request. `…` posts its content the first time and edits that same comment afterwards, so repeated runs leave one comment rather than a thread. It requires `GITHUB_REPOSITORY` and `PR_NUMBER`. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `marker` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "marker": { - "type": "string", - "default": "" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The comment body. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/GitHubComment.md` (declared Markdown) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Add a system prompt to the `` calls inside it. `…` appends to whatever instruction is already in scope, so an enclosing instruction is read first and nesting narrows rather than replaces. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `system` | `string` | yes | System prompt text. When Sample calls are made within this component's children, the text is included in the SampleContext.system field, which providers use as the system prompt. Multiple Instruction components accumulate — instructions from enclosing scopes appear first, inner instructions are appended. | - -```json -{ - "type": "object", - "properties": { - "system": { - "type": "string", - "description": "System prompt text. When Sample calls are made within this component's children, the text is included in the SampleContext.system field, which providers use as the system prompt. Multiple Instruction components accumulate — instructions from enclosing scopes appear first, inner instructions are appended.\n" - } - }, - "required": [ - "system" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose samples carry this instruction. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Instruction.md` (declared Markdown) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask a large change to link an issue. `` reports when the description names no issue and the change is bigger than that. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `whenLinesExceed` | `number` | no | | -| `severity` | `string` | no | | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "whenLinesExceed": { - "type": "number", - "default": 0 - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string", - "default": "Large PR with no linked issue." - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/LinkedIssue.md` (declared Markdown) - -### `` - -Ask a change that edits `package.json` to account for its dependencies. `` reports when the manifest moved and the description never mentions dependencies. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `severity` | `string` | no | | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string", - "default": "package.json changed without dependency justification." - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/NewDependencies.md` (declared Markdown) - -### `` - -Answer this document's `` calls from a local Ollama server. `…` handles samples that name that model and samples that name none, and passes the rest outward. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `model` | `string` | yes | | -| `baseUrl` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "model": { - "type": "string" - }, - "baseUrl": { - "type": "string", - "default": "http://localhost:11434" - } - }, - "required": [ - "model" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose samples this provider answers. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/OllamaProvider.md` (declared Markdown) - -### `` - -Write the TypeScript configuration the Oxlint sensor's type-aware pass reads. `` generates it in the checkout, so a type-aware run has a project to resolve against. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "default": ".reviews/tsconfig.oxlint.json" - } - }, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/OxlintConfig.md` (declared Markdown) - -### `` - -Run the review's pinned Oxlint sensor over selected files. `` returns normalized diagnostics and fails on a sensor crash or unusable output. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `files` | `array` | yes | | -| `typeAware` | `boolean` | no | | -| `tsconfigPath` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "files": { - "type": "array", - "items": { - "type": "string" - } - }, - "typeAware": { - "type": "boolean", - "default": false - }, - "tsconfigPath": { - "type": "string", - "default": ".reviews/tsconfig.oxlint.json" - } - }, - "required": [ - "files" - ], - "additionalProperties": false -} -``` - -**`as`:** The normalized Oxlint diagnostics for the selected files. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "ruleId": { - "type": "string" - }, - "severity": { - "type": "string" - }, - "file": { - "type": "string" - }, - "line": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "message", - "ruleId", - "severity", - "file", - "line", - "column" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -List one category of Oxlint diagnostics. `` names each rule with how often it fired and the first few files, and renders nothing when the category is empty. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `groups` | `array` | yes | | -| `label` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "groups": { - "type": "array" - }, - "label": { - "type": "string" - } - }, - "required": [ - "groups", - "label" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/OxlintSignals.md` (declared Markdown) - -### `` - -Report what the Oxlint sensor found. `` renders a Static Analysis section that says the sensor was unavailable rather than reporting a clean run it never measured, and notes type- aware rules that could not run. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `diagnostics` | `object` | yes | | -| `doctor` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "diagnostics": { - "type": "object" - }, - "doctor": { - "type": "object" - } - }, - "required": [ - "diagnostics", - "doctor" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/OxlintSummary.md` (declared Markdown) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Report added lines matching a regular expression. `` renders once at least `min` lines match, and substitutes the count into `{count}`. Test files are excluded unless `excludeTests` says otherwise. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `pattern` | `string` | yes | | -| `min` | `number` | no | | -| `excludeTests` | `boolean` | no | | -| `severity` | `string` | no | | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "pattern": { - "type": "string" - }, - "min": { - "type": "number", - "default": 1 - }, - "excludeTests": { - "type": "boolean", - "default": true - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string" - } - }, - "required": [ - "pr", - "pattern", - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Pattern.md` (declared Markdown) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Compose the whole pull-request review. `` renders the scope, structural, slop, static-analysis and correctness sections under one heading. When redundant comments remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `diagnostics` | `object` | yes | | -| `doctor` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "diagnostics": { - "type": "object" - }, - "doctor": { - "type": "object" - } - }, - "required": [ - "pr", - "diagnostics", - "doctor" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/PrPolicyReport.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Report when one pattern is too common relative to another. `` stays quiet until the denominator has at least `minDenominator` matches, so a small diff cannot trip it on one line. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `numerator` | `string` | yes | | -| `denominator` | `string` | yes | | -| `threshold` | `number` | yes | | -| `minDenominator` | `number` | no | | -| `excludeTests` | `boolean` | no | | -| `severity` | `string` | no | | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "numerator": { - "type": "string" - }, - "denominator": { - "type": "string" - }, - "threshold": { - "type": "number" - }, - "minDenominator": { - "type": "number", - "default": 10 - }, - "excludeTests": { - "type": "boolean", - "default": true - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string" - } - }, - "required": [ - "pr", - "numerator", - "denominator", - "threshold", - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Ratio.md` (declared Markdown) - -### `` - -Warn when release configuration changes without its specification. `` renders a warning if any release file changed and `specs/release-process-spec.md` did not. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `files` | `array` | yes | | - -```json -{ - "type": "object", - "properties": { - "files": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "files" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/ReleaseSpecWarning.md` (declared Markdown) - -### `` - -Explain the repository's top cleanup clusters. `` asks the model in scope why each already-ranked cluster matters and what to do about it, rather than re-ranking them. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `diagnostics` | `object` | yes | | -| `doctor` | `object` | yes | | -| `fileList` | `string` | yes | | -| `cleanupAnalysis` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "diagnostics": { - "type": "object" - }, - "doctor": { - "type": "object" - }, - "fileList": { - "type": "string" - }, - "cleanupAnalysis": { - "type": "object" - } - }, - "required": [ - "diagnostics", - "doctor", - "fileList" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/policies/RepoCleanupPolicy.md` (declared Markdown) - -### `` - -Compose the whole repository analysis. `` renders the static-analysis and cleanup sections. With the configured GitHub environment, it also creates, updates and closes cleanup issues for the five highest-ranked file clusters. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `diagnostics` | `object` | yes | | -| `doctor` | `object` | yes | | -| `fileList` | `string` | yes | | -| `fileCount` | `number` | yes | | -| `lineCount` | `number` | yes | | -| `cleanupAnalysis` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "diagnostics": { - "type": "object" - }, - "doctor": { - "type": "object" - }, - "fileList": { - "type": "string" - }, - "fileCount": { - "type": "number" - }, - "lineCount": { - "type": "number" - }, - "cleanupAnalysis": { - "type": "object" - } - }, - "required": [ - "diagnostics", - "doctor", - "fileList", - "fileCount", - "lineCount" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/RepoPolicyReport.md` (declared Markdown) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Inventory the repository source used by repository analysis. `` returns the selected paths and their file and line totals. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** The selected source paths and their file and line totals. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "fileList": { - "type": "array", - "items": { - "type": "string" - } - }, - "fileCount": { - "type": "number" - }, - "lineCount": { - "type": "number" - } - }, - "required": [ - "fileList", - "fileCount", - "lineCount" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -Build review context for the configured base and head revisions. `` returns pull-request metadata and changed file paths from the local Git checkout. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** The pull-request data and changed file paths for the configured revision range. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "changedFilePaths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "pr", - "changedFilePaths" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/code-review-agent` (reserved registration) - -### `` - -Render one section of a review, or say it found nothing. `…` prints the heading with whatever its content rendered, and prints the `clean` message when the content rendered nothing — so a section of quiet rules reads as a pass rather than as a blank. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `heading` | `string` | yes | | -| `clean` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "heading": { - "type": "string" - }, - "clean": { - "type": "string", - "default": "✅ No issues found." - } - }, - "required": [ - "heading" - ], - "additionalProperties": false -} -``` - -**Body context:** The findings that belong to this section. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/ReviewSection.md` (declared Markdown) - -### `` - -Prepare the checkout for a review run. `` installs the pinned Oxlint sensor and writes its configuration; with `pullModel` it also provisions the local Ollama model first. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pullModel` | `boolean` | no | | -| `model` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "pullModel": { - "type": "boolean", - "default": false - }, - "model": { - "type": "string", - "default": "qwen3:30b-a3b" - } - }, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/ReviewSetup.md` (declared Markdown) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask the model in scope for text. `Summarize what changed.` sends its content, or the `prompt` when written self-closing, to whichever provider is installed — and `model` picks between providers when more than one is. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `prompt` | `string` | no | Text prompt to send to the Sample Api. Used in self-closing mode when no children are provided. If both children and prompt are present, children output takes precedence. | -| `model` | `string` | no | Model routing key. When set, the SampleContext.model field is populated so the Sample Api middleware can route to a specific provider. When unset, the innermost active provider handles the call. | -| `params` | `string` | no | Additional instruction params passed to the Sample Api middleware as SampleContext.params. Providers can use this for custom behavior (e.g., "brief", "json", "classify"). | - -```json -{ - "type": "object", - "properties": { - "prompt": { - "type": "string", - "default": "", - "description": "Text prompt to send to the Sample Api. Used in self-closing mode when no children are provided. If both children and prompt are present, children output takes precedence.\n" - }, - "model": { - "type": "string", - "default": "", - "description": "Model routing key. When set, the SampleContext.model field is populated so the Sample Api middleware can route to a specific provider. When unset, the innermost active provider handles the call.\n" - }, - "params": { - "type": "string", - "default": "", - "description": "Additional instruction params passed to the Sample Api middleware as SampleContext.params. Providers can use this for custom behavior (e.g., \"brief\", \"json\", \"classify\").\n" - } - }, - "additionalProperties": false -} -``` - -**`as`:** The model's reply. - -**Body context:** The prompt. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Sample.md` (declared Markdown) - -### `` - -Report the scope and hygiene of a pull request. `` renders a Scope section covering size, file and directory counts, description length, issue linkage and config/source mixing. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - } - }, - "required": [ - "pr" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/policies/ScopePolicy.md` (declared Markdown) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Report verbosity indicators in a pull request. `` renders a Slop section covering comment ratio, comments that restate the code, and the sensor's verbosity signals. When redundant comments remain and the required GitHub environment is present, it also reconciles inline removal suggestions on the pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `diagnostics` | `object` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "diagnostics": { - "type": "object" - } - }, - "required": [ - "pr", - "diagnostics" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/policies/SlopPolicy.md` (declared Markdown) - -### `` - -Reconcile the review's removal suggestions on the pull request. `` deletes previous bot reviews when GitHub permits it, acknowledges declined suggestions and resolves their threads, then posts pending findings as a new review. It does nothing without the required GitHub environment. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `findings` | `array` | yes | | -| `dismissedReplies` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "findings": { - "type": "array" - }, - "dismissedReplies": { - "type": "array", - "default": [] - } - }, - "required": [ - "findings" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/SuggestRemoval.md` (declared Markdown) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Drop a model's reasoning from its answers. `…` removes `` blocks from every `` reply inside it, including an unterminated one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose samples are filtered. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/ThinkFilter.md` (declared Markdown) - -### `` - -Report when a pull-request metric crosses a limit. `` compares one of `totalChanges`, `totalFiles`, `additions`, `deletions` or `directories`, and substitutes `{actual}` and `{value}` into the message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `metric` | `string` | yes | | -| `op` | `string` | yes | | -| `value` | `number` | yes | | -| `severity` | `string` | no | | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "metric": { - "type": "string" - }, - "op": { - "type": "string" - }, - "value": { - "type": "number" - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string" - } - }, - "required": [ - "pr", - "metric", - "op", - "value", - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/Threshold.md` (declared Markdown) - -### `` - -Report declarations the change adds and nothing references. `` scans added TypeScript for that keyword where a declaration starts, so an import specifier naming the same keyword is not mistaken for one. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `pr` | `object` | yes | | -| `construct` | `string` | yes | | -| `severity` | `string` | no | | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "pr": { - "type": "object" - }, - "construct": { - "type": "string" - }, - "severity": { - "type": "string", - "default": "warning" - }, - "message": { - "type": "string" - } - }, - "required": [ - "pr", - "construct", - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/code-review-agent/components/UnusedInDiff.md` (declared Markdown) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -No components were found in the configured includes. - - - - -🔴 probe - - - ------ post-test output end ----- - arrives for run and syntax when it is named ... ok (1s) - names itself by its own name, however it was reached ... -------- post-test output ------- -active: @executablemd/git, @executablemd/code-review-agent, active - -document body ------ post-test output end ----- - names itself by its own name, however it was reached ... ok (819ms) -PC9 — the review graph arrives only when it is selected ... ok (4s) -PC7 — a package is selected by name, from where the command runs ... - loads a bare package from the invocation directory, named by its own name ... -------- post-test output ------- -selected-package: loaded -selected-package: installed for run -active: @executablemd/git, renamed-by-its-author, active - -document body ------ post-test output end ----- - loads a bare package from the invocation directory, named by its own name ... ok (774ms) - leaves an installed package inert until it is named ... -------- post-test output ------- -document body ------ post-test output end ----- - leaves an installed package inert until it is named ... ok (973ms) - loads a relative path inside the directory the command runs in ... -------- post-test output ------- -project-local: loaded -project-local: installed for run -document body ------ post-test output end ----- - loads a relative path inside the directory the command runs in ... ok (760ms) - loads a relative path inside this repository, written from its root ... -------- post-test output ------- -external-fixture: loaded -external-fixture: installed for run -external-fixture: argv ["run","--plugin","./packages/cli/tests/fixtures/plugins/external.mjs","--eval","document body\n"] -document body ------ post-test output end ----- - loads a relative path inside this repository, written from its root ... ok (776ms) -PC7 — a package is selected by name, from where the command runs ... ok (3s) -PC8 — an Api built under the bare public name intercepts nothing ... - leaves the document unwrapped and the run unchanged ... -------- post-test output ------- -document body ------ post-test output end ----- - leaves the document unwrapped and the run unchanged ... ok (739ms) - still composes with a Plugin that reached the canonical key ... -------- post-test output ------- -one open - -document body - - -one close ------ post-test output end ----- - still composes with a Plugin that reached the canonical key ... ok (761ms) -PC8 — an Api built under the bare public name intercepts nothing ... ok (1s) -running 9 tests from ./packages/cli/tests/plugin-host.test.ts -PH1 — the list installs once, in order ... - calls each install in selection order ... ok (3ms) - skips a Plugin that installs nothing without disturbing the order ... ok (0ms) - shows every Plugin the complete list, including the first one ... ok (1ms) - carries the command and the original argv into every request ... ok (0ms) -PH1 — the list installs once, in order ... ok (7ms) -PH2 — one name, one Plugin ... - refuses two selections claiming one name ... ok (1ms) - refuses before the first install rather than after the second ... ok (1ms) - admits distinct names loaded from anywhere ... ok (0ms) -PH2 — one name, one Plugin ... ok (1ms) -PH3 — an installation has the command's lifetime ... - unwinds the Plugins installed before one that failed ... ok (1ms) -PH3 — an installation has the command's lifetime ... ok (1ms) -PH3b — cancellation unwinds what was installed ... - releases the Plugins already installed when the command is halted ... ok (1ms) - leaves the established teardown-failure precedence exactly as it was ... ok (1ms) -PH3b — cancellation unwinds what was installed ... ok (1ms) -PH4 — what an installation contributes crosses as one execution installation ... - carries components, structural syntax, its bound expand and admissions on one ... ok (1ms) - contributes no installation for a Plugin that returned nothing ... ok (0ms) - contributes nothing at all where no Plugin was selected ... ok (1ms) -PH4 — what an installation contributes crosses as one execution installation ... ok (1ms) -PH5 — a Plugin reads the command's typed configuration ... - sees the parsed verbosity the command installed, through runtime's /api ... ok (0ms) -PH5 — a Plugin reads the command's typed configuration ... ok (737µs) -PH6 — the selected review Plugin claims the commands that run a review ... - declares the thirty-five Markdown components for run, syntax and plan ... ok (133ms) - declares them for a workflow action that executes a document ... ok (94ms) - declares none for the test root, upgrade, or a workflow management action ... ok (1ms) - reads an option's value as a value, never as the action ... ok (112ms) - contributes nothing at all when it is not in the list ... ok (1ms) - registers the six reserved names where it claims the graph ... ok (28ms) - registers none of them where no Plugin was selected ... ok (1ms) - registers none of them for the test root ... ok (0ms) -PH6 — the selected review Plugin claims the commands that run a review ... ok (371ms) -PH7 — a structural-only Plugin reaches every consumer of the catalog ... - retains both arms of what it declared, not the Markdown half ... ok (0ms) - describes the construct in the symbols xmd syntax renders ... ok (87ms) - accepts a candidate that writes the construct, under Plan validation ... ok (61ms) - refuses the same candidate when nothing declared the construct ... ok (54ms) -PH7 — a structural-only Plugin reaches every consumer of the catalog ... ok (202ms) -PH8 — an incomplete structural half never reaches a command ... - refuses structural declarations with no handler, at installation ... ok (1ms) - refuses a handler with no structural declarations, at installation ... ok (0ms) - stops before xmd syntax can advertise the construct ... ok (74ms) - stops before Plan validation can accept the construct ... ok (0ms) - unwinds the Plugins installed before the incomplete one ... ok (0ms) -PH8 — an incomplete structural half never reaches a command ... ok (75ms) -running 3 tests from ./packages/cli/tests/plugin-modules.test.ts -PM1 — a Windows path is a path, on every host ... - reads a drive prefix as a filesystem path rather than a scheme ... ok (2ms) - does not refuse one as remote ... ok (0ms) - still reads a bare drive letter with no separator as a scheme ... ok (0ms) -PM1 — a Windows path is a path, on every host ... ok (8ms) -PM2 — every other specifier keeps the answer it had ... - classifies relative paths ... ok (1ms) - classifies POSIX absolute paths and UNC shares ... ok (0ms) - classifies file URLs apart from paths, because they resolve differently ... ok (0ms) - classifies bare package specifiers ... ok (0ms) - classifies real remote schemes as remote ... ok (1ms) -PM2 — every other specifier keeps the answer it had ... ok (2ms) -PM3 — resolution follows the classification ... - resolves a relative path from the invocation directory ... ok (0ms) - keeps a file URL as it was written ... ok (0ms) - refuses a remote specifier, naming the remedy ... ok (1ms) - refuses nothing that classified as a path ... ok (0ms) -PM3 — resolution follows the classification ... ok (2ms) -running 5 tests from ./packages/cli/tests/plugin-selection.test.ts -PS1 — both spellings, in the order they were written ... - reads the separated and the assigned form alike ... ok (3ms) - keeps occurrence order rather than sorting or deduplicating ... ok (0ms) - retains the original argv, frozen, whatever it removed from the rest ... ok (1ms) -PS1 — both spellings, in the order they were written ... ok (9ms) -PS2 — the separator ends the scan ... - leaves every token after `--` exactly where it was written ... ok (0ms) - still reads what was written before the separator ... ok (1ms) -PS2 — the separator ends the scan ... ok (1ms) -PS3 — a selection that names nothing is refused before anything loads ... - refuses a trailing --plugin with no value ... ok (1ms) - refuses an empty assigned value ... ok (0ms) - refuses a separated value that reads as another option, and says how to write it ... ok (0ms) -PS3 — a selection that names nothing is refused before anything loads ... ok (1ms) -PS4 — the command a Plugin is told about ... - normalizes the shorthand document form to run ... ok (0ms) - reports each public command by its own name ... ok (1ms) - PS4: the REPL is its own command, and its name is not left as a positional ... ok (0ms) -PS4 — the command a Plugin is told about ... ok (1ms) -PS5 — describing a command line loads nothing ... - installs no Plugin for help, version or the internal worker mode ... ok (1ms) - installs them for every command that can run a document ... ok (0ms) - reads a help flag written after the separator as an ordinary token ... ok (0ms) -PS5 — describing a command line loads nothing ... ok (941µs) -running 1 test from ./packages/cli/tests/process-retention.test.ts -Tier FG — host retention ... - FG20: xmd run without --journal keeps the status and neither channel ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -[yield] import_component:__root__ → ok { path: 'prints.md' } -to-outto-err[yield] exec:exec:printf 'to-out'; printf 'to-err' >&2 → ok { exitCode: 0, stdout: undefined, stderr: undefined } -[close] root → ok -# Prints - ------ post-test output end ----- - FG20: xmd run without --journal keeps the status and neither channel ... ok (1s) - FG21: xmd run with --journal keeps both channels ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -[yield] import_component:__root__ → ok { path: 'prints.md' } -to-outto-err[yield] exec:exec:printf 'to-out'; printf 'to-err' >&2 → ok { exitCode: 0, stdout: 'to-out', stderr: 'to-err' } -[close] root → ok -# Prints - ------ post-test output end ----- - FG21: xmd run with --journal keeps both channels ... ok (1s) -Tier FG — host retention ... ok (3s) -running 1 test from ./packages/cli/tests/props-cli.test.ts -Tier PC — xmd run document properties ... - PC1: individual command-line options supply properties ... -------- post-test output ------- - -Hello, Ada! loud=true count=3 tags= ------ post-test output end ----- - PC1: individual command-line options supply properties ... ok (750ms) - PC2: individual environment variables supply properties ... -------- post-test output ------- - -Hello, Ada! loud=false count= tags= ------ post-test output end ----- - PC2: individual environment variables supply properties ... ok (756ms) - PC3: aggregate JSON supplies properties from either source ... -------- post-test output ------- - -Hello, Ada! loud=false count=7 tags= - -Hello, Env! loud=false count=9 tags= ------ post-test output end ----- - PC3: aggregate JSON supplies properties from either source ... ok (1s) - PC4: the documented precedence resolves per property ... -------- post-test output ------- - -Hello, ind-cli! loud=false count=2 tags=t ------ post-test output end ----- - PC4: the documented precedence resolves per property ... ok (786ms) - PC5: an invalid higher-priority source fails instead of falling through ... -------- post-test output ------- ---props-count: Invalid input: expected number, received string ------ post-test output end ----- - PC5: an invalid higher-priority source fails instead of falling through ... ok (664ms) - PC6: booleans accept bare and explicit forms, never a negated one ... -------- post-test output ------- - -Hello, x! loud=true count= tags= - -Hello, x! loud=false count= tags= -unrecognized option: --no-props-loud — document properties have no negated form, use --props-loud=false ------ post-test output end ----- - PC6: booleans accept bare and explicit forms, never a negated one ... ok (2s) - PC7: arrays repeat on the command line and are JSON in the environment ... -------- post-test output ------- - -Hello, x! loud=false count= tags=a, b - -Hello, x! loud=false count= tags=alpha, beta ------ post-test output end ----- - PC7: arrays repeat on the command line and are JSON in the environment ... ok (1s) - PC8: text keeps its exact value while aggregate JSON keeps its exact type ... -------- post-test output ------- - -Hello, 007! loud=false count= tags= ---props: Invalid input: expected number, received string ------ post-test output end ----- - PC8: text keeps its exact value while aggregate JSON keeps its exact type ... ok (1s) - PC10: additionalProperties governs aggregate objects at every level ... -------- post-test output ------- -Prop validation failed for <__root__ />: - - "/user/extra" must NOT have additional properties - -name=Ada ------ post-test output end ----- - PC10: additionalProperties governs aggregate objects at every level ... ok (1s) - PC11: an unknown individual option names the aggregate as the way in ... -------- post-test output ------- -unrecognized option: --props-extra — the document declares no such property; supply additional properties with --props ------ post-test output end ----- - PC11: an unknown individual option names the aggregate as the way in ... ok (674ms) - PC12: document help describes the declared properties in every position ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by hello.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props-loud[=] - Environment: XMD_PROPS_LOUD - Default: false - - --props-count - Environment: XMD_PROPS_COUNT - - --props-tags ... - Environment: XMD_PROPS_TAGS - - --props - Set document properties as a JSON object - Environment: XMD_PROPS -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by hello.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props-loud[=] - Environment: XMD_PROPS_LOUD - Default: false - - --props-count - Environment: XMD_PROPS_COUNT - - --props-tags ... - Environment: XMD_PROPS_TAGS - - --props - Set document properties as a JSON object - Environment: XMD_PROPS -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by hello.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props-loud[=] - Environment: XMD_PROPS_LOUD - Default: false - - --props-count - Environment: XMD_PROPS_COUNT - - --props-tags ... - Environment: XMD_PROPS_TAGS - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - PC12: document help describes the declared properties in every position ... ok (1s) - PC12a: help describes properties and targets together in every position ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by described.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in described.md - - described.md#Greeting - Greet the person this run names, once. - - described.md#Farewell -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by described.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in described.md - - described.md#Greeting - Greet the person this run names, once. - - described.md#Farewell -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by described.md - - --props-name - Person to greet - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in described.md - - described.md#Greeting - Greet the person this run names, once. - - described.md#Farewell ------ post-test output end ----- - PC12a: help describes properties and targets together in every position ... ok (1s) - PC13: help reports no current values and runs no document ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by doc.md - - --props-name - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - PC13: help reports no current values and runs no document ... ok (675ms) - PC14: help without a document, and a document without properties, show no section ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - PC14: help without a document, and a document without properties, show no section ... ok (1s) - PC15: document-derived options must follow the document ... -------- post-test output ------- -unrecognized option: --props-name — document properties follow the document, as in `xmd run --props-name …` ------ post-test output end ----- - PC15: document-derived options must follow the document ... ok (652ms) - PC16: xmd test does not accept document properties ... -------- post-test output ------- -unrecognized option for xmd test: --props-name — document properties are exclusive to xmd run ------ post-test output end ----- - PC16: xmd test does not accept document properties ... ok (607ms) - PC19: a referenced scalar gets bindings, decoding, and a rendered value form ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by ref.md - - --props-count - Environment: XMD_PROPS_COUNT - - --props-counts ... - Environment: XMD_PROPS_COUNTS - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -count=12 counts=1, 2 ------ post-test output end ----- - PC19: a referenced scalar gets bindings, decoding, and a rendered value form ... ok (1s) - PC20: a structured-only document still documents the aggregate ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by nested.md - - --props - Set document properties as a JSON object - Environment: XMD_PROPS ------ post-test output end ----- - PC20: a structured-only document still documents the aggregate ... ok (608ms) - PC18: the default command form accepts properties ... -------- post-test output ------- - -Hello, Ada! loud=false count= tags= ------ post-test output end ----- - PC18: the default command form accepts properties ... ok (772ms) - PC22: property help describes a targeted document by its reference ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Properties declared by sectioned.md - - --props-name - Environment: XMD_PROPS_NAME - Required - - --props - Set document properties as a JSON object - Environment: XMD_PROPS - -Targets in sectioned.md - - sectioned.md#Greeting - - sectioned.md#Farewell - FAREWELL_MARKER ------ post-test output end ----- - PC22: property help describes a targeted document by its reference ... ok (603ms) -Tier PC — xmd run document properties ... ok (22s) -running 1 test from ./packages/cli/tests/props-schema.test.ts -Tier PS — JSON Schema to Standard Schema ... - PS1: converts every scalar form the contract names ... ok (7ms) - PS2: text is not coerced — a number-only property rejects its string form ... ok (1ms) - PS3: required and optional are the schema's, not Zod's ... ok (19ms) - PS4: local references resolve — draft-7 uses definitions ... ok (4ms) - PS5: $defs needs the 2020-12 target, while Ajv resolves either pointer ... ok (5ms) - PS6: Zod would strip and default nested values, so its output is never kept ... ok (5ms) - PS7: a strict nested object rejects unknown keys, so the adapter loosens them for Ajv ... ok (6ms) -Tier PS — JSON Schema to Standard Schema ... ok (52ms) -running 1 test from ./packages/cli/tests/props-sources.test.ts -Tier PR — property source resolution ... - PR1: generates a binding per declared scalar property ... ok (2ms) - PR2: normalizes multi-word names and rejects a collision ... ok (2ms) - PR3: applies the documented precedence per property ... ok (5ms) - PR4: an invalid higher-priority source fails instead of falling through ... ok (2ms) - PR5: an invalid lower-priority source is irrelevant when a higher one wins ... ok (1ms) - PR6: a property nobody supplies is omitted so defaults stay Ajv's ... ok (0ms) - PR7: individual text decodes, aggregate JSON keeps its exact type ... ok (2ms) - PR8: booleans accept a bare flag and an explicit value, never a negated form ... ok (2ms) - PR9: arrays repeat on the command line and are JSON in the environment ... ok (2ms) - PR10: aggregate values reach validation unchanged, nested keys and all ... ok (2ms) - PR11: undeclared aggregate keys survive for whole-object validation ... ok (0ms) - PR12: an unknown individual option names the aggregate as the way in ... ok (1ms) - PR13: malformed aggregate JSON fails before anything runs ... ok (1ms) - PR15: a referenced scalar generates bindings and decodes against its target ... ok (1ms) - PR18: only a scalar enum gets an individual binding ... ok (1ms) - PR19: a structural enum keeps its source-aware diagnostics ... ok (1ms) - PR16: structured properties resolve through Configliere too ... ok (2ms) - PR17: a structured diagnostic names the aggregate that supplied it ... ok (2ms) - PR14: extraction leaves every other argument alone ... ok (0ms) -Tier PR — property source resolution ... ok (35ms) -running 1 test from ./packages/cli/tests/pull-request-read-fork.test.ts -Tier PRR — forking a run that already read a pull request ... - PRR27: an unchanged fork restores the collection, and a changed URL does not ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 - - - -reviews: 2 -workflow status: completed -[{"eventId":"a4cd3e07-7ca1-4728-a0dc-5bf19d1829e7","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d1b95ffd902a07b58797abf6f66c6362c43c7afa81bbd26e7e154f82b9b59f91"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"d1b95ffd902a07b58797abf6f66c6362c43c7afa81bbd26e7e154f82b9b59f91"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ca19874d-c2a2-406a-baea-c5733c529a57","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"review.md","content":"---\nprops:\n url: { type: string, default: \"https://github.com/octo/project/pull/7\" }\n---\n\n\n\nreviews: {reviews.length}\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1aca2406-c8dd-4aae-ab4b-4f79ebd0a037","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"PullRequest.Reviews","executablemd.source-position":{"path":"review.md","offset":91,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"review.md","offset":91,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6e17fec1-9c70-40a6-ace4-bc20f003504b","event":{"type":"yield","coroutineId":"root","description":{"type":"pull_request_read","name":"c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:6af2737ac2d30964","input":{"operation":"read","url":"https://github.com/octo/project/pull/7","provider":null,"kind":"reviews","runId":"source-1","expansionId":"c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc"},"configuration":"6af2737ac2d30964","executablemd.source-position":{"path":"review.md","offset":91,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"reviews","items":[{"id":"700","author":"reviewer","state":"approved","body":"ship it","submittedAt":"2026-08-24T00:00:00Z","commitSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","url":"https://github.com/octo/project/pull/7#r0"},{"id":"701","author":"reviewer","state":"approved","body":"one note","submittedAt":"2026-08-24T00:00:00Z","commitSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","url":"https://github.com/octo/project/pull/7#r1"}]}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"review.md","offset":91,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"576c8aa3-44af-4880-a9b6-753e5ad60f3e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\nreviews: 2\n","value":"\n\n\nreviews: 2\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] -workflow run: control-1 - - - -reviews: 2 -workflow status: completed -the candidate definition diverges from the inherited history after 3 of 4 events, at 6e17fec1-9c70-40a6-ace4-bc20f003504b (pull_request_read): Divergence at root[3]: expected pull_request_read("c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:6af2737ac2d30964") at review.md:6:1, got pull_request_read("c58a31f92dedf4541026d5fdbabfb848fc7501bdb00c1d1b8ba1ddd5eff428bc:615e5f9863cfa384") at review.md:6:1 ------ post-test output end ----- - PRR27: an unchanged fork restores the collection, and a changed URL does not ... ok (4s) -Tier PRR — forking a run that already read a pull request ... ok (4s) -running 1 test from ./packages/cli/tests/repl-admission.test.ts -AD — admission survives an announcement made before the consumer runs ... - AD1: a value announced before the consumer begins is still admitted ... ok (8ms) - AD2: the shape AD1 replaced drops that value — the control for AD1 ... ok (3ms) -AD — admission survives an announcement made before the consumer runs ... ok (16ms) -running 12 tests from ./packages/cli/tests/repl-agent-execution.test.ts -L1 — transparent queued/start/delta/terminal observation ... - L1: queued before the provider is asked, then the turn's own facts ... ok (81ms) -L1 — transparent queued/start/delta/terminal observation ... ok (86ms) -L2 — exact atomic live-to-durable replacement ... - L2: identical concurrent turns replace their own overlays, in reverse order ... ok (66ms) - L2: the turn that finished first is not the turn the first record replaced ... ok (54ms) - L2: a replayed turn consumes its record without creating a live overlay ... ok (60ms) -L2 — exact atomic live-to-durable replacement ... ok (183ms) -L3 — execution owns live work, presentation does not ... - L3: a document with no Agent work publishes nothing and materializes nothing ... ok (32ms) - L3: a turn completes and publishes with nobody subscribed to changes ... ok (30ms) - L3: cancelling the session owner cancels and joins a held turn ... ok (29ms) - L3: a divergence before admission returns no session and leaves nothing alive ... ok (37ms) -L3 — execution owns live work, presentation does not ... ok (130ms) -L4 — an admitted session failure terminates its owner ... - L4: a post-admission correlation failure withdraws authority and join returns it ... ok (28ms) -L4 — an admitted session failure terminates its owner ... ok (28ms) -P1 — exact policy and per-turn suspension ... - P1: approve-all selects allow_once first ... ok (28ms) - P1: approve-all falls back to allow_always ... ok (27ms) - P1: approve-all denies when neither allow kind is offered ... ok (28ms) - P1: deny-all selects reject_once first ... ok (27ms) - P1: deny-all falls back to reject_always ... ok (26ms) - P1: deny-all cancels when no rejection is offered ... ok (27ms) - P1: approve-reads approves a read ... ok (26ms) - P1: approve-reads approves a search with allow_always ... ok (28ms) - P1: approve-reads denies a read with no allow kind ... ok (26ms) - P1: one held request does not suspend its sibling spawn ... ok (41ms) -P1 — exact policy and per-turn suspension ... ok (286ms) -P2 — one live request, one direct settlement ... - P2: an unknown option and a stale key settle nothing; the offered one settles once ... ok (30ms) - P2: dismissal while live denies once and the turn resumes ... ok (30ms) - P2: a cold retained audit has no pending reading and no authority ... ok (61ms) -P2 — one live request, one direct settlement ... ok (122ms) -P3 — whole-session teardown is structured cancellation ... - P3: teardown cancels and joins the held request without claiming a denial ... ok (25ms) - P3: releasing the owning scope retires the agent owner and wakes nobody ... ok (29ms) - P3: retiring the owner wakes nobody who was waiting on its failure ... ok (5ms) -P3 — whole-session teardown is structured cancellation ... ok (60ms) -P4 — a request without one live owner fails the session ... - P4: an unowned request publishes nothing, denies nothing and fails the session ... ok (27ms) -P4 — a request without one live owner fails the session ... ok (27ms) -P5 — the durable audit of a live REPL turn ... - P5: two live turns settle in reverse order, and each record holds only its own ... ok (40ms) - P5: a later request from an earlier turn is still that turn's ... ok (43ms) - P5: two requests from one turn keep the order they were asked, not the order they settled ... ok (27ms) - P5: provider-owned input reaches neither the journal nor the model ... ok (28ms) -P5 — the durable audit of a live REPL turn ... ok (139ms) -P6 — only a canonical Prompt claims a record ... - P6: a direct public prompt neither claims the canonical record nor lingers ... ok (31ms) - P6: concurrent spawns with a direct call each retire only their own turn ... ok (44ms) - P6: a refused publication leaves the turn neither retained nor mounted ... ok (27ms) - P6: a failed canonical Prompt hands off exactly as a completed one does ... ok (29ms) - P6: a cancelled canonical Prompt hands off exactly as a completed one does ... ok (26ms) -P6 — only a canonical Prompt claims a record ... ok (158ms) -EA1 — one chronology of entries, each counting its own Prompts ... - EA1: two entries each retain sequence 0, ordered by entry and then sequence ... ok (72ms) - EA1: two prompts in one entry claiming one sequence refuse the whole projection ... ok (42ms) - EA1: a live turn carries the entry that began it, and keeps it on publication ... ok (53ms) - EA1: one conversation spans two entries, and naming an entry does not narrow it ... ok (50ms) -EA1 — one chronology of entries, each counting its own Prompts ... ok (218ms) -EL2 — an entry's live Agent state is retired with its execution ... - EL2: a cancelled turn is retired with its entry, and the next entry runs clean ... ok (72ms) - EL2: cleanup keeps a published slot and removes only the unpublished one ... ok (78ms) - EL2: a request held by a cancelled entry crosses nothing into its successor ... ok (76ms) -EL2 — an entry's live Agent state is retired with its execution ... ok (228ms) -running 14 tests from ./packages/cli/tests/repl-agent-interface.test.ts -U1 — one chronology, filtered, undisturbed by the background ... - U1: retained, streaming and queued turns show together, in scheduling order ... ok (160ms) - U1: an earlier live turn stays before a later recorded one, and survives its own record ... ok (88ms) - U1: conversations are ordered by their earliest turn, and selecting one changes only the filter ... ok (91ms) - U1: background Agent work changes no route, no filter and not where focus is ... ok (69ms) - U1: a historical prefix shows no live turn and no live request ... ok (69ms) -U1 — one chronology, filtered, undisturbed by the background ... ok (481ms) -U2 — one action path, and one owner for a pending request ... - U2: Enter and a pointer on the same control ask for the same thing ... ok (74ms) - U2: a request arriving opens nothing, moves nothing and claims no focus ... ok (61ms) - U2: activating it opens the drawer, and one choice settles that request once ... ok (87ms) - U2: closing the drawer denies exactly once, through the authority ... ok (65ms) - U2: an unknown request or an unoffered option changes nothing and calls nobody ... ok (57ms) - U2: a recorded permission audit is read, never answered ... ok (49ms) -U2 — one action path, and one owner for a pending request ... ok (394ms) -U3 — what each accepted frame mounts, and nothing else ... - U3: wide keeps Sessions in the sidebar and leaves the other readings alone ... ok (62ms) - U3: narrow Sessions mounts its own outlet and nothing of the other panes ... ok (56ms) - U3: narrow REPL mounts no Sessions row ... ok (65ms) - U3: the permission drawer traps focus, keeps History inside it and hides what is behind ... ok (61ms) - U3: every accepted frame carries one location, and too small carries only its refusal ... ok (62ms) -U3 — what each accepted frame mounts, and nothing else ... ok (308ms) -U2 — the program performs a permission, end to end ... - U2: choosing through the running program settles the request and closes its drawer ... ok (822ms) - U2: Escape on the drawer denies once through the program, and the session runs on ... ok (768ms) -U2 — the program performs a permission, end to end ... ok (1s) -U4 — the loop wakes for Agent work ... - U4: queued, streaming and a waiting request each repaint on their own ... ok (479ms) -U4 — the loop wakes for Agent work ... ok (479ms) -U5 — navigation is outside the outlet it leaves ... - U5: a narrow frame is left in both directions, by key and by pointer ... ok (51ms) - U5: a request arriving on the other surface is still reachable from this one ... ok (52ms) -U5 — navigation is outside the outlet it leaves ... ok (103ms) -U6 — the Sessions reading is windowed ... - U6: a request past the first window is reached by scrolling, and the top comes back ... ok (63ms) - U6: the stored offset is clamped when the reading it was taken against changes ... ok (119ms) - U6: a draft long enough to fill the region still leaves every control placed ... ok (75ms) - U6: a shrinking draft row repaints cleanly, and is a complete row ... ok (61ms) - U6: the first press after a resize moves the window, not the stored number ... ok (98ms) -U6 — the Sessions reading is windowed ... ok (416ms) -U7 — the permission drawer is windowed ... - U7: every offered choice becomes placed and pointable, in the provider's order ... ok (89ms) - U7: closing a scrolled drawer denies exactly once ... ok (54ms) - U7: the first press after a resize moves the drawer, not the stored number ... ok (69ms) -U7 — the permission drawer is windowed ... ok (221ms) -U8 — a target is a control, whatever its key is spelled ... - U8: values named like a turn's facts are still pointer-equivalent to Enter ... ok (48ms) - U8: a fact is read, not activated, wherever it is drawn ... ok (60ms) -U8 — a target is a control, whatever its key is spelled ... ok (113ms) -U1 — a row's rectangle does not bound its text (#875 R1) ... - TL11: a long turn label keeps its state inside the row's own measured cells ... ok (37ms) -U1 — a row's rectangle does not bound its text (#875 R1) ... ok (37ms) -U9 — two entries whose Prompts share one durable name ... - U9: each entry's turn shows once and resolves to its own record ... ok (69ms) -U9 — two entries whose Prompts share one durable name ... ok (70ms) -EU1 — selecting an entry moves the transcript locus and nothing else ... - UI4: a live question belongs to the entry that is still running ... ok (50ms) - EU1: selecting an entry changes the locus, and leaves Sessions global ... ok (68ms) - ER1: a narrow round trip to Sessions keeps the entry, the draft and the filter ... ok (79ms) - EU1: entry keys and mounted nodes survive publication and an outcome change ... ok (68ms) -EU1 — selecting an entry moves the transcript locus and nothing else ... ok (266ms) -U2 — a pending permission announces itself without taking the screen ... - UI14: the frame says a permission waits in Sessions, and changes no route or focus ... ok (48ms) -U2 — a pending permission announces itself without taking the screen ... ok (48ms) -U2 — a draft outlives a permission and is still editable ... - C3: at 160x36 the draft survives settling, edits, and becomes Entry 2 ... ok (11s) - C3: at 72x20 the draft survives settling, edits, and becomes Entry 2 ... ok (11s) -U2 — a draft outlives a permission and is still editable ... ok (22s) -running 7 tests from ./packages/cli/tests/repl-agent-journey.test.ts -J1 — the Story, from one entry to one README ... - J1: the packaged Plan is reviewed in the drawer, and its program asks, previews and writes ... ok (2s) - J1: declining reaches the same preview and writes nothing ... ok (2s) -J1 — the Story, from one entry to one README ... ok (4s) -C1 — the command line this REPL runs under ... - C1: the five options settle into one immutable profile ... ok (13ms) - C1: each permission switch is the mode the profile carries ... ok (0ms) - C1: an entry that asks for no Agent materializes no adapter ... ok (173ms) - C1: `` is unavailable and the REPL keeps the terminal ... ok (183ms) -C1 — the command line this REPL runs under ... ok (370ms) -J3 — durable truth, and a cold process over it ... - J3: a fresh command scope reconstructs the whole Story from the Journal alone ... ok (2s) - EC1: two entries of retained Agent work reopen cold, asking nobody ... ok (1s) - J3: a failed and a cancelled turn restore terminally, with the text they had ... ok (1s) - J3: each marker shows only what its own prefix retains ... ok (1s) - J3: a location this host cannot read refuses before any replay ... ok (45ms) -J3 — durable truth, and a cold process over it ... ok (6s) -J2 — three conversations at once, through the terminal ... - J2: complete, streaming and queued are one frame, and filtering changes only Sessions ... ok (1s) -J2 — three conversations at once, through the terminal ... ok (1s) -J2 — a filter and a draft across a resize (#875 R1) ... - TL10: a conversation filter and a draft survive the round trip, and a cold open restores them ... ok (1s) -J2 — a filter and a draft across a resize (#875 R1) ... ok (1s) -J2 — what filtering Sessions leaves on the screen (#875 R1) ... - TL5: filtering to one conversation blanks the cells the vacated rows were drawn in ... ok (981ms) -J2 — what filtering Sessions leaves on the screen (#875 R1) ... ok (981ms) -X1 — how this command ends, with work still in flight ... - X1: EOF ends the command, joins the turn and appends nothing late ... ok (659ms) - X1: a renderer that fails ends the command the same way ... ok (621ms) - X1: a terminal that fails mid-read ends the command the same way ... ok (661ms) - X1: cancelling the command joins the pending request without answering it ... ok (623ms) - UI2: [exit] while a request is waiting denies nothing and answers nothing ... ok (693ms) -X1 — how this command ends, with work still in flight ... ok (3s) -running 4 tests from ./packages/cli/tests/repl-boundaries.test.ts -REPL boundaries: what production code cannot reach ... - S1: no shared REPL module reaches a runtime global or the environment ... ok (14ms) - S1: the checker reads code and not prose ... ok (1ms) - S1: the checker rejects a module that reaches one ... ok (1ms) - S1: application components import no journal, session or host authority ... ok (1ms) - S1: the terminal, decoder and renderer know no application action name ... ok (1ms) - S1: runtime-specific access lives only in runtime-named modules ... ok (2ms) - S1: no rejected dependency entered production ... ok (0ms) - S1: no production REPL module retains a provider's raw request ... ok (10ms) - S1: the profile installs no readline policy, no launcher and no browser form ... ok (1ms) - S1: the profile check rejects a profile that installed one ... ok (1ms) - S1: no REPL record type exists in production ... ok (8ms) -REPL boundaries: what production code cannot reach ... ok (44ms) -REPL terminal entrypoints: one corrected stream, four installations ... - UI2: every entrypoint installs an owned input stream and none builds its own reader ... ok (2ms) - UI2: nothing on the REPL's exit path ends through a host primitive ... ok (2ms) - UI2: every owned reader registers its release before it acquires anything ... ok (1ms) - UI2: the compiled binary installs the same Deno stream the source entrypoint does ... ok (0ms) - UI2: Node and Bun share one structural reader and detect no runtime ... ok (1ms) -REPL terminal entrypoints: one corrected stream, four installations ... ok (7ms) -REPL documentation: what it says is what the code does ... - D1: every command example in the spec is one the parser accepts ... ok (1ms) - D1: the five options the spec names are the five the parser accepts ... ok (1ms) - D1: the spec's route grammar is the one the codec implements ... ok (0ms) - D1: the spec's sequential-entry claims are the ones the code makes ... ok (1ms) - D1: a drifted example is caught ... ok (0ms) - D1: the spec's Elicit metadata statement matches the real reader ... ok (1ms) - D1: Freedom's recorded provenance still matches its manifest ... ok (1ms) -REPL documentation: what it says is what the code does ... ok (5ms) -REPL command: what runs before the host is reached ... - S1: help describes the command without assembling a REPL ... ok (10ms) - S1: every refusal is decided before the host is asked for anything ... ok (143ms) - S1: the counter is entered when the command really runs ... ok (50ms) -REPL command: what runs before the host is reached ... ok (203ms) -running 9 tests from ./packages/cli/tests/repl-composition.test.ts -REPL composition: reconciling a described tree ... - C1: the same key and component keep the node and its running lifetime ... ok (5ms) - C1: a changed component replaces the node, and the replacement mounts first ... ok (2ms) - C1: a new sibling mounts before an absent one is removed ... ok (1ms) - C1: canonical order is the described order, not the created order ... ok (1ms) - C1: a refused set changes nothing at all ... ok (2ms) - C1: an absent description leaves no node, focus, frame or state ... ok (1ms) - C1: next() returns only after that exact set has been committed ... ok (1ms) - C1: validation reads the whole set, including descendants ... ok (1ms) -REPL composition: reconciling a described tree ... ok (18ms) -REPL composition: a description is issued, not written ... - C1: what the caller keeps mutating is not what the tree holds ... ok (0ms) - C1: a description mutated while its offer waits cannot change the tree ... ok (1ms) - C1: a plain object shaped like a description is refused ... ok (1ms) - C1: an issued handle cannot be shadowed into meaning something else ... ok (1ms) - C1: the records behind a handle are frozen, all the way down ... ok (2ms) - C1: a factory-shaped component is refused before anything attaches ... ok (2ms) - C1: only view data crosses into a description ... ok (1ms) -REPL composition: a description is issued, not written ... ok (12ms) -REPL composition: the vendored snapshot ... - C2: the manifest is an exact inventory of what is vendored ... ok (7ms) - C2: every vendored byte is the byte the manifest recorded ... ok (4ms) - C2: the provenance states both licence declarations and settles neither ... ok (0ms) - C2: every production difference from upstream belongs to one named patch ... ok (1ms) - C2: production imports the patched copy and never the pristine one ... ok (3ms) -REPL composition: the vendored snapshot ... ok (15ms) -REPL composition: what the two patches change ... - C2: a patched root belongs to its caller, and pristine has no such surface ... ok (6ms) - C2: pristine upstream fails the ownership control ... ok (1ms) - C2: removing the branch above the focused control moves focus to a survivor ... ok (1ms) - C2: pristine upstream fails the containment control ... ok (1ms) - C2: the patched sources run on this repository's stable Effection ... ok (0ms) -REPL composition: what the two patches change ... ok (9ms) -REPL composition: where a normalized event goes ... - I1: a key and a click on the same control mean the same thing ... ok (0ms) - I1: the host names a target and an event shape, never an action ... ok (0ms) - I1: Backtab arrives through dispatch, like every other event ... ok (1ms) - I1: Escape closes the drawer and answers nothing ... ok (0ms) - I1: a pointer from an obsolete frame or a removed node is dropped ... ok (0ms) - I1: an event nothing claims is an explicit failure, not a silence ... ok (1ms) -REPL composition: where a normalized event goes ... ok (4ms) -REPL composition: a modal branch owns focus while it is mounted ... - C2: a mounted modal traps focus, and popping it restores the prior one ... ok (1ms) - C2: the same branch without the modal push does not trap focus ... ok (1ms) -REPL composition: a modal branch owns focus while it is mounted ... ok (1ms) -REPL composition: cancellation owns an uncommitted offer ... - C1: cancelling an offer suspended in the real commit path mounts nothing ... ok (12ms) - C1: cancelling the holder cannot release a concurrent commit ... ok (12ms) -REPL composition: cancellation owns an uncommitted offer ... ok (24ms) -REPL composition: the construction surface ... - C1: the only public construction is describe() and component() ... ok (1ms) - C1: an issued handle shows nothing and cannot be changed ... ok (0ms) -REPL composition: the construction surface ... ok (2ms) -REPL composition: a modal stack ... - C2: a current-frame pointer cannot reach the page behind an open drawer ... ok (1ms) - C2: a nested stack pushes outer first and pops inner first ... ok (1ms) - C2: removing an outer drawer pops the stack above it, innermost first ... ok (1ms) - C2: a preserved node whose modal intent changes pushes or pops in place ... ok (1ms) - C2: a focus claim beside a modal is refused before anything mounts ... ok (1ms) - C2: a focus claim in an outer modal but outside the inner one is refused ... ok (1ms) - C2: a focus claim inside the innermost modal is admitted ... ok (1ms) - C2: two modal roots on disjoint branches are refused before anything mounts ... ok (0ms) -REPL composition: a modal stack ... ok (6ms) -running 19 tests from ./packages/cli/tests/repl-entries.test.ts -REPL entries: the segments one physical journal holds ... - ES1: partitions two and three segments in admission order ... ok (113ms) - ES1: each segment view reads only its own events ... ok (40ms) - ES1: a successful append becomes locally visible only after acknowledgement ... ok (28ms) - ES1: a failed physical append does not advance local state ... ok (22ms) - ES1: a settled or non-final segment refuses every append ... ok (22ms) -REPL entries: the segments one physical journal holds ... ok (230ms) -REPL entries: the prefixes it refuses whole ... - ES2: every malformed boundary refuses with no partial entries ... ok (23ms) - ES2: a segment the one-entry reader cannot read refuses the whole prefix ... ok (21ms) - ES2: an earlier selection does not escape a later entry nothing can read ... ok (22ms) -REPL entries: the prefixes it refuses whole ... ok (65ms) -REPL entries: the keys and markers it assigns ... - EM1: keys follow admission order whatever each entry settled to ... ok (37ms) - EM1: the first entry keeps every marker spelling a one-entry history had ... ok (21ms) - EM1: a raw close:root cannot select the second entry's close ... ok (21ms) -REPL entries: the keys and markers it assigns ... ok (80ms) -REPL entries: what each entry owns and what the next one inherits ... - EP1: two successful entries own their own scopes, transcripts and outcomes ... ok (23ms) - EP1: the last durably published value wins, and an unpublished one never appears ... ok (35ms) - EP1: a second entry edits its inherited value, and the first entry's does not move ... ok (22ms) - EP1: a retained `props` is the entry's own and reaches no successor ... ok (19ms) - EP1: a retained export name no binding can have refuses projection ... ok (11ms) - EP1: a failed and a cancelled entry each permit a successor ... ok (38ms) - EP1: an unfinished entry followed by another admission refuses atomically ... ok (12ms) -REPL entries: what each entry owns and what the next one inherits ... ok (159ms) -REPL entries: what a one-entry history still does ... - BC1: a successful one-entry journal projects entry-1 with its own spellings ... ok (11ms) - BC1: a one-entry failure and a one-entry cancellation keep their outcomes ... ok (17ms) - BC1: a one-entry historical prefix keeps its marker and its head reading ... ok (11ms) - BC1: an empty journal and the refusals a one-entry history had are unchanged ... ok (11ms) -REPL entries: what a one-entry history still does ... ok (50ms) -REPL entries: one session, one entry task, in turn ... - EL1: the first entry starts exactly one task ... ok (19ms) - EL1: a submission while an entry is running refuses and starts nothing ... ok (29ms) - EL1: terminal and unjoined still refuses; the join lets the next one start ... ok (34ms) - EL1: a later entry receives only what earlier entries durably published ... ok (34ms) - EL1: a failed entry permits the next one; an interrupted one permits none ... ok (99ms) - EL1: a cancelled close permits a successor once its task has joined ... ok (27ms) - EL1: opening a settled two-entry history executes neither segment ... ok (33ms) - EL1: opening an unfinished final segment resumes only that segment ... ok (46ms) - EL1: teardown racing a submission starts no task and joins the one running ... ok (22ms) - EL1: an append the journal refuses opens no successor and mounts no task ... ok (16ms) -REPL entries: one session, one entry task, in turn ... ok (363ms) -REPL entries: the draft, the gate and the position ... - ER1: the draft stays editable while an entry runs and while history is read ... ok (34ms) - ER1: Run refuses at every closed gate, starts nothing and keeps the exact draft ... ok (22ms) - ER1: the preserved draft becomes the exact next entry, and only then clears ... ok (32ms) - ER1: a prefix before the selected entry clears only that suffix ... ok (19ms) - ER1: returning live restores the catalog and keeps the draft ... ok (25ms) - ER1: submission inherits from the live head, never from the inspected prefix ... ok (30ms) -REPL entries: the draft, the gate and the position ... ok (162ms) -REPL entries: the catalog a person reads and reaches ... - EU1: entries stay in admission order while their outcomes disagree ... ok (39ms) - EU1: wide and narrow keep the input and both surface selectors reachable ... ok (67ms) - EU1: a catalog longer than one window places and targets every row ... ok (91ms) - EU1: Enter and a frame-resolved pointer on one row ask for the same thing ... ok (73ms) - EU1: a row outside the window is unmounted, unplaced and in no target map ... ok (69ms) - EU1: a resize clamps the drawn offset before the first scroll after it ... ok (66ms) -REPL entries: the catalog a person reads and reaches ... ok (406ms) -REPL entries: the transcript belongs to the entry that is selected ... - EU1: each entry shows its own retained transcript, and no other entry's ... ok (13ms) - EU1: a live overlay belongs to the entry running it, not to the one being read ... ok (39ms) -REPL entries: the transcript belongs to the entry that is selected ... ok (52ms) -REPL entries: restoring an answer at a narrow size (#875 R1) ... - EU1: focus returns to the owning entry, revealed through the catalog's own window ... ok (174ms) -REPL entries: restoring an answer at a narrow size (#875 R1) ... ok (174ms) -REPL entries: the catalog keeps its promise at the narrowest sidebar ... - EU1: every outcome stays inside the drawn row, whatever the entry is called ... ok (33ms) -REPL entries: the catalog keeps its promise at the narrowest sidebar ... ok (33ms) -REPL entries: going to Sessions keeps the entry you came from ... - ER1: the selected entry survives both surfaces, and comes back with you ... ok (22ms) -REPL entries: going to Sessions keeps the entry you came from ... ok (22ms) -REPL entries: what each prefix of a two-entry history shows ... - EH1: before an admission, at it, and at the outcome, with the draft throughout ... ok (26ms) -REPL entries: what each prefix of a two-entry history shows ... ok (26ms) -REPL entries: a third entry inherits the file, not the run before it ... - EC1: an edit the entry before it never published reaches no successor ... ok (47ms) -REPL entries: a third entry inherits the file, not the run before it ... ok (47ms) -REPL entries: which refusal the screen may forget ... - UI12: the session's own lifecycle refusal is recognized, and carries its reason ... ok (0ms) - UI12: an ordinary error merely named ReplLifecycleError is not one ... ok (1ms) - UI12: a refusal marked by another loaded copy is recognized ... ok (0ms) - UI12: an inherited mark is not an own mark ... ok (0ms) - UI12: an empty or malformed mark is rejected ... ok (0ms) - UI12: an unmarked error, and a value that is not one, are not refusals ... ok (0ms) - UI12: the reason is the marked one, and rewriting the message cannot change it ... ok (1ms) - UI12: the mark is non-enumerable, so copying and serializing drop it ... ok (0ms) -REPL entries: which refusal the screen may forget ... ok (1ms) -REPL entries: what the screen says the execution is doing ... - UI10: ready, running, waiting, settling, unfinished and complete each read differently ... ok (42ms) -REPL entries: what the screen says the execution is doing ... ok (42ms) -REPL entries: what a frozen position says is unavailable ... - UI15: History says submission is unavailable, hides live-only controls, and keeps the draft ... ok (26ms) -REPL entries: what a frozen position says is unavailable ... ok (31ms) -REPL entries: a retained close while the task is still coming down ... - UI11: settling refuses the next entry, and releasing teardown reads ready with no input ... ok (26ms) -REPL entries: a retained close while the task is still coming down ... ok (26ms) -REPL entries: what a failed entry says it failed with ... - UI13: the recorded reason is on the screen, bounded, and a cold reopen says the same ... ok (19ms) - UI13: the reason is drawn inside its region at every supported size, footer untouched ... ok (20ms) - UI13: an entry that did not fail is given no failure text ... ok (19ms) -REPL entries: what a failed entry says it failed with ... ok (57ms) -running 5 tests from ./packages/cli/tests/repl-execution.test.ts -REPL execution: submitting one entry ... - X1: admits the exact source, binds, generates, asks, and settles ... ok (89ms) - X1: the overlay reports its output as the document prints it ... ok (45ms) - X1: the generated fragment is shown before it is admitted, and follows the binding ... ok (34ms) - X1: shows the generated source before admitting it, then admits and evaluates it ... ok (37ms) - X1: an entry this environment cannot run leaves the history empty ... ok (7ms) - X1: a choice the form does not offer answers nothing and leaves the question open ... ok (50ms) - X1: an entry is refused while the entry before it has not settled ... ok (22ms) -REPL execution: submitting one entry ... ok (293ms) -REPL execution: reopening one history ... - X2: replays what was recorded and goes live at the first unrecorded step ... ok (44ms) - X2: the same counters do register the work a first run really performs ... ok (31ms) - X2: a recorded answer is restored without the provider being reached ... ok (35ms) - X2: a settled history reconstructs the same terminal model and runs nothing ... ok (23ms) - X2: the append observer lives exactly as long as the session ... ok (57ms) - X2: a session clears only the observer it installed ... ok (20ms) - X2: a diverging history refuses atomically ... ok (37ms) - X2: a refused reconstruction leaves nothing of itself behind ... ok (21ms) - X2: a history this version cannot project refuses before anything runs ... ok (19ms) -REPL execution: reopening one history ... ok (288ms) -REPL execution: pausing expansion ... - P1: stops at every boundary it crosses and continues past each one ... ok (40ms) - P1: the Journal advances after pause is requested and before it takes effect ... ok (57ms) - P1: continuing twice releases nothing the second time ... ok (31ms) - P1: a paused expansion is stopped, not cancelled, and the run is still there ... ok (58ms) - P1: tearing the owner down releases nothing that was held ... ok (14ms) - P1: a reconstructed session offers no Continue at all ... ok (19ms) - P1: an execution with no entry yet offers no Continue either ... ok (1ms) -REPL execution: pausing expansion ... ok (220ms) -REPL execution: the boundary inventory ... - P1: every member of every wrapped Api is a walk, a gate, or declared not to be one ... ok (0ms) - P1: the reference entry crosses the boundaries this controller accounts for ... ok (29ms) -REPL execution: the boundary inventory ... ok (29ms) -REPL execution: one execution's file ... - X2: writes each record before acknowledging it, and reads them all back ... ok (25ms) - X2: creating an execution that already exists is refused, not joined ... ok (1ms) - X2: refuses a history it cannot read, without quoting what it holds ... ok (21ms) - X2: an identifier that could address another directory never becomes a path ... ok (1ms) - X2: the kernel reaches the installed host, and refuses when none is installed ... ok (20ms) - X2: an empty file is an execution with no history rather than a refusal ... ok (2ms) -REPL execution: one execution's file ... ok (69ms) -running 2 tests from ./packages/cli/tests/repl-exit-pty.test.ts -REPL exit: the pty child this row owns ... - UI2: leaving the scope signals the child and waits for it to close ... ok (38ms) - UI2: an error is kept, and the owner still waits for the close ... ok (38ms) - UI2: a child that has already closed is not signalled again ... ok (1ms) -REPL exit: the pty child this row owns ... ok (82ms) -REPL exit: a real terminal, and nothing further typed ... - UI2: [exit] finishes the command with no further byte and no closed input ... ok (3s) - UI2: Control-C finishes the command the same way, with no control reached ... ok (1s) -REPL exit: a real terminal, and nothing further typed ... ok (4s) -running 11 tests from ./packages/cli/tests/repl-forms.test.ts -F1 — the bounded language is exact ... - F1: the Plan review schema parses into its complete form ... ok (3ms) - F1: project details and confirmation parse with their annotations ... ok (1ms) - F1: the parsed form is frozen, and the source schema is not ... ok (0ms) - F1: refuses a field keyword it does not model, naming $.properties.feedback.pattern ... ok (0ms) - F1: refuses a root keyword it does not model, naming $.oneOf ... ok (1ms) - F1: refuses an open root, naming $.additionalProperties ... ok (0ms) - F1: refuses a nested object field, naming $.properties.a.type ... ok (0ms) - F1: refuses a numeric field, naming $.properties.a.type ... ok (1ms) - F1: refuses an empty enum, naming $.properties.a.enum ... ok (0ms) - F1: refuses a mixed enum, naming $.properties.a.enum[1] ... ok (1ms) - F1: refuses a required name it does not declare, naming $.required ... ok (0ms) - F1: refuses a duplicate required name, naming $.required[1] ... ok (0ms) - F1: refuses a then with no if, naming $.then ... ok (1ms) - F1: refuses an if with no then, naming $.if ... ok (0ms) - F1: refuses a condition over a field the root does not declare, naming $.if.properties.b ... ok (0ms) - F1: refuses a conditional property the root does not declare, naming $.then.required ... ok (0ms) - F1: refuses a conditional constraint it does not model, naming $.then.properties.b.enum ... ok (0ms) - F1: refuses an if whose type is not object, naming $.if.type ... ok (0ms) - F1: refuses a then whose type is not object, naming $.then.type ... ok (1ms) - F1: refuses a condition that tests a type other than string, naming $.if.properties.a.type ... ok (0ms) - F1: refuses a condition that does not require the field it tests, naming $.if.required ... ok (1ms) - F1: a refused schema publishes nothing and asks nobody ... ok (4ms) -F1 — the bounded language is exact ... ok (22ms) -F2 — invalid stays open; valid is exact ... - F2: choosing Request changes with no feedback keeps the question and says why ... ok (26ms) - F2: entering feedback then submitting resolves with exactly that object ... ok (12ms) - F2: each field edits independently, whichever one the control names ... ok (9ms) - F2: both details are required, and one missing keeps the question open ... ok (7ms) - F2: confirmation returns exactly its offered decision ... ok (7ms) - F2: an option the field does not offer puts nothing into the form ... ok (4ms) - F2: an optional field deliberately emptied is present and empty ... ok (9ms) - F2: closing discards the draft, answers nothing, and reopens empty ... ok (9ms) - F2: an astral scalar survives typing, and one erase removes one scalar ... ok (6ms) -F2 — invalid stays open; valid is exact ... ok (90ms) -F3 — complete content and reachable navigation ... - F3: a field named after a turn's facts is still pointer-targetable ... ok (10ms) - F3: scrolling places every essential control in the narrow frame ... ok (138ms) - F3: the viewport walks the whole message before the form controls ... ok (116ms) - F3: the one History control is inside the drawer while it is open ... ok (23ms) - F3: the footer trigger is one fixed control, and the drawer holds the message ... ok (6ms) -F3 — complete content and reachable navigation ... ok (294ms) -F3 — focus returns to the invocation, not to where the drawer came from ... - F3: focus lands on the record this answer caused, once it appends ... ok (86ms) - F3: closing without answering moves focus to the invocation still asking ... ok (41ms) - F3: without the claim the drawer going leaves focus on an unrelated control ... ok (29ms) -F3 — focus returns to the invocation, not to where the drawer came from ... ok (157ms) -F1 — the form's conditional means exactly what Core validates ... - F1: a numeric tested type is false where a string equality would be true ... ok (3ms) - F1: an if with no required also matches the field being absent ... ok (2ms) -F1 — the form's conditional means exactly what Core validates ... ok (7ms) -F3 — every placed modal control is in the ring ... - UI16: Tab walks one whole cycle and Backtab walks it in reverse, inside the modal ... ok (38ms) -F3 — every placed modal control is in the ring ... ok (38ms) -F2 — an invalid answer is not a lifecycle refusal ... - UI17: the field keeps its own explanation, and the state row still says the state ... ok (31ms) -F2 — an invalid answer is not a lifecycle refusal ... ok (33ms) -F3 — the drawers that show a retained reading (#875 R1) ... - TL3: a binding's value is windowed, and a hidden row is in nothing ... ok (101ms) - TL3: two bindings with one name in two scopes keep separate offsets ... ok (4ms) - TL3: a stored offset past the end is clamped to what the frame shows ... ok (2ms) - TL3: scrolling a retained reading changes that offset and nothing else ... ok (1ms) -F3 — the drawers that show a retained reading (#875 R1) ... ok (110ms) -F3 — the History drawer is a window over every position (#875 R1) ... - TL3: the final position is absent until the window reaches it ... ok (99ms) - TL3: scrolling History selects no position ... ok (3ms) -F3 — the History drawer is a window over every position (#875 R1) ... ok (102ms) -F3 — a narrow frame offers no inspection control (#875 R1) ... - TL11: a recorded binding and answer are in a wide frame and in no part of a narrow one ... ok (27ms) - TL11: dismissing a recorded answer at a narrow size lands focus on a drawn control ... ok (27ms) -F3 — a narrow frame offers no inspection control (#875 R1) ... ok (54ms) -F3 — one committed frame, in the one order this product allows ... - TL9: a held measurement changes no tree, no focus and no committed frame ... ok (9ms) - TL9: a resize under a held measurement abandons the frame before reconciliation ... ok (8ms) - TL9: a measurement that fails commits nothing at all ... ok (1ms) -F3 — one committed frame, in the one order this product allows ... ok (18ms) -running 34 tests from ./packages/cli/tests/repl-journey.test.ts -REPL journey: one entry, from raw bytes ... - J1: pasting the reference entry puts all of it in the draft and the location ... ok (463ms) - J1: submitting admits exactly that source, and the run settles ... ok (1s) - J1: the question is answered through the terminal, and the answer settles ... ok (2s) - J1: a second process reconstructs the view from the URL and the journal alone ... ok (2s) - J1: starting with no location creates one execution and focuses an empty draft ... ok (30ms) -REPL journey: one entry, from raw bytes ... ok (6s) -REPL journey: leaving ... - J1: Control-C ends the command and prints the location ... ok (23ms) - J1: Control-C leaves a refusal, and it is still a refusal ... ok (53ms) - J1: input queued behind Control-C starts nothing and appends nothing ... ok (57ms) - J1: a cold reopen restores the selection, the history position and the draft ... ok (159ms) - J1: no other chord ends it, so what leaves is the key and not the modifier ... ok (98ms) -REPL journey: leaving ... ok (390ms) -REPL journey: what it refuses, and what it leaves alone ... - J1: an invalid navigation leaves the standing route, tree, focus and targets ... ok (2s) - J1: a document that cannot be admitted leaves the draft and an empty journal ... ok (305ms) - J1: a second entry is refused, and history does not change ... ok (1s) - J1: a corrupt history refuses atomically, with no append and no session ... ok (49ms) - J1: a malformed location reaches no path, no file and no terminal ... ok (1ms) - J1: a control chord inserts nothing into the draft ... ok (95ms) - J1: a terminal below the minimum refuses, and recovers when it grows ... ok (124ms) -REPL journey: what it refuses, and what it leaves alone ... ok (4s) -REPL journey: the whole of it, from raw bytes ... - J1: run, hold at a gate, inspect a prefix, return live, continue, answer, settle ... ok (4s) -REPL journey: the whole of it, from raw bytes ... ok (4s) -REPL journey: when a frame counts as applied ... - J1: a frame is not acknowledged until it has been presented ... ok (614ms) -REPL journey: when a frame counts as applied ... ok (614ms) -REPL journey: resizing while a frame is being prepared ... - J2: a window dragged while a frame is being prepared keeps the command ... ok (1s) -REPL journey: resizing while a frame is being prepared ... ok (1s) -REPL journey: the same product at every size ... - J1: a long draft stays exact and usable at medium, and no row crosses its region ... ok (408ms) - J1: a drawer covers what it is in front of, at medium and at wide ... ok (2s) - J1: narrow still routes one surface, with the location above it ... ok (43ms) -REPL journey: the same product at every size ... ok (2s) -REPL journey: what it settles before it acts ... - J1: a piped invocation refuses before a history file exists ... ok (137ms) - J1: a route naming a scope the history never had refuses before anything replays ... ok (558ms) - J1: a stale live-question URL refuses against a finished execution ... ok (769ms) - J1: an answered history with its root still open refuses the same URL ... ok (82ms) - J1: an accepted answer closes the drawer and clears it from the location ... ok (711ms) - J1: Continue is mounted only while a continuation is held ... ok (487ms) - J1: Continue is refused while a pause is still being taken ... ok (0ms) -REPL journey: what it settles before it acts ... ok (2s) -REPL journey: output nothing records still reaches the screen ... - J1: text the Journal has not settled is drawn while the run is held ... ok (727ms) -REPL journey: output nothing records still reaches the screen ... ok (727ms) -REPL journey: a position earlier than the entry being read ... - ER1: the invalid entry clears, and the draft, surface and position stand ... ok (1s) -REPL journey: a position earlier than the entry being read ... ok (1s) -REPL journey: three entries, one command ... - EJ1: a draft survives a refusal, inherits, fails, and is followed ... ok (2s) -REPL journey: three entries, one command ... ok (2s) -REPL journey: what an open drawer covers, through the terminal ... - TL6: narrow from the start, and through a resize round trip, it obscures what it covers ... ok (1s) -REPL journey: what an open drawer covers, through the terminal ... ok (1s) -REPL journey: a selection, a position and a draft across a resize ... - TL10: wide to narrow and back keeps the whole reading, and a cold open restores it ... ok (1s) -REPL journey: a selection, a position and a draft across a resize ... ok (1s) -REPL journey: a cold process over a multi-entry journal ... - EC1: the same catalog and the same selected entry, with no work and no append ... ok (536ms) -REPL journey: a cold process over a multi-entry journal ... ok (536ms) -REPL first use: UI2 ... - UI2: Enter on [exit] ends the command without touching the history ... ok (156ms) -REPL first use: UI2 ... ok (155ms) -REPL first use: UI2 ... - UI2: a pointer on [exit] is the same act as Enter on it ... ok (107ms) -REPL first use: UI2 ... ok (107ms) -REPL first use: UI1 ... - UI1: the guidance teaches the ring that is mounted, at both sizes ... ok (689ms) -REPL first use: UI1 ... ok (689ms) -REPL first use: UI1/UI5 ... - UI1/UI5: the footer holds the actions, the band and the draft, in that order ... ok (247ms) -REPL first use: UI1/UI5 ... ok (247ms) -REPL first use: UI9 ... - UI9: typing at a control never reaches the draft, and the screen says why ... ok (469ms) -REPL first use: UI9 ... ok (468ms) -REPL first use: UI2 too small ... - UI2: below the minimum there is no exit to aim at, and Escape leaves ... ok (149ms) -REPL first use: UI2 too small ... ok (149ms) -REPL first use: UI3 ... - UI3: a question on Sessions moves nothing, and is reached by activating it ... ok (949ms) -REPL first use: UI3 ... ok (949ms) -REPL first use: UI1 selection ... - UI1: the active surface and the selected entry are marked in the frame ... ok (2s) -REPL first use: UI1 selection ... ok (2s) -REPL first use: UI10 narrow guidance ... - UI10: at 72x20 the row says the state, what Enter does, and the way back, whole ... ok (274ms) -REPL first use: UI10 narrow guidance ... ok (274ms) -REPL first use: UI10 narrow drawer guidance ... - UI10: at 72x20 a focused field and a focused drawer control each say state, action, Esc and movement ... ok (690ms) -REPL first use: UI10 narrow drawer guidance ... ok (690ms) -REPL first use: UI15 drawer geometry ... - UI15: guidance saying History does not move what reading the drawer answers ... ok (675ms) -REPL first use: UI15 drawer geometry ... ok (676ms) -REPL first use: UI12 refusal ... - UI12: a lifecycle refusal keeps the draft and goes when the entry it named ends, untouched ... ok (1s) -REPL first use: UI12 refusal ... ok (1s) -REPL first use: UI1 narrow question ... - UI1: the longest question still has a placed, targetable control at 72x20 ... ok (1s) -REPL first use: UI1 narrow question ... ok (1s) -REPL first use: UI2 refusal ... - UI2: a normal-sized refusal is left by its own visible control ... ok (192ms) - UI2: Enter on the refusal's control leaves it too ... ok (172ms) -REPL first use: UI2 refusal ... ok (364ms) -REPL first use: UI3 ... - UI3: a question that disappears takes its drawer, and answers nothing ... ok (774ms) -REPL first use: UI3 ... ok (774ms) -REPL first use: UI4 ... - UI4: a live question's drawer is refused wherever it cannot belong ... -------- post-test output ------- -P0 standing: [" │entry ",">> Draft:"] -P1 after [history]: [" │entry "," > [↑ earlier]"," > Draft:"] -P2 after marker click: [" │entry "," > [↑ earlier]"," > Draft:"] -P3 after close: ["> Sessions │Transcript "," │entry "," > Draft:"] ------ post-test output end ----- - UI4: a live question's drawer is refused wherever it cannot belong ... ok (1s) -REPL first use: UI4 ... ok (1s) -REPL first use: UI6 ... - UI6: the draft stays visible and intact under a drawer, and is not editable through it ... ok (1s) -REPL first use: UI6 ... ok (1s) -REPL first use: UI7 ... - UI7: leaving strips the drawers only this process could mount ... ok (932ms) -REPL first use: UI7 ... ok (932ms) -REPL first use: UI8 ... - UI8: the whole first-use path, using only what the screen says ... ok (2s) -REPL first use: UI8 ... ok (2s) -REPL first use: C1 narrow ... - C1: submit, answer, dismiss, reopen, settle, Sessions, History, live and exit at 72x20 ... ok (2s) -REPL first use: C1 narrow ... ok (2s) -running 5 tests from ./packages/cli/tests/repl-layout-admission.test.ts -REPL layout: what an empty measurement describes ... - TL2: a measured viewport holds no node, no cell and no target ... ok (13ms) - TL2: capacity describes the region, not whatever is overflowing it ... ok (3ms) - TL2: an action label is measured with the focus marker it draws with ... ok (3ms) -REPL layout: what an empty measurement describes ... ok (25ms) -REPL layout: what a window admits ... - TL3: a row outside the window is in no node, cell, target or Tab stop ... ok (9ms) - TL3: no row is drawn outside the viewport it was admitted to ... ok (3ms) - TL3: earlier and later reach every row, including the last ... ok (29ms) - TL3: the first scroll after a resize moves from the clamp that is drawn ... ok (9ms) -REPL layout: what a window admits ... ok (51ms) -REPL layout: what an action row admits ... - TL4: a row too narrow for everything admits a whole prefix only ... ok (5ms) - TL4: every admitted control is drawn whole, inside the row ... ok (2ms) - TL4: a control the row cannot hold does not let a narrower one past it ... ok (1ms) -REPL layout: what an action row admits ... ok (9ms) -REPL layout: what a shrinking reading leaves behind ... - TL5: cells a filtered reading vacates are blank, not merely undescribed ... ok (5ms) - TL5: the rows that remain are still drawn where the frame says ... ok (4ms) -REPL layout: what a shrinking reading leaves behind ... ok (10ms) -REPL layout: the profiles this product supports ... - TL1: every supported size keeps its columns and its seven footer rows ... ok (6ms) -REPL layout: the profiles this product supports ... ok (6ms) -running 1 test from ./packages/cli/tests/repl-lifecycle.test.ts -Tier L — the reading one entry leaves behind ... - L1: a repeated element is two calls, never one overwritten by the other ... ok (71ms) - L1: a nested element is a child of the call that reached it ... ok (38ms) - L2: an element waiting on a question says so, and stops when it is answered ... ok (37ms) - L2: ordinary work is not a wait ... ok (21ms) - L3: an entry that closes takes its reading, and says it is no longer live ... ok (20ms) - L3: observing changes neither the outcome nor what the document rendered ... ok (42ms) -Tier L — the reading one entry leaves behind ... ok (234ms) -running 6 tests from ./packages/cli/tests/repl-model.test.ts -REPL model: what one journal projects ... - M1: projects an empty journal as an execution with no entry ... ok (3ms) - M2: projects the reference entry into the documented scopes ... ok (67ms) - M1: deep-freezes the model and reprojects the same journal identically ... ok (30ms) - M3: holds only frozen copies, and leaves the events exactly as they were ... ok (27ms) - M1: a selected prefix shows only what that prefix admitted ... ok (34ms) - M1: offers a checkpoint for each selectable position, in append order ... ok (27ms) -REPL model: what one journal projects ... ok (195ms) -REPL model: the histories it refuses ... - M1: refuses a marker this journal does not hold, rather than showing the head ... ok (24ms) - M1: refuses work outside an entry boundary, and a repeated close ... ok (23ms) - M1: refuses a payload it cannot read, and exposes no partial model ... ok (24ms) - M2: refuses an owning source position that was removed or points elsewhere ... ok (24ms) - M2: refuses a source position that will not read at all ... ok (27ms) - E1: refuses an answered question that retains no schema ... ok (25ms) - E1: a refused answer leaves no answered question in the projection ... ok (33ms) -REPL model: the histories it refuses ... ok (184ms) -REPL model: the Agent conversations it projects ... - M1: projects each retained Prompt as one turn owned by its exact scope ... ok (49ms) - M1: groups conversations by session key and by nothing else ... ok (46ms) - M1: orders the chronology by sequence where append order disagrees ... ok (46ms) - M1: settlement contributes one semantic transcript row and checkpoint ... ok (42ms) - M3: one retained turn is one object, however it is reached ... ok (39ms) - M3: Agent values are frozen copies, and the events come out unchanged ... ok (32ms) -REPL model: the Agent conversations it projects ... ok (256ms) -REPL model: the Agent histories it refuses ... - M2: a prefix before a Prompt append holds no turn, and after it holds all of it ... ok (34ms) - M2: refuses a Prompt record it cannot read, and exposes no partial model ... ok (36ms) - M2: refuses duplicate Prompt sequences instead of guessing from append order ... ok (33ms) - M2: refuses an audit it cannot read rather than reading it as none ... ok (32ms) - M2: refuses a Prompt whose owner cannot be decided, and never guesses one ... ok (34ms) - M2: a marker this journal does not hold refuses rather than showing the head ... ok (34ms) -REPL model: the Agent histories it refuses ... ok (203ms) -REPL model: the declared sources it owns ... - M3: a declared component's retained origin and bytes become its scope ... ok (0ms) - M3: the optional exact disposition is read, and only as `true` ... ok (1ms) - M3: a missing, malformed, repointed or duplicated source owns nothing ... ok (0ms) - M3: a position naming both a path and a generated fragment is malformed ... ok (0ms) -REPL model: the declared sources it owns ... ok (2ms) -REPL model: which generated fragment owns pathless work ... - GS1: one fragment's own work projects under it ... ok (0ms) - GS2: two sequential fragments become the scopes their own ids name ... ok (0ms) - GS3: sibling admissions keep their own work whatever order they settle in ... ok (1ms) - GS4: a fragment that spawns keeps the work its descendants performed ... ok (0ms) - GS5: every way a history names no one fragment refuses whole ... ok (1ms) - GS6: projecting the same history twice reproduces the same hierarchy ... ok (1ms) -REPL model: which generated fragment owns pathless work ... ok (4ms) -running 12 tests from ./packages/cli/tests/repl-presentation-style.test.ts -REPL presentation: what one row's cells say it is ... - G1: output, metadata and the two outcomes are four different readings ... ok (94ms) - G1: a settled document's recorded result is output, not an outcome ... ok (33ms) - G1: a root that recorded no result shows its outcome and its reason ... ok (43ms) - G1: an entry that never closed reads as waiting, and says so ... ok (45ms) - G1: an empty screen's placeholders are subordinate, and the draft is a surface ... ok (10ms) - G1: the History band keeps its own surface and accent at every size ... ok (45ms) -REPL presentation: what one row's cells say it is ... ok (276ms) -REPL presentation: selection and focus are two different facts ... - G2: a selected entry stays selected while focus is somewhere else ... ok (32ms) - G2: focus moving onto the selected row leaves its selection alone ... ok (34ms) - G2: a pointer and Enter on one row ask for the same thing ... ok (33ms) -REPL presentation: selection and focus are two different facts ... ok (101ms) -REPL presentation: what an updated frame leaves behind ... - G5: a long reading, then a short one, then a closed drawer, is fresh-C ... ok (46ms) - G5: an open drawer's interior is opaque inside the bounds the engine gave it ... ok (37ms) - G5: the grid it all rests on retains the attributes a cell was written under ... ok (0ms) -REPL presentation: what an updated frame leaves behind ... ok (86ms) -REPL presentation: the panes a reading is laid out in ... - P1: each shared column is named, and says so while it is empty ... ok (31ms) - P1: a narrow frame has no pane to name, and names none ... ok (24ms) - P1: a row is built to the inside of its pane, not to the pane ... ok (30ms) - P2: the footer keeps seven rows, and the draft says what it is ... ok (34ms) - P2: the draft is marked unfocused when focus is elsewhere ... ok (26ms) - P3: the dedicated location is drawn nowhere and reserves nothing ... ok (34ms) -REPL presentation: the panes a reading is laid out in ... ok (182ms) -REPL presentation: what a drawer says it is showing ... - D1: a binding drawer names the kind of reading and the binding ... ok (35ms) - D1: a recorded answer says so, and keeps the origin it came from ... ok (54ms) - D1: History names itself, and its rows keep the band's own accent ... ok (26ms) - D2: a drawer's actions sit on their own surface, and only one is focused ... ok (36ms) - D3: a recorded position reads as history, and returning live clears it ... ok (34ms) -REPL presentation: what a drawer says it is showing ... ok (189ms) -REPL presentation: a row stays inside the pane it was measured for ... - R3: long metadata is fitted, and the row beneath it is its own ... ok (20ms) -REPL presentation: a row stays inside the pane it was measured for ... ok (20ms) -REPL presentation: the one guidance row ... - R6: what the row must say fits the room it was measured for, whole ... ok (30ms) -REPL presentation: the one guidance row ... ok (31ms) -REPL presentation: what the characters of a reading are ... - P1-T1: a source row's delimiters, names, values and references are each their own ... ok (30ms) - P1-T1: a binding's JSON is read as JSON, escapes and all ... ok (15ms) - P1-T1: an unfinished draft keeps every character it has ... ok (24ms) -REPL presentation: what the characters of a reading are ... ok (69ms) -REPL presentation: focus marks the row without repainting it ... - P1-T2: a focused draft keeps its token colours while the marker is the cyan ... ok (27ms) -REPL presentation: focus marks the row without repainting it ... ok (27ms) -REPL presentation: the surfaces a reading is drawn on ... - P1-T3: an empty screen's panes, edges and uncovered area are each their own ... ok (27ms) - P1-T3: a question drawer is bounded, named as waiting, and read in groups ... ok (33ms) - P1-T3: a shorter reading and a closed drawer leave nothing behind ... ok (38ms) -REPL presentation: the surfaces a reading is drawn on ... ok (101ms) -REPL presentation: decoration the frame measured ... - P1-T4: the drawer's rule and inset are measured, and every row lands inside them ... ok (24ms) - P1-T4: a reading longer than the decorated window is in no cell and no target ... ok (14ms) -REPL presentation: decoration the frame measured ... ok (39ms) -REPL presentation: a row the frame cannot hold whole ... - P1-T1: an overflowing source row keeps its roles and every character it shows ... ok (31ms) - P1-T2: an overflowing focused row keeps its cue and its roles ... ok (35ms) - P1-T3: a populated field keeps its name and its value apart at 72x20 ... ok (33ms) - P1-T1: a row the drawer does hold is read the same way ... ok (29ms) -REPL presentation: a row the frame cannot hold whole ... ok (128ms) -running 5 tests from ./packages/cli/tests/repl-route.test.ts -REPL route: the grammar ... - R1: decodes equivalent spellings and query orders into one route ... ok (3ms) - R1: round-trips every valid surface through one canonical spelling ... ok (1ms) - R1: refuses what the grammar cannot say ... ok (1ms) - R1: cannot spell a route the grammar would refuse ... ok (2ms) - ER1: one location carries entry, scope, draft, surface, drawer, filter and position ... ok (0ms) -REPL route: the grammar ... ok (14ms) -REPL route: resolving against one model ... - M3: returns the exact objects the model holds ... ok (67ms) - M3: the same view results from a journal read a second time ... ok (29ms) - R2: resolves a historical prefix and refuses a live question inside it ... ok (26ms) - R2: refuses a missing entry, scope, binding or incomplete path ... ok (32ms) - R2: a route selecting another prefix than the model refuses rather than answering ... ok (25ms) - R2: a refused navigation leaves the resolved view it was asked from untouched ... ok (25ms) - R2: the empty Sessions surface selects nothing at all ... ok (23ms) - ER1: a draft resolves beside an admitted entry, its scope and a frozen position ... ok (23ms) - ER1: an entry absent from the selected prefix refuses, whole ... ok (28ms) -REPL route: resolving against one model ... ok (280ms) -REPL route: a live question's drawer belongs to one place ... - UI4: resolution refuses what the grammar refuses, before anything adopts it ... ok (25ms) -REPL route: a live question's drawer belongs to one place ... ok (25ms) -REPL route: the conversation filter ... - R1: encodes session last, after every member that was canonical before it ... ok (1ms) - R1: leaves every location that names no conversation byte-identical ... ok (0ms) - R1: reads query members by name, so order still does not matter ... ok (0ms) - R1: refuses an empty, repeated or unspellable conversation ... ok (0ms) - R1: the permission drawer belongs to Sessions, carries nothing, and is one word ... ok (1ms) -REPL route: the conversation filter ... ok (3ms) -REPL route: resolving a conversation ... - R2: resolves a retained conversation to the exact group the model holds ... ok (39ms) - R2: resolves a live key only at the head, and only when the process says so ... ok (32ms) - R2: a historical prefix answers from its own retained groups and ignores the head ... ok (32ms) - R2: a conversation no turn ever joined cannot be selected ... ok (31ms) - R2: a refused filter leaves the standing route and selection untouched ... ok (33ms) - R2: a live permission drawer is live-only, and independent of a live question ... ok (32ms) - R2: the two live facts stay independent of each other ... ok (20ms) -REPL route: resolving a conversation ... ok (219ms) -running 11 tests from ./packages/cli/tests/repl-terminal.test.ts -REPL terminal: responsive semantic frames ... - F1: a wide frame carries the sidebar, transcript, inspection and fixed footer ... ok (15ms) - F1: a medium frame keeps every region, narrower ... ok (4ms) - F1: a narrow frame routes one content surface and keeps the drawer and footer ... ok (5ms) - F1: narrow shows the routed surface, and no other surface is reachable ... ok (6ms) - F1: below the minimum the frame is an explicit refusal with nothing targetable ... ok (4ms) - F1: Sessions says so when there is nothing in it ... ok (2ms) - F1: compact geometry groups marker labels and keeps every marker's identity ... ok (8ms) - F1: resizing through every profile keeps selection, nodes and action identity ... ok (9ms) - UI5: the History band is placed in the footer, not at the frame's origin ... ok (6ms) - UI5: a refusal has no band to place and no cell to aim at ... ok (1ms) - UI5: every visible action has its own geometry in the frame's target map ... ok (5ms) - F1: a pointer against a control the refusal hides reaches nothing ... ok (3ms) -REPL terminal: responsive semantic frames ... ok (80ms) -REPL terminal: frame and renderer ownership ... - H1: a frame advances only once every subscriber has applied the last one ... ok (45ms) - H1: a subscriber holding a frame holds the whole stream until it applies it ... ok (37ms) - H1: cancelling a holder drops its demand without claiming it applied anything ... ok (36ms) - H1: no demand outlives a subscription, at any turn of its life ... ok (102ms) - H1: a settled tree schedules no timer at all ... ok (36ms) - H1: a cross-component animation belongs to exactly its nearest common ancestor ... ok (15ms) - H1: rendered bytes are copied out before the engine reuses its view ... ok (6ms) - H1: what a caller does to bytes it holds cannot change a later render ... ok (10ms) - H1: a frame drawn after a removal draws only what is still mounted ... ok (3ms) - H1: capacity replacement redraws the identical logical frame ... ok (296ms) -REPL terminal: frame and renderer ownership ... ok (604ms) -REPL terminal: releasing this host's standard input ... - UI2: a cancellation that fails is a terminal failure, not a quiet exit ... ok (4ms) - UI2: a lock that will not release is a terminal failure too ... ok (3ms) - UI2: a release that fails fabricates no end of input, and restores once ... ok (13ms) - UI2: releasing is attempted once, however many times teardown runs ... ok (3ms) -REPL terminal: releasing this host's standard input ... ok (24ms) -REPL terminal: an owned input stream, and what releasing it costs ... - UI2: cleanup cancels the read it was holding, with no further byte ... ok (19ms) - UI2: the owner does not return until the stream's cleanup has finished ... ok (15ms) - UI2: end of input closes the stream and leaves nothing holding the terminal ... ok (18ms) - UI2: a read that fails is a terminal failure, and still releases everything ... ok (18ms) -REPL terminal: an owned input stream, and what releasing it costs ... ok (70ms) -REPL terminal: one suspension per chunk, buffered or not ... - UI2: a ready continuation runs between two chunks that were already waiting ... ok (5ms) -REPL terminal: one suspension per chunk, buffered or not ... ok (6ms) -REPL terminal: giving the terminal back ... - H2: a run that finishes stops the reader, drops every listener and resets once ... ok (19ms) - H2: a refusal restores everything a success would have ... ok (19ms) - H2: a failure restores everything before it propagates ... ok (18ms) - H2: a cancellation restores everything, including a reader mid-read ... ok (15ms) - H2: end of input is a lifecycle outcome, and shuts down like the others ... ok (12ms) - H2: a cancellation during registration leaves no half-taken terminal ... ok (15ms) - H2: no reader and no resize listener outlives a cancellation, at any turn ... ok (159ms) - H2: nothing survives its owner, even the modes it never finished applying ... ok (21ms) -REPL terminal: giving the terminal back ... ok (279ms) -REPL terminal: what the host normalizes, and what it refuses to guess ... - I1: a key becomes a normalized event and a mouse press becomes a position ... ok (4ms) - I1: typed and pasted text arrives as text, in the order the terminal sent it ... ok (32ms) - I1: a chord types nothing, whatever letter it was pressed with ... ok (31ms) - I1: a shifted Tab goes backward, whichever way the terminal spells it ... ok (33ms) - I1: what a shifted Tab normalizes to actually moves focus back ... ok (3ms) - I1: going back inside a drawer stays inside it ... ok (3ms) - I1: text and Backspace reach the draft through the same ancestry as a key ... ok (2ms) - I1: text a row does not claim passes it on the way up ... ok (3ms) - I1: a lone Escape waits for the decoder's latency and then arrives ... ok (19ms) - I1: bytes that follow a pending Escape are rescanned with it, not split ... ok (12ms) - I1: a resize is a size the host reports, not a key anybody claims ... ok (4ms) - I1: a key and a click on one control produce one action ... ok (2ms) - I1: a pointer outside the open drawer reaches nothing ... ok (3ms) - I1: a pointer resolved against a frame the tree has moved past reaches nothing ... ok (2ms) - I1: a pointer naming a node the tree removed reaches nothing ... ok (3ms) -REPL terminal: what the host normalizes, and what it refuses to guess ... ok (158ms) -REPL terminal: what a drawer covers, and what it cannot reach ... - TL6: a drawer obscures the whole of its rectangle, blank cells included ... ok (5ms) - TL6: the footer is never covered, and a narrow start behaves the same ... ok (4ms) - TL6: a resize round trip keeps the drawer covering what it covers ... ok (10ms) - TL7: with engine capture off, dispatch behind the modal is still dropped ... ok (3ms) - TL7: traversal inside an open drawer visits only its own descendants ... ok (2ms) -REPL terminal: what a drawer covers, and what it cannot reach ... ok (26ms) -REPL terminal: committed geometry, and what it promises ... - TL8: every target's bounds are whole cells at every profile ... ok (15ms) - TL8: the trailing edge of a target belongs to whatever is after it ... ok (5ms) - TL8: an older frame's geometry does not move when a later frame is drawn ... ok (8ms) - TL11: exactly two engines are acquired, and reused for every frame ... ok (12ms) -REPL terminal: committed geometry, and what it promises ... ok (42ms) -REPL terminal: a measurement that does not commit ... - TL9: a held measurement mounts nothing, draws nothing and acknowledges nothing ... ok (9ms) - TL9: a measurement that fails mounts nothing and publishes no target ... ok (1ms) -REPL terminal: a measurement that does not commit ... ok (16ms) -REPL terminal: a frame that cannot be placed on cell boundaries ... - TL8: a fractional placement is refused, not rounded into a hit box ... ok (2ms) -REPL terminal: a frame that cannot be placed on cell boundaries ... ok (2ms) -running 3 tests from ./packages/cli/tests/run-composition-deno.test.ts -ORC7 — a Session launched in a managed Worktree ... - hands the launch that worktree's own root and a session key of its own ... ok (570ms) -ORC7 — a Session launched in a managed Worktree ... ok (575ms) -ORC18 — the journal is diagnostic ... - performs the same live work with and without a trace, once each ... ok (3s) -ORC18 — the journal is diagnostic ... ok (3s) -ORC15 — a trace is not evidence ... - refuses a PullRequest handed the trace of an execution that really published ... ok (1s) -ORC15 — a trace is not evidence ... ok (1s) -running 1 test from ./packages/cli/tests/run-composition-nested.test.ts -ORC19 — a nested run profile ... - stands the child where the document is, not where the process is ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - - - - - ------ post-test output end ----- - stands the child where the document is, not where the process is ... ok (2s) - does not let one child's Push authorize its sibling ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - - - - - - - ------ post-test output end ----- - does not let one child's Push authorize its sibling ... ok (3s) - gives a child its own lease owner, and keeps the parent's when it ends ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - - - - - - - - - ------ post-test output end ----- - gives a child its own lease owner, and keeps the parent's when it ends ... ok (2s) - does not let a parent's Push authorize its child ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - - - - - - - ------ post-test output end ----- - does not let a parent's Push authorize its child ... ok (3s) - does not let a child's Push authorize its parent ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - is not authorized by what this execution published: this execution holds no successful result for the branch and commit it would open a pull request from. Write before : a pull request names work this execution published, and publishing it is an explicit act. Nothing was observed at the Git host, and no pull request was created. ------ post-test output end ----- - does not let a child's Push authorize its parent ... ok (3s) - refuses outside a repository when nothing places the child in one ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - ------ post-test output end ----- - refuses outside a repository when nothing places the child in one ... ok (1s) -ORC19 — a nested run profile ... ok (15s) -running 4 tests from ./packages/cli/tests/run-composition.test.ts -ORC1 — describing the vocabulary reaches nothing ... - builds the catalog without a subprocess, a service, a request or a lock ... ok (185ms) - leaves every repository operation unprovided after inspection ... ok (61ms) -ORC1 — describing the vocabulary reaches nothing ... ok (248ms) -ORC2 — one language, described everywhere and operated somewhere ... - registers the same thirteen declarations the syntax catalog describes ... ok (114ms) - reports an absent provider for every repository operation, and mutates nothing ... ok (464ms) - leaves working, because it needs no provider at all ... ok (43ms) -ORC2 — one language, described everywhere and operated somewhere ... ok (623ms) -ORC2 — Dir is operational where the repository provider is not ... - creates the directory and runs its content with no repository provider ... ok (46ms) - refuses a non-directory target without a repository provider ... ok (44ms) -ORC2 — Dir is operational where the repository provider is not ... ok (90ms) -ORC2 — where the managed root is ... - names ~/.xmd/repositories and nothing a document can influence ... ok (41ms) -ORC2 — where the managed root is ... ok (41ms) -running 1 test from ./packages/cli/tests/run-deadline.test.ts -Tier RD — the run deadline ... - RD1: a malformed duration is refused before the run opens anything ... ok (7ms) - RD1a: the same holds for --timeout-exec and --timeout-fetch ... ok (4ms) - RD2: the deadline cancels a run suspended in its first read ... ok (209ms) - RD3: a run cancelled in preparation installs no provider and authors nothing ... ok (207ms) - RD4: an enclosing deadline bounds a run that named none ... ok (207ms) - RD5: an invalid enclosing deadline fails before the first read ... ok (3ms) - RD6: the command line's deadline outranks the enclosing one ... ok (205ms) - RD7: the run resolves its deadline exactly once ... ok (206ms) - RD8: teardown completes before the timeout is reported ... ok (206ms) - RD9: --timeout-fetch bounds a Fetch performed inside the run ... -------- post-test output ------- -# Doc ------ post-test output end ----- - RD9: --timeout-fetch bounds a Fetch performed inside the run ... ok (354ms) -Tier RD — the run deadline ... ok (1s) -running 1 test from ./packages/cli/tests/run-profile.test.ts -the bundled run profile ... - carries the bundled Plugin for the commands that reach a document ... ok (2ms) - carries it for the workflow actions that execute a document ... ok (1ms) - carries it for no workflow action that only reads or manages runs ... ok (1ms) - carries it for neither the test root nor a command that runs nothing ... ok (0ms) - resolves the reserved selector without loading anything ... ok (1ms) - gives a nested run child the bundled prefix without duplicating it ... ok (1ms) - refuses an impostor claiming the bundled name rather than dropping it ... ok (0ms) - leaves the selector's own spelling to the host, not a registry ... ok (1ms) -the bundled run profile ... ok (11ms) -running 1 test from ./packages/cli/tests/run-timeouts.test.ts -Tier TF — run timeout options ... - TF1: every option is absent until it is written ... ok (2ms) - TF2: each option fills its own field and no other ... ok (1ms) - TF3: the three compose without touching one another ... ok (0ms) - TF4: a value that is not a duration fails the invocation and names the option ... ok (2ms) - TF5: --timeout cancels the whole run ... -------- post-test output ------- -the run exceeded its --timeout of 500ms and was cancelled ------ post-test output end ----- - TF5: --timeout cancels the whole run ... ok (1s) - TF6: --timeout-exec bounds the block, and the run deadline is not what fired ... -------- post-test output ------- -exec(bash) timed out after 500ms ------ post-test output end ----- - TF6: --timeout-exec bounds the block, and the run deadline is not what fired ... ok (1s) - TF7: --timeout-fetch is not an exec timeout ... -------- post-test output ------- -SLEPT ------ post-test output end ----- - TF7: --timeout-fetch is not an exec timeout ... ok (1s) - TF8: a block's own duration overrides --timeout-exec for that block alone ... -------- post-test output ------- -DECLARED_FINISHED - -exec(bash) timed out after 500ms ------ post-test output end ----- - TF8: a block's own duration overrides --timeout-exec for that block alone ... ok (2s) - TF9: a longer exec timeout cannot outlive the run deadline ... -------- post-test output ------- -the run exceeded its --timeout of 500ms and was cancelled ------ post-test output end ----- - TF9: a longer exec timeout cannot outlive the run deadline ... ok (1s) - TF10: a bare timeout with no --timeout-exec refuses ... -------- post-test output ------- -`timeout` names no duration and the run configured none — write `timeout=` on the block, or start the run with --timeout-exec= ------ post-test output end ----- - TF10: a bare timeout with no --timeout-exec refuses ... ok (789ms) - TF11: a malformed option value is refused before the document is inspected ... -------- post-test output ------- ---timeout-exec must be a duration like 500ms, 30s, or 5min, got "30 seconds" -invalid props schema: schema is invalid: data/properties/who/type must be equal to one of the allowed values, data/properties/who/type must be array, data/properties/who/type must match a schema in anyOf ------ post-test output end ----- - TF11: a malformed option value is refused before the document is inspected ... ok (1s) -Tier TF — run timeout options ... ok (9s) -running 1 test from ./packages/cli/tests/secret-detection-cli.test.ts -Tier SD — the CLI secret-detection opt-out ... - SD1: xmd run refuses a credential-shaped document by default ... -------- post-test output ------- -secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:207 -Fix the code or data flow that produced it. ------ post-test output end ----- - SD1: xmd run refuses a credential-shaped document by default ... ok (745ms) - SD2: --no-secret-detection runs the same document ... -------- post-test output ------- -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. ------ post-test output end ----- - SD2: --no-secret-detection runs the same document ... ok (726ms) - SD3: the implicit run form honours the option in both directions ... -------- post-test output ------- -secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:207 -Fix the code or data flow that produced it. -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. ------ post-test output end ----- - SD3: the implicit run form honours the option in both directions ... ok (1s) - SD4: the inline form honours the option in both directions ... -------- post-test output ------- -secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:203 -Fix the code or data flow that produced it. -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. ------ post-test output end ----- - SD4: the inline form honours the option in both directions ... ok (1s) - SD5: xmd test on one document is default-on and honours the opt-out ... -------- post-test output ------- -secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:272 -Fix the code or data flow that produced it. -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - - - -> ✅ **Assert** passed -> actual: true - - - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. ------ post-test output end ----- - SD5: xmd test on one document is default-on and honours the opt-out ... ok (1s) - SD6: xmd test on a directory is default-on and honours the opt-out ... -------- post-test output ------- - -# a.test.md - -a.test.md: secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:272 -Fix the code or data flow that produced it. - -# b.test.md - -b.test.md: secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:272 -Fix the code or data flow that produced it. - -2 of 2 documents failed -WARNING: secret detection is disabled; credentials may be persisted. - -# a.test.md - -# Tainted - - - -> ✅ **Assert** passed -> actual: true - - - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. - -# b.test.md - -# Tainted - - - -> ✅ **Assert** passed -> actual: true - - - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. ------ post-test output end ----- - SD6: xmd test on a directory is default-on and honours the opt-out ... ok (1s) - SD7: a directory run warns exactly once, however many documents it holds ... -------- post-test output ------- -WARNING: secret detection is disabled; credentials may be persisted. - -# a.test.md - -# Tainted - - - -> ✅ **Assert** passed -> actual: true - - - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. - -# b.test.md - -# Tainted - - - -> ✅ **Assert** passed -> actual: true - - - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789. ------ post-test output end ----- - SD7: a directory run warns exactly once, however many documents it holds ... ok (791ms) - SD8: the warning is stderr's alone and never carries the credential ... -------- post-test output ------- -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. ------ post-test output end ----- - SD8: the warning is stderr's alone and never carries the credential ... ok (759ms) - SD9: help lists the option a caller writes, on both commands ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. -Usage: xmd test [OPTIONS] [path] - -Arguments: - [path] markdown document or directory to test (defaults to the current directory) [default: .] - -Options: - --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - SD9: help lists the option a caller writes, on both commands ... ok (1s) - SD10: with detection on, the offending event never reaches the journal ... -------- post-test output ------- -secret detection rejected content before it was persisted: - @secretlint/secretlint-rule-github at 1:207 -Fix the code or data flow that produced it. ------ post-test output end ----- - SD10: with detection on, the offending event never reaches the journal ... ok (800ms) - SD11: with detection off, the same event reaches the journal ... -------- post-test output ------- -WARNING: secret detection is disabled; credentials may be persisted. -# Tainted - -The token is ghp_abcdefghijklmnopqrstuvwxyz0123456789 and must never persist. ------ post-test output end ----- - SD11: with detection off, the same event reaches the journal ... ok (804ms) - SD12: the value form is refused rather than silently read as enabled ... -------- post-test output ------- ---secret-detection does not take a value — secret detection is on by default, and `--no-secret-detection` is what turns it off ---no-secret-detection does not take a value — secret detection is on by default, and `--no-secret-detection` is what turns it off ------ post-test output end ----- - SD12: the value form is refused rather than silently read as enabled ... ok (1s) -Tier SD — the CLI secret-detection opt-out ... ok (13s) -running 1 test from ./packages/cli/tests/service-document.test.ts -attached service document integration ... - reconstructs a real attached service on partial replay and skips completed replay ... ok (290ms) - keeps a two-attachment ping-pong chain live across partial replay ... ok (447ms) - supervises an attached service that exits during projected content without restarting it ... ok (130ms) - fails projected content promptly, tears down retained service attachments, and does not restart ... ok (251ms) - tears down nested service attachments from inner lifetime to outer lifetime ... ok (203ms) -attached service document integration ... ok (1s) -running 1 test from ./packages/cli/tests/service-host.test.ts -attached service host adapter ... - forwards split ordinary bytes immediately and suppresses split handshake records ... ok (3ms) - bounds and suppresses an invalid handshake candidate ... ok (0ms) - starts genuinely concurrent service attachments and suppresses handshake records ... ok (111ms) - categorizes startup failures without exposing handshake records ... ok (866ms) - cancels startup and releases the child before the handshake ... ok (95ms) - cancels after the handshake and releases the child listener ... ok (99ms) - forwards unterminated ordinary stdout while the attached service is active ... ok (82ms) - translates an observable process teardown failure ... ok (2ms) - preserves an execution failure beside a translated teardown failure ... ok (2ms) - fails the owning scope when an attached process exits or repeats the handshake ... ok (186ms) -attached service host adapter ... ok (1s) -running 1 test from ./packages/cli/tests/session-launch-cli.test.ts -Tier CL — Session.Launch from the command line ... - CL1: help lists the roles and installs no agent or launcher ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in AGENTS.md - - AGENTS.md#Implementor - The implementor makes changes according to the approved plan. - - AGENTS.md#Architect - The architect reviews settled structural invariants. ------ post-test output end ----- - CL1: help lists the roles and installs no agent or launcher ... ok (1s) - CL2: a piped invocation refuses before any agent is resolved ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -# Repository Agents - -PREAMBLE_MARKER - -## Implementor - -The implementor makes changes according to the approved plan. - - needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. ------ post-test output end ----- - CL2: a piped invocation refuses before any agent is resolved ... ok (1s) - CL3: selecting one role excludes its sibling's preparation ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -# Repository Agents - -PREAMBLE_MARKER - -## Implementor - -The implementor makes changes according to the approved plan. - - needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. ------ post-test output end ----- - CL3: selecting one role excludes its sibling's preparation ... ok (1s) - CL4: nothing changes for a document that launches nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -PLAIN_MARKER - -This document launches nothing. ------ post-test output end ----- - CL4: nothing changes for a document that launches nothing ... ok (1s) - CL5: no behavior is keyed to the filename ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -# Repository Agents - -PREAMBLE_MARKER - -## Architect - -The architect reviews settled structural invariants. - - needs a terminal: a native agent UI reads keystrokes and draws on the screen, and this invocation has none. Run xmd from a terminal, or use a host that installs its own launcher. ------ post-test output end ----- - CL5: no behavior is keyed to the filename ... ok (1s) -Tier CL — Session.Launch from the command line ... ok (7s) -running 1 test from ./packages/cli/tests/stdin-cli.test.ts -Tier SI — standard-input root documents ... - SI1: a piped document reaches end of file and runs once ... ok (730ms) - SI2: the separator form selects standard input too ... ok (718ms) - SI3: the whole input is read, and preflight costs the earlier effect ... ok (703ms) - SI4: empty input is an empty root that emits nothing and does nothing ... ok (734ms) - SI5: the root reports and retains the exact supplied source ... ok (1s) - SI6: relative resolution is the invocation's, and is no file ... ok (726ms) - SI7: the ordinary run options apply to a document read from stdin ... ok (4s) - SI11: a value root read from stdin reserves stdout for its result ... ok (1s) - SI10: only a selected stdin root reads, and reading it executes nothing ... ok (623ms) - SI8: a failed read reports the fixed sentence and reaches nothing after it ... -------- post-test output ------- -READ_ME - - - ------ post-test output end ----- - SI8: a failed read reports the fixed sentence and reaches nothing after it ... ok (211ms) - SI9: cancelling a waiting read tears it down and reports no failure ... ok (44ms) - SI1b: the read waits for end of file and joins every chunk ... ok (6ms) - SI13: two roots refuse in either order, before anything is read ... ok (3s) - SI14: one root written twice refuses, and neither copy runs ... ok (1s) - SI15: an option's value, another command's argument and a typo are not roots ... ok (2s) - SI12: cancelling a stdin run returns only once its child is gone ... ok (2s) - SI12b: what a cancelled child writes while it stops is still captured ... ok (57ms) - SI9b: the stream adapter's listeners belong to the read's own scope ... ok (3ms) -Tier SI — standard-input root documents ... ok (21s) -running 1 test from ./packages/cli/tests/stdout-delivery.test.ts -Tier SDL — the listener lives for one delivery ... - SDL1: a delivery that succeeds leaves the stream as it found it ... ok (2ms) - SDL2: the trailing event still finds the listener, which is gone after it ... ok (4ms) - SDL3: the event may arrive first, and the first arrival is the verdict ... ok (0ms) - SDL4: a failure the stream reports once settles without waiting for a second ... ok (1ms) - SDL5: a write that refuses outright detaches too ... ok (0ms) - SDL6: a delivery that never settles detaches when its scope ends ... ok (1ms) - SDL7: no finished delivery absorbs a later, unrelated failure ... ok (0ms) - SDL8: the real process.stdout is left as it was found ... ok (1ms) -Tier SDL — the listener lives for one delivery ... ok (15ms) -running 4 tests from ./packages/cli/tests/syntax-cli.test.ts -Tier SX — the run profile the command describes ... - SX1: names core, Agent, testing and web defaults, and ... ok (140ms) - SX1b: describes once, as the component canonical core owns ... ok (78ms) - ORC1: names all thirteen repository-composition components, with contracts ... ok (114ms) - ORC1: a repository component of the same name shadows the default ... ok (91ms) - SX2: documents every complete built-in in the profile ... ok (124ms) - SX2b: reports the testing contracts as they actually are ... ok (76ms) - SX2b: publishes no terminal-grid construct, and probes no terminal to say so ... ok (70ms) - SX3: describes without minting an execution claimant ... ok (67ms) -Tier SX — the run profile the command describes ... ok (764ms) -Tier SX — the renderers take a value ... - SX4: renders both formats without reaching the filesystem ... ok (69ms) - SX4b: escapes a table cell that would otherwise shift the columns ... ok (0ms) - SX5: renders the same bytes twice from the same symbols ... ok (70ms) - SX6: renders the fixed category headings in order ... ok (68ms) -Tier SX — the renderers take a value ... ok (207ms) -Tier SX — the command line ... - SX7: explicit includes replace the defaults, in caller order ... -------- post-test output ------- -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Only", - "origin": { - "kind": "repository", - "path": "second/Only.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - } - }, - { - "kind": "component", - "name": "Shared", - "origin": { - "kind": "repository", - "path": "first/Shared.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "from the first include." - } - ] - } - ] -} -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Only", - "origin": { - "kind": "repository", - "path": "second/Only.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - } - }, - { - "kind": "component", - "name": "Shared", - "origin": { - "kind": "repository", - "path": "second/Shared.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "from the second include." - } - ] - } - ] -} ------ post-test output end ----- - SX7: explicit includes replace the defaults, in caller order ... ok (1s) - SX8: falls back to components and . when no include is written ... -------- post-test output ------- -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Default", - "origin": { - "kind": "repository", - "path": "components/Default.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - } - } - ] - } - ] -} ------ post-test output end ----- - SX8: falls back to components and . when no include is written ... ok (731ms) - SX8b: an ordinary run observes its own profile and includes, and agrees with the command ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -the first description. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Local.md` -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -the first description. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Local.md` - -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -the second description. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Local.md` - ------ post-test output end ----- - SX8b: an ordinary run observes its own profile and includes, and agrees with the command ... ok (2s) - SX9: reports an unusable include on stderr, exits 1, and prints no symbols ... -------- post-test output ------- -cannot list the components in --include "components": it is not a directory. ------ post-test output end ----- - SX9: reports an unusable include on stderr, exits 1, and prints no symbols ... ok (727ms) - SX16: `xmd syntax Elicit` renders the same text the named component does ... -------- post-test output ------- -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -**Available in this evaluation:** yes - -Asks a person a structured question and returns their answer. - -```mdx - -Which release should ship first? - -``` - -The content is the request shown to the person. `schema` is a JSON Schema the -answer is validated against, so what comes back is the shape the document said -it needed rather than free text a later step has to interpret. The answer binds -through `as`. - -The question is asked once and retained. A run that resumes after the answer was -given restores it rather than asking again, which is what makes a document with -an elicitation in it safe to interrupt. - -How the question reaches a person is the host's: a terminal prompts, and another -host may route it somewhere else entirely. The document states what it needs to -know, not how to ask. -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `AGENTS.md` - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `CLAUDE.md` - -### `` - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `package` | `string` | no | Workspace package to reserve on npm, e.g. packages/workflow | - -```json -{ - "type": "object", - "properties": { - "package": { - "type": "string", - "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", - "description": "Workspace package to reserve on npm, e.g. packages/workflow" - } - }, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `README.md` - was asked to document Nonexistent, which is not a component available here. ------ post-test output end ----- - SX16: `xmd syntax Elicit` renders the same text the named component does ... ok (2s) - SX17: the command and the component read one index, for every package ... -------- post-test output ------- -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -**Available in this evaluation:** yes - -Sends a prompt and renders the reply. - -```mdx -Summarise these release notes in three bullets. -``` - -The paired form sends its content. The reply is rendered where the element is -written, or bound with `as`. Props naming an agent, session or timeout override -the surrounding scope for this one prompt. - -A failed prompt renders what it got and the document continues, because a -partial answer is usually more useful than none. `throwOnError` stops the -document instead, for a prompt whose answer everything after it depends on. -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -**Available in this evaluation:** yes - -Sends a prompt and renders the reply. - -```mdx -Summarise these release notes in three bullets. -``` - -The paired form sends its content. The reply is rendered where the element is -written, or bound with `as`. Props naming an agent, session or timeout override -the surrounding scope for this one prompt. - -A failed prompt renders what it got and the document continues, because a -partial answer is usually more useful than none. `throwOnError` stops the -document instead, for a prompt whose answer everything after it depends on. ------ post-test output end ----- - SX17: the command and the component read one index, for every package ... ok (1s) - SX10: writes markdown by default and version-2 JSON with --json ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -from the first include. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `first/Shared.md` -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Shared", - "origin": { - "kind": "repository", - "path": "first/Shared.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "from the first include." - } - ] - } - ] -} ------ post-test output end ----- - SX10: writes markdown by default and version-2 JSON with --json ... ok (1s) - SX10b: prints neither terminal-grid name as syntax, and a file claiming one as a component ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Default.md` - -### `` - -a repository terminal. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Terminal.md` - -### `` - -a repository grid. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/Terminal/Grid.md` -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Default", - "origin": { - "kind": "repository", - "path": "components/Default.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - } - }, - { - "kind": "component", - "name": "Terminal", - "origin": { - "kind": "repository", - "path": "components/Terminal.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "a repository terminal." - }, - { - "kind": "component", - "name": "Terminal.Grid", - "origin": { - "kind": "repository", - "path": "components/Terminal/Grid.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "a repository grid." - } - ] - } - ] -} ------ post-test output end ----- - SX10b: prints neither terminal-grid name as syntax, and a file claiming one as a component ... ok (1s) - SX12: succeeds with the defaults in a package tree full of directory links ... -------- post-test output ------- -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - "kind": "structural", - "name": "All", - "origin": { - "kind": "structural", - "construct": "All" - }, - "syntax": [ - "……" - ], - "description": "Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output.", - "context": "The `` children this runs at the same time." - }, - { - "kind": "structural", - "name": "Answer", - "origin": { - "kind": "structural", - "construct": "Answer" - }, - "syntax": [ - "", - "…" - ], - "description": "Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins.", - "context": "A multiline template, in place of the single-line `template` prop." - }, - { - "kind": "structural", - "name": "Answers", - "origin": { - "kind": "structural", - "construct": "Answers" - }, - "syntax": [ - "…" - ], - "description": "Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing.", - "context": "`` matchers, and the body they answer for." - }, - { - "kind": "structural", - "name": "Break", - "origin": { - "kind": "structural", - "construct": "Break" - }, - "syntax": [ - "" - ], - "description": "Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs." - }, - { - "kind": "structural", - "name": "Case", - "origin": { - "kind": "structural", - "construct": "Case" - }, - "syntax": [ - "…", - "…" - ], - "description": "Define one branch of a ``. `…` matches with `===`; `…` is the final fallback.", - "context": "Markdown expanded when this case is selected." - }, - { - "kind": "structural", - "name": "Content", - "origin": { - "kind": "structural", - "construct": "Content" - }, - "syntax": [ - "", - "" - ], - "description": "Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot=\"footer\"`." - }, - { - "kind": "structural", - "name": "Each", - "origin": { - "kind": "structural", - "construct": "Each" - }, - "syntax": [ - "…" - ], - "description": "Repeat content for each item in an array. `…` binds each one to `item` inside.", - "as": "Optional. Captures the whole rendered loop instead of emitting it.", - "context": "Markdown rendered once per element." - }, - { - "kind": "structural", - "name": "Else", - "origin": { - "kind": "structural", - "construct": "Else" - }, - "syntax": [ - "…" - ], - "description": "The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else.", - "context": "The branch taken when the enclosing condition does not hold." - }, - { - "kind": "structural", - "name": "If", - "origin": { - "kind": "structural", - "construct": "If" - }, - "syntax": [ - "…" - ], - "description": "Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs.", - "context": "The branch taken when the condition holds, up to an ``." - }, - { - "kind": "structural", - "name": "Let", - "origin": { - "kind": "structural", - "construct": "Let" - }, - "syntax": [ - "…", - "" - ], - "description": "Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection.", - "as": "Required. The binding name the value is available under.", - "context": "Markdown whose rendered text becomes the binding, in the paired form." - }, - { - "kind": "structural", - "name": "Loop", - "origin": { - "kind": "structural", - "construct": "Loop" - }, - "syntax": [ - "…" - ], - "description": "Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required.", - "context": "Markdown expanded once per iteration." - }, - { - "kind": "structural", - "name": "Output", - "origin": { - "kind": "structural", - "construct": "Output" - }, - "syntax": [ - "…" - ], - "description": "Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered.", - "context": "The rendered output the run presents." - }, - { - "kind": "structural", - "name": "PrintErrors", - "origin": { - "kind": "structural", - "construct": "PrintErrors" - }, - "syntax": [ - "…" - ], - "description": "Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output.", - "context": "The region whose failures are printed rather than raised." - }, - { - "kind": "structural", - "name": "Return", - "origin": { - "kind": "structural", - "construct": "Return" - }, - "syntax": [ - "" - ], - "description": "Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema." - }, - { - "kind": "structural", - "name": "Spawn", - "origin": { - "kind": "structural", - "construct": "Spawn" - }, - "syntax": [ - "…" - ], - "description": "Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it.", - "context": "Markdown expanded in its own child, beside its siblings." - }, - { - "kind": "structural", - "name": "Switch", - "origin": { - "kind": "structural", - "construct": "Switch" - }, - "syntax": [ - "…" - ], - "description": "Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches.", - "context": "Direct `` branches considered in source order." - } - ] - }, - { - "kind": "built-in", - "entries": [ - { - "kind": "component", - "name": "Agent", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available.", - "context": "Markdown whose prompts and launches use this agent." - }, - { - "kind": "component", - "name": "AgentProvider", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs.", - "context": "Markdown expanded with this provider installed." - }, - { - "kind": "component", - "name": "ApproveAll", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied.", - "context": "Markdown whose permission requests are approved." - }, - { - "kind": "component", - "name": "AskPermission", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies.", - "context": "Markdown whose permission requests are asked about." - }, - { - "kind": "component", - "name": "Assert", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertExists", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertFalse", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "expr" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreater", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertGreaterOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLess", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertLessOrEqual", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertNotMatch", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return." - }, - { - "kind": "component", - "name": "AssertNotStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStrictEquals", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertStringIncludes", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [ - "actual", - "expected" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message.", - "as": "Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return.", - "context": "The expected value, in place of the `expected` prop." - }, - { - "kind": "component", - "name": "AssertThrows", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "message" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression.", - "as": "Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them.", - "context": "The Markdown expected to fail." - }, - { - "kind": "component", - "name": "CodeBlock", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close.", - "as": "Optional. Captures the exact fenced Markdown instead of emitting it." - }, - { - "kind": "component", - "name": "CollectJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one.", - "as": "Required. The journal snapshot." - }, - { - "kind": "component", - "name": "CollectOutput", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed.", - "as": "Required. The child's accumulated output." - }, - { - "kind": "component", - "name": "DiagnosticJournal", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read." - }, - { - "kind": "component", - "name": "Dir", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a directory. `…` changes the working directory for its content.", - "context": "The Markdown expanded in that directory." - }, - { - "kind": "component", - "name": "Elicit", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Ask a person a structured question. `…` shows the content as the request.", - "as": "Required. The validated answer, as a structured value.", - "context": "The request message the person is shown." - }, - { - "kind": "component", - "name": "Evaluate", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Evaluate program text. `` runs it.", - "as": "Optional. Captures the fragment's rendered output instead of emitting it." - }, - { - "kind": "component", - "name": "Execution", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties.", - "as": "Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously.", - "context": "The declarations for the child, then the assertions about it." - }, - { - "kind": "component", - "name": "Fail", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stop authored work with an actionable failure. `` raises the message where it is written." - }, - { - "kind": "component", - "name": "Fetch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported.", - "as": "Optional. Captures the response, which is what makes a non-2xx status data instead of a failure." - }, - { - "kind": "component", - "name": "File", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory.", - "as": "Optional. Captures the file's text instead of emitting it, in the reading form.", - "context": "The text to write, in the writing form." - }, - { - "kind": "component", - "name": "File.Delete", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output.", - "as": "Optional. Captures the empty string this renders, as for any text component." - }, - { - "kind": "component", - "name": "Git.Add", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Stage paths for commit. `` resolves Git pathspecs from the working directory." - }, - { - "kind": "component", - "name": "Git.Commit", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "description": "Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message.", - "as": "Optional. The full object id of the commit.", - "context": "The message body, expanded before the commit is made." - }, - { - "kind": "component", - "name": "Git.Push", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing." - }, - { - "kind": "component", - "name": "Git.Switch", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Switch or create a branch. `` starts a missing branch at the specified base." - }, - { - "kind": "component", - "name": "Glob", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results.", - "as": "Required. The matched paths, as a string array." - }, - { - "kind": "component", - "name": "Issue", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] - }, - "description": "Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope.", - "as": "Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone.", - "context": "The issue's description, for the form that files one." - }, - { - "kind": "component", - "name": "IssueTracker", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Select an issue tracker. `…` expands its content with the specified tracker in scope.", - "context": "The Markdown whose issues are filed there." - }, - { - "kind": "component", - "name": "Json", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [ - "value" - ], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Render a value as JSON text. `` writes the JSON where you put it.", - "as": "Optional. Captures the JSON text instead of emitting it." - }, - { - "kind": "component", - "name": "Parse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#" - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Errors on invalid content.", - "as": "Required. The validated value.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Plan", - "origin": { - "kind": "declared-markdown", - "origin": "@executablemd/cli/Plan.md", - "digest": "d97953c7f65cde0a2858761245d94e06cd31aaba6feb15622256d4dddcaafec2" - }, - "sourceKind": "declared-markdown", - "inspectability": "complete", - "forms": [ - "paired" - ], - "props": { - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it.", - "as": "Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written.", - "context": "The complete prompt, expanded once before authorship." - }, - { - "kind": "component", - "name": "Prompt", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead.", - "as": "Optional. Captures the reply instead of emitting it.", - "context": "The prompt text, in the paired form." - }, - { - "kind": "component", - "name": "PullRequest", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false - }, - "description": "Open or update a pull request. `…` uses its content as the body after ``.", - "as": "Optional. The pull request's repository, number, url, state and head and base commits.", - "context": "The pull request's body." - }, - { - "kind": "component", - "name": "PullRequest.Checks", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request checks. `` reads check runs and commit statuses for its head.", - "as": "Required. Each check's kind, name, head commit and outcome." - }, - { - "kind": "component", - "name": "PullRequest.Comments", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } - }, - "description": "Read pull request comments. `` reads both conversation and review comments.", - "as": "Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line." - }, - { - "kind": "component", - "name": "PullRequest.Reviews", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } - }, - "description": "Read pull request reviews. `` reads reviews from the specified pull request.", - "as": "Required. Each review's author, state, body, submission time, commit and url." - }, - { - "kind": "component", - "name": "Repository", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Clone or use a repository. `…` expands its content in the specified checkout.", - "as": "Optional. The path of the selected checkout.", - "context": "The Markdown expanded in that checkout." - }, - { - "kind": "component", - "name": "SafeParse", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": { - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] - }, - "description": "Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring.", - "as": "Required. The result: either the validated value or the issues that rejected it.", - "context": "The JSON text to parse." - }, - { - "kind": "component", - "name": "Session", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt.", - "context": "Markdown whose prompts and launches run in this session." - }, - { - "kind": "component", - "name": "Session.Launch", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it.", - "context": "The instructions the native session starts from." - }, - { - "kind": "component", - "name": "Syntax", - "origin": { - "kind": "protected", - "origin": "@executablemd/core" - }, - "sourceKind": "protected", - "inspectability": "complete", - "forms": [ - "self-closing" - ], - "props": { - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation.", - "as": "Optional. Captures the rendered text instead of emitting it." - }, - { - "kind": "component", - "name": "TempDir", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead.", - "as": "Optional. Captures the rendered directory path instead of emitting it.", - "context": "Markdown expanded with the temporary directory as its working directory." - }, - { - "kind": "component", - "name": "Test", - "origin": { - "kind": "registered", - "origin": "@executablemd/core", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document.", - "context": "The body of the test: its assertions and the work they judge." - }, - { - "kind": "component", - "name": "Testing", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all.", - "context": "The Markdown expanded in testing mode." - }, - { - "kind": "component", - "name": "Verbose", - "origin": { - "kind": "registered", - "origin": "@executablemd/cli", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content.", - "as": "Optional. Captures the rendered verbose text, or an empty string when verbosity is off." - }, - { - "kind": "component", - "name": "WebForm", - "origin": { - "kind": "registered", - "origin": "@executablemd/web", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "value", - "returns": {}, - "description": "Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser.", - "as": "Required. The validated response.", - "context": "The Markdown shown above the form." - }, - { - "kind": "component", - "name": "WorkflowRun", - "origin": { - "kind": "registered", - "origin": "@executablemd/testing", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile.", - "context": "The workflow-hosted executions this scope owns." - }, - { - "kind": "component", - "name": "Worktree", - "origin": { - "kind": "registered", - "origin": "@executablemd/workflow/composition", - "reserved": false - }, - "sourceKind": "registered", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "Create or use a worktree. `…` expands its content in the worktree.", - "as": "Optional. The path of the linked checkout.", - "context": "The Markdown expanded in that checkout." - } - ] - }, - { - "kind": "user-provided", - "entries": [ - { - "kind": "component", - "name": "Widget", - "origin": { - "kind": "repository", - "path": "components/Widget.md" - }, - "sourceKind": "markdown", - "inspectability": "complete", - "forms": [ - "self-closing", - "paired" - ], - "props": { - "type": "object", - "properties": {}, - "additionalProperties": false - }, - "captures": [], - "returnMode": "text", - "returns": { - "type": "string" - }, - "description": "a repository widget." - } - ] - } - ] -} ------ post-test output end ----- - SX12: succeeds with the defaults in a package tree full of directory links ... ok (777ms) - SX11: the symbols are inspection, and plan is the command that writes with them ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - SX11: the symbols are inspection, and plan is the command that writes with them ... ok (556ms) -Tier SX — the command line ... ok (13s) -Tier SX — the catalog a pipe receives ... - SX13: the Markdown form arrives whole, and equals a file redirect ... ok (1s) - SX14: the JSON form arrives whole, parses, and equals a file redirect ... ok (1s) - SX18: a run's own output arrives whole, and equals a file redirect ... ok (1s) - SX19: a consumer that closes a run's output early is not raised ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstwrite EPIPE -xmd-exit=1 ------ post-test output end ----- - SX19: a consumer that closes a run's output early is not raised ... ok (813ms) - SX15: a consumer that closes early fails the command ... -------- post-test output ------- -{ - "version": 2, - "categories": [ - { - "kind": "structural", - "entries": [ - { - xmd syntax: stdout did not accept the whole output: write EPIPE -xmd-exit=1 ------ post-test output end ----- - SX15: a consumer that closes early fails the command ... ok (894ms) -Tier SX — the catalog a pipe receives ... ok (6s) -running 3 tests from ./packages/cli/tests/targets-cli.test.ts -Tier CT — CLI document targets ... - CT1: help lists full canonical references in source order ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#Alpha - ALPHA_MARKER - - doc.md#Beta - BETA_MARKER - - doc.md#Beta/Nested - NESTED_MARKER - - doc.md#Gamma - GAMMA_MARKER ------ post-test output end ----- - CT1: help lists full canonical references in source order ... ok (568ms) - CT2: two sections with one canonical path are two rows, described apart ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#Same - The first section under this canonical path. - - doc.md#Same - The second section under the very same path. - - doc.md#Quiet ------ post-test output end ----- - CT2: two sections with one canonical path are two rows, described apart ... ok (727ms) - CT3: a document with no targets has no target section at all ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. ------ post-test output end ----- - CT3: a document with no targets has no target section at all ... ok (617ms) - CT4: help runs no component, block, authored write, or service ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#Work - Describes the work without performing any of it. ------ post-test output end ----- - CT4: help runs no component, block, authored write, or service ... ok (591ms) - CT5b: an unreadable reference and a missing file fail help too ... -------- post-test output ------- -Invalid document reference -ENOENT: no such file or directory, open 'absent.md' ------ post-test output end ----- - CT5b: an unreadable reference and a missing file fail help too ... ok (1s) - CT5e: a schema-invalid document fails help and describes nothing ... -------- post-test output ------- -invalid props schema: schema is invalid: data/properties/who/type must be equal to one of the allowed values, data/properties/who/type must be array, data/properties/who/type must match a schema in anyOf ------ post-test output end ----- - CT5e: a schema-invalid document fails help and describes nothing ... ok (599ms) - CT6a: a literal % is escape syntax, so its raw spelling is not a path ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in pct%zz.md - - pct%25zz.md#Alpha - RAW_PCT_MARKER -# Percent - -## Alpha - -RAW_PCT_MARKER -Invalid document reference -Invalid document reference ------ post-test output end ----- - CT6a: a literal % is escape syntax, so its raw spelling is not a path ... ok (2s) - CT6: a filename holding # or % is read and reprinted canonically ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in we#ird.md - - we%23ird.md#Sec - HASH_FILE_MARKER -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in pct%25.md - - pct%2525.md#Sec - PCT_FILE_MARKER -# Hashed - -## Sec - -HASH_FILE_MARKER ------ post-test output end ----- - CT6: a filename holding # or % is read and reprinted canonically ... ok (1s) - CT8: the default command selects the same target as the explicit one ... -------- post-test output ------- -# Report - -PREAMBLE_MARKER - -## Beta - -BETA_MARKER - -### Nested - -NESTED_MARKER - -# Report - -PREAMBLE_MARKER - -## Beta - -BETA_MARKER - -### Nested - -NESTED_MARKER - ------ post-test output end ----- - CT8: the default command selects the same target as the explicit one ... ok (1s) - CT10: no match fails before expansion and lists every available reference ... -------- post-test output ------- -"Delta" matches no document target. -Available targets: - doc.md#Alpha - doc.md#Beta - doc.md#Beta/Nested - doc.md#Gamma ------ post-test output end ----- - CT10: no match fails before expansion and lists every available reference ... ok (630ms) - CT10a: an invalid selector reports the whole catalog too ... -------- post-test output ------- -"%zz" is not a valid document target selector. -Available targets: - doc.md#Alpha - doc.md#Beta - doc.md#Beta/Nested - doc.md#Gamma ------ post-test output end ----- - CT10a: an invalid selector reports the whole catalog too ... ok (622ms) - CT10b: a document with no targets says so instead of listing none ... -------- post-test output ------- -"Any" matches no document target. -The document has no targets. ------ post-test output end ----- - CT10b: a document with no targets says so instead of listing none ... ok (626ms) - CT11: several matches fail and list every matching reference ... -------- post-test output ------- -"Same" matches more than one document target. -Matched targets: - doc.md#Same - doc.md#Same ------ post-test output end ----- - CT11: several matches fail and list every matching reference ... ok (621ms) - CT13: exotic headings are listed as canonical references ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#a%2Fb - SLASH_MARKER - - doc.md#star%2A - STAR_MARKER - - doc.md#hash%23tag - HASH_MARKER - - doc.md#pct%25value - PCT_MARKER - - doc.md#two%20words - SPACE_MARKER - - doc.md#%C3%9Cn%C3%AFc%C3%B8d%C3%A9 - UNICODE_MARKER ------ post-test output end ----- - CT13: exotic headings are listed as canonical references ... ok (573ms) - CT17: a valid exact or glob selector reports the whole catalog ... -------- post-test output ------- -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#Alpha - ALPHA_MARKER - - doc.md#Beta - BETA_MARKER - - doc.md#Beta/Nested - NESTED_MARKER - - doc.md#Gamma - GAMMA_MARKER -Usage: xmd run [OPTIONS] [path] - -Arguments: - [path] markdown document to execute, optionally `#` and one target selector; `xmd run -` reads the document from standard input instead - -Options: - -e, --eval [EVAL] inline markdown document to execute, in place of a path - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --agent-provider agent provider for agent components [default: acpx] - --default-agent [DEFAULTAGENT] default agent name (overrides DEFAULT_AGENT_NAME) - --approve-all approve every agent permission request [default: false] - --approve-reads approve read and search agent permissions, ask for the rest (default) [default: false] - --deny-all deny every agent permission request [default: false] - --timeout [TIMEOUT] deadline for the whole run, as a duration (500ms, 30s, 5min) - --timeout-exec [TIMEOUTEXEC] default timeout for each exec block, as a duration (500ms, 30s, 5min) - --timeout-fetch [TIMEOUTFETCH] default timeout for each fetch, as a duration (500ms, 30s, 5min) - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value. -Quote the document so the shell passes it as a single argument: - xmd -e '# Hello' - -`xmd run -` reads standard input to end of file and runs what it read, so a -command that writes a complete document composes with a run: - xmd plan "prepare the release" | xmd run - - -Only that exact spelling reads it. A bare `xmd -` names a file called `-`, -`xmd run -#Section` selects a section of that file, and --eval takes -its document as the value. - -A path is a document reference, and everything after its first `#` selects -one section of the document to run: - xmd run README.md#Release/Publish - xmd README.md#Release/* - -A selector must name exactly one section; `xmd run --help` -lists them. In a filename, write `#` as `%23` and a literal `%` as `%25`. - -Targets in doc.md - - doc.md#Alpha - ALPHA_MARKER - - doc.md#Beta - BETA_MARKER - - doc.md#Beta/Nested - NESTED_MARKER - - doc.md#Gamma - GAMMA_MARKER ------ post-test output end ----- - CT17: a valid exact or glob selector reports the whole catalog ... ok (1s) - CT18: an unmatched or ambiguous selector fails help and describes nothing ... -------- post-test output ------- -"Delta" matches no document target. -Available targets: - doc.md#Alpha - doc.md#Beta - doc.md#Beta/Nested - doc.md#Gamma -"Same" matches more than one document target. -Matched targets: - dup.md#Same - dup.md#Same ------ post-test output end ----- - CT18: an unmatched or ambiguous selector fails help and describes nothing ... ok (1s) - CT-text: a targeted text root keeps its stdout and printed-error contract ... -------- post-test output ------- -# Report - -PREAMBLE_MARKER - -## Alpha - -ALPHA_MARKER - ------ post-test output end ----- - CT-text: a targeted text root keeps its stdout and printed-error contract ... ok (720ms) -Tier CT — CLI document targets ... ok (16s) -Tier CT — exact target before execution ... - CT12: a replacement seen by preparation is refused before the installer ... ok (148ms) - CT12a: a replacement seen only by execution is refused without starting a service ... ok (129ms) -Tier CT — exact target before execution ... ok (276ms) -Tier CT — contextual help installs nothing ... - CT19: file help exits zero, describes the catalog, and never installs ... ok (12ms) -Tier CT — contextual help installs nothing ... ok (12ms) -running 1 test from ./packages/cli/tests/test-root-profile.test.ts -the profile each command runs with ... - resolves Git's vocabulary for an ordinary run ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -a run resolves this ------ post-test output end ----- - resolves Git's vocabulary for an ordinary run ... ok (1s) - resolves none of it at the test root ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - -> ❌ Test **the root writes Git vocabulary** failed (error): Failed to import component Dir: Cannot resolve component: Dir (searched: components, .) - - - - -tests failed: 1 test(s) failed in ------ post-test output end ----- - resolves none of it at the test root ... ok (1s) - resolves it inside a nested run child ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - - - - - - - - - ------ post-test output end ----- - resolves it inside a nested run child ... ok (1s) -the profile each command runs with ... ok (4s) -running 1 test from ./packages/cli/tests/test-target.test.ts -Tier DT — xmd test targets ... - DT1: a directory runs every test document beneath it ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT1: a directory runs every test document beneath it ... ok (897ms) - DT2: documents are identified and ordered by relative path ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT2: documents are identified and ordered by relative path ... ok (865ms) - DT3: ordinary markdown does not run under the default pattern ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT3: ordinary markdown does not run under the default pattern ... ok (867ms) - DT4: a directory with no matching document fails and names the pattern ... -------- post-test output ------- -no documents matched **/*.test.md in /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/bare ------ post-test output end ----- - DT4: a directory with no matching document fails and names the pattern ... ok (549ms) - DT5: a failing document is attributed, and the run continues and summarizes ... -------- post-test output ------- - -# broken.test.md - -# Broken - - - -> ❌ **Assert** failed — deliberate failure -> actual: false -> deliberate failure - -> ❌ Test **mixed suite failing document** failed (assertion): deliberate failure - - -broken.test.md: tests failed: 1 of 1 tests failed - mixed suite failing document: deliberate failure - -# ok.test.md - -# Ok - - - -> ✅ **Assert** passed -> actual: true - - - -1 of 2 documents failed ------ post-test output end ----- - DT5: a failing document is attributed, and the run continues and summarizes ... ok (743ms) - DT6: each document gets its own testing session ... -------- post-test output ------- - -# a-passes.test.md - -# First - - - -> ✅ **Assert** passed -> actual: true - - - -# b-empty.test.md - -# Second - -This document declares no tests. It fails on its own, because each document -gets its own testing session rather than inheriting the previous document's -count. - -b-empty.test.md: tests failed: no tests were discovered - -# c-passes.test.md - -# Third - - - -> ✅ **Assert** passed -> actual: true - - - -1 of 3 documents failed ------ post-test output end ----- - DT6: each document gets its own testing session ... ok (809ms) - DT7: a binding does not leak into the next document ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT7: a binding does not leak into the next document ... ok (895ms) - DT8: a single document reports exactly as it always has ... -------- post-test output ------- -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT8: a single document reports exactly as it always has ... ok (666ms) - DT9: a failing single document prints one diagnostic ... -------- post-test output ------- -# Broken - - - -> ❌ **Assert** failed — deliberate failure -> actual: false -> deliberate failure - -> ❌ Test **mixed suite failing document** failed (assertion): deliberate failure - - -tests failed: 1 of 1 tests failed - mixed suite failing document: deliberate failure ------ post-test output end ----- - DT9: a failing single document prints one diagnostic ... ok (664ms) - DT10: --journal is rejected for a directory before anything runs ... -------- post-test output ------- ---journal is not supported with a directory target — run a single document to write a trace ------ post-test output end ----- - DT10: --journal is rejected for a directory before anything runs ... ok (527ms) - DT11: run-only options stay exclusive to xmd run ... -------- post-test output ------- -unrecognized option for xmd test: --approve-all — agent options are exclusive to xmd run -unrecognized option for xmd test: --props — document properties are exclusive to xmd run ------ post-test output end ----- - DT11: run-only options stay exclusive to xmd run ... ok (1s) - DT12: a bare xmd test is the current directory ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT12: a bare xmd test is the current directory ... ok (1s) - DT13: a bare xmd test with no matches fails ... -------- post-test output ------- -no documents matched **/*.test.md in . ------ post-test output end ----- - DT13: a bare xmd test with no matches fails ... ok (528ms) - DT14: the default pattern reaches both root-level and nested documents ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT14: the default pattern reaches both root-level and nested documents ... ok (859ms) - DT15: a custom pattern discovers a differently named document ... -------- post-test output ------- - -# one.spec.md - -# One - - - -> ✅ **Assert** passed -> actual: true - - ------ post-test output end ----- - DT15: a custom pattern discovers a differently named document ... ok (670ms) - DT16: an explicit pattern replaces the default ... -------- post-test output ------- - -# one.spec.md - -# One - - - -> ✅ **Assert** passed -> actual: true - - ------ post-test output end ----- - DT16: an explicit pattern replaces the default ... ok (703ms) - DT17: repeated patterns run their union ... -------- post-test output ------- - -# one.spec.md - -# One - - - -> ✅ **Assert** passed -> actual: true - - - -# two.check.md - -# Two - - - -> ✅ **Assert** passed -> actual: true - - ------ post-test output end ----- - DT17: repeated patterns run their union ... ok (732ms) - DT18: a document matched by two patterns runs once ... -------- post-test output ------- - -# one.spec.md - -# One - - - -> ✅ **Assert** passed -> actual: true - - ------ post-test output end ----- - DT18: a document matched by two patterns runs once ... ok (659ms) - DT19: the union is ordered by relative path, not by pattern order ... -------- post-test output ------- - -# one.spec.md - -# One - - - -> ✅ **Assert** passed -> actual: true - - - -# two.check.md - -# Two - - - -> ✅ **Assert** passed -> actual: true - - ------ post-test output end ----- - DT19: the union is ordered by relative path, not by pattern order ... ok (731ms) - DT20: --pattern is rejected against a single document ... -------- post-test output ------- -unrecognized option for xmd test: --pattern — /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/patterns/three.test.md is a single document, so there is nothing to search ------ post-test output end ----- - DT20: --pattern is rejected against a single document ... ok (552ms) - DT21: an empty --pattern is rejected instead of falling back ... -------- post-test output ------- ---pattern requires a glob — an empty pattern matches nothing ------ post-test output end ----- - DT21: an empty --pattern is rejected instead of falling back ... ok (545ms) - DT22: help describes the optional path and the repeatable pattern ... -------- post-test output ------- -Usage: xmd test [OPTIONS] [path] - -Arguments: - [path] markdown document or directory to test (defaults to the current directory) [default: .] - -Options: - --pattern ... glob for test documents, relative to a directory target (repeatable) [default: **/*.test.md] - --include ... component search directory [default: components,.] - -V, --verbose log journal entries to stderr [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - DT22: help describes the optional path and the repeatable pattern ... ok (530ms) - DT23: a broad pattern deliberately runs ordinary markdown ... -------- post-test output ------- - -# notes.md - -# Notes - -Ordinary Markdown. Running it fails, which is how a suite proves it was left -alone under the default pattern. - - - -> ❌ **Assert** failed — notes.md should not have executed -> actual: false -> notes.md should not have executed - -> ❌ Test **ordinary markdown ran** failed (assertion): notes.md should not have executed - - -notes.md: tests failed: 1 of 1 tests failed - ordinary markdown ran: notes.md should not have executed - -1 of 1 documents failed ------ post-test output end ----- - DT23: a broad pattern deliberately runs ordinary markdown ... ok (665ms) - DT24: a directory target resolves the components beside its documents ... -------- post-test output ------- - -# Example.test.md - -# Example - - - - -> ✅ **AssertEquals** passed -> actual: "Example component" -> expected: "Example component" - - ------ post-test output end ----- - DT24: a directory target resolves the components beside its documents ... ok (693ms) - DT25: a nested document resolves the component beside it, not a sibling's ... -------- post-test output ------- - -# alpha/Widget.test.md - -# Alpha - - - - -> ✅ **AssertEquals** passed -> actual: "Alpha widget" -> expected: "Alpha widget" - - - -# beta/Widget.test.md - -# Beta - - - - -> ✅ **AssertEquals** passed -> actual: "Beta widget" -> expected: "Beta widget" - - ------ post-test output end ----- - DT25: a nested document resolves the component beside it, not a sibling's ... ok (750ms) - DT32: composition is document directory, target root, then the configured includes ... ok (0ms) - DT26: a --pattern with no value is rejected ... -------- post-test output ------- ---pattern requires a value — write `--pattern `, or `--pattern=` for a glob that begins with "-" ------ post-test output end ----- - DT26: a --pattern with no value is rejected ... ok (536ms) - DT27: another option is not read as the glob ... -------- post-test output ------- ---pattern requires a value — write `--pattern `, or `--pattern=` for a glob that begins with "-" ------ post-test output end ----- - DT27: another option is not read as the glob ... ok (531ms) - DT28: --pattern= expresses a glob that begins with a dash ... -------- post-test output ------- -no documents matched -weird.md in /Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/tests/fixtures/discovery/suite ------ post-test output end ----- - DT28: --pattern= expresses a glob that begins with a dash ... ok (531ms) - DT29: argv after -- is not inspected for options ... -------- post-test output ------- - -# a-binds.test.md - -# Binds - - - - - -> ✅ **AssertEquals** passed -> actual: "from-a" -> expected: "from-a" - - - -# b-reads.test.md - -# Reads - -The reference below stays verbatim because the binding belongs to another -document: {leaked} - - - - -> ✅ **AssertEquals** passed -> actual: "{leaked}" -> expected: "{leaked}" - - - -# nested/deep.test.md - -# Nested - - - - -> ✅ **AssertEquals** passed -> actual: "deep" -> expected: "deep" - - - -# passing.test.md - -# Passing - - - - -> ✅ **AssertEquals** passed -> actual: "Hello" -> expected: "Hello" - - ------ post-test output end ----- - DT29: argv after -- is not inspected for options ... ok (862ms) - DT30: a test path keeps its literal # and %, and no fragment is read ... -------- post-test output ------- - - -LITERAL_MARKER - - - - -LITERAL_MARKER - - -ENOENT: no such file or directory, open '/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-dt-044daf94-4742-437b-b0b1-e9b91a8c6467/we%23ird.test.md' ------ post-test output end ----- - DT30: a test path keeps its literal # and %, and no fragment is read ... ok (1s) - DT31: a failing command inside a test fails that test, and the next runs ... -------- post-test output ------- -BEFORE_FAILURE -AFTER_CONTAINMENT -# Commands - -A command that exits nonzero inside a test is that test's outcome, not the -document's: the test after it still runs, and `xmd test` decides the run. - - - - -> ❌ Test **a failing command fails its own test** failed (error): Command failed (exit 3) - - - - - - - -tests failed: 1 of 2 tests failed - a failing command fails its own test: Command failed (exit 3) ------ post-test output end ----- - DT31: a failing command inside a test fails that test, and the next runs ... ok (725ms) -Tier DT — xmd test targets ... ok (24s) -running 1 test from ./packages/cli/tests/testing-activation.test.ts -workflow installation and testing activation ... - refuses a the installation did not activate, before its body runs ... ok (97ms) -workflow installation and testing activation ... ok (101ms) -running 2 tests from ./packages/cli/tests/testing-execution-host.test.ts -nested execution under the production run host ... - runs referenced documents, targets and inline source as real roots ... -------- post-test output ------- -from a command - - - - - - - - - - - - - - - ------ post-test output end ----- - runs referenced documents, targets and inline source as real roots ... ok (1s) - resolves the packaged Component in a run child, and fails at its own first phase ... -------- post-test output ------- - - - ------ post-test output end ----- - resolves the packaged Component in a run child, and fails at its own first phase ... ok (802ms) - creates no authored file for an inline child ... -------- post-test output ------- - - - ------ post-test output end ----- - creates no authored file for an inline child ... ok (781ms) - resolves a child's component only through the outer command's includes ... -------- post-test output ------- - - - - - -> ❌ **AssertStringIncludes** failed -> actual: "" -> expected: "hello from the configured include" -> Expected actual to contain expected - -> ❌ Test **nested resolution** failed (assertion): Expected actual to contain expected - - -tests failed: 1 of 1 tests failed - nested resolution: Expected actual to contain expected ------ post-test output end ----- - resolves a child's component only through the outer command's includes ... ok (1s) - gives a nested run child its own catalog rather than the outer root's ... -------- post-test output ------- - - - -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `elsewhere/Greeting.md` - ------ post-test output end ----- - gives a nested run child its own catalog rather than the outer root's ... ok (1s) - gives a nested run child the documentation for what it registers ... -------- post-test output ------- - - - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -**Available in this evaluation:** yes - -Asks a person a question in a browser form. - -```mdx - -Choose how the release notes should be grouped. - -``` - -Builds the form from `schema` and shows its content above it. `uiSchema` sets -presentation options — ordering, widgets, labels — without changing what the -answer has to be. The validated response binds through `as`, which is required: -the answer is the point. - -Reach for `` instead when the document should not choose the browser. It -asks the same question and lets the host decide how — a terminal prompt, or -whatever else that host arranges. `` is for when the question genuinely -needs a form: several fields, a choice among many, anything awkward to type at a -prompt. - ------ post-test output end ----- - gives a nested run child the documentation for what it registers ... ok (1s) - gives a run child the ordinary read profile: File, Glob and Syntax ... -------- post-test output ------- - - - - - - - ------ post-test output end ----- - gives a run child the ordinary read profile: File, Glob and Syntax ... ok (903ms) - refuses outside a canonical ... -------- post-test output ------- - is valid only inside a canonical . ------ post-test output end ----- - refuses outside a canonical ... ok (729ms) - refuses on a host with no workflow profile ... -------- post-test output ------- - - -> ❌ Test **workflow** failed (error): needs a host that can execute workflow runs, and this one has no workflow profile. - - -tests failed: 1 of 1 tests failed - workflow: needs a host that can execute workflow runs, and this one has no workflow profile. ------ post-test output end ----- - refuses on a host with no workflow profile ... ok (692ms) -nested execution under the production run host ... ok (9s) -deterministic dependencies declared for a nested run ... - gives a declared child the agent defaults, its own session and its answers ... -------- post-test output ------- - - - - - - - - - - - - - ------ post-test output end ----- - gives a declared child the agent defaults, its own session and its answers ... ok (9s) - keeps the outer test's agent and answers out of the child ... -------- post-test output ------- - - - - - - - - - - - ------ post-test output end ----- - keeps the outer test's agent and answers out of the child ... ok (4s) - lets a repository TestAgent end the scan and configure nothing ... -------- post-test output ------- - - - ------ post-test output end ----- - lets a repository TestAgent end the scan and configure nothing ... ok (794ms) - gives each configured child its own Plan root, and keeps none of them ... -------- post-test output ------- - - - - - ------ post-test output end ----- - gives each configured child its own Plan root, and keeps none of them ... ok (5s) - installs the controlled Plan configuration and removes its root after cancellation ... ok (555ms) - stops authorship when a turn fails after emitting part of a candidate ... -------- post-test output ------- - - - ------ post-test output end ----- - stops authorship when a turn fails after emitting part of a candidate ... ok (2s) - supplies no Plan Agent context from a repository TestAgent ... -------- post-test output ------- - - - ------ post-test output end ----- - supplies no Plan Agent context from a repository TestAgent ... ok (837ms) - gives a direct test root no Plan authorship permission ... -------- post-test output ------- - - -> ❌ Test **a test root cannot write a Plan** failed (error): Failed to import component Plan: Cannot resolve component: Plan (searched: components, .) - - -tests failed: 1 of 1 tests failed - a test root cannot write a Plan: Failed to import component Plan: Cannot resolve component: Plan (searched: components, .) ------ post-test output end ----- - gives a direct test root no Plan authorship permission ... ok (682ms) - refuses an unreadable behavior document before the child's root is imported ... -------- post-test output ------- - - -> ❌ Test **an unreadable behavior document** failed (error): cannot read the behavior document "./agents/absent.md": ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-nested-KcvYOC/agents/absent.md' - - -tests failed: 1 of 1 tests failed - an unreadable behavior document: cannot read the behavior document "./agents/absent.md": ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-nested-KcvYOC/agents/absent.md' ------ post-test output end ----- - refuses an unreadable behavior document before the child's root is imported ... ok (690ms) - refuses a scripted agent when this entrypoint cannot re-invoke itself ... ok (132ms) - keeps ordinary resolution and Elicit validation inside a configured child ... -------- post-test output ------- - - - - - - - ------ post-test output end ----- - keeps ordinary resolution and Elicit validation inside a configured child ... ok (937ms) -deterministic dependencies declared for a nested run ... ok (26s) -running 1 test from ./packages/cli/tests/upgrade-cli.test.ts -Tier UC — xmd upgrade ... - UC1: program help lists the command with its settled description ... -------- post-test output ------- -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - UC1: program help lists the command with its settled description ... ok (574ms) - UC2: command help explains the whole command and performs none of it ... -------- post-test output ------- -Usage: xmd upgrade [OPTIONS] [tag] - -Arguments: - [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) - -Options: - --status report how the selected release compares, and change nothing [default: false] - --allow-downgrade consent to installing a release older than the installed one [default: false] - --allow-prerelease consent to installing the exact prerelease tag named [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -With no tag, xmd upgrade installs the latest published stable release. Name -an exact tag instead to select one release and only that release: - xmd upgrade - xmd upgrade v1.2.3 - xmd upgrade v1.3.0-rc.1 --allow-prerelease - - --status - Report the installed version, the selected release, how the two - compare and the exact release URL. It downloads no binary, locks - nothing and changes no files, and it accepts any published exact tag - without consent — so neither consent option may be written with it. - - --allow-downgrade - Consent to installing a release older than the installed one. It is - refused when the selected release is not older. - - --allow-prerelease - Consent to installing the exact prerelease tag named. It is refused - without one, because no implicit selection ever chooses a prerelease. - - --journal , -j - Write a diagnostic JSONL trace of this run to a new file. The path - must not exist. The trace is evidence only: it is never read back, it - resumes nothing, and it changes no output, release choice or consent. - With --status it is the one file the command writes. - -Only a compiled xmd on macOS or Linux can replace itself: - - compiled binary macOS or Linux: self-upgrade - Windows: use the installer or a release asset - npm or Node update with npm - Bun update with Bun - Deno or repository source update the package version or the checkout - -Every other combination stops with instructions for that installation before -the command reads release metadata or changes any files. - -An install downloads the release binary for this platform, checks it against -the published SHA-256 checksum, runs the verified candidate and requires it -to report the selected version, and only then replaces the binary that ran -this command with one atomic rename. Anything that fails before that rename -leaves the installed xmd exactly as it was. ------ post-test output end ----- - UC2: command help explains the whole command and performs none of it ... ok (533ms) - UC3: command help offers nothing a run configures ... -------- post-test output ------- -Usage: xmd upgrade [OPTIONS] [tag] - -Arguments: - [tag] exact release tag to install, such as v1.2.3 (default: the latest stable) - -Options: - --status report how the selected release compares, and change nothing [default: false] - --allow-downgrade consent to installing a release older than the installed one [default: false] - --allow-prerelease consent to installing the exact prerelease tag named [default: false] - -j, --journal [JOURNAL] write a diagnostic JSONL trace (path must not exist) - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -With no tag, xmd upgrade installs the latest published stable release. Name -an exact tag instead to select one release and only that release: - xmd upgrade - xmd upgrade v1.2.3 - xmd upgrade v1.3.0-rc.1 --allow-prerelease - - --status - Report the installed version, the selected release, how the two - compare and the exact release URL. It downloads no binary, locks - nothing and changes no files, and it accepts any published exact tag - without consent — so neither consent option may be written with it. - - --allow-downgrade - Consent to installing a release older than the installed one. It is - refused when the selected release is not older. - - --allow-prerelease - Consent to installing the exact prerelease tag named. It is refused - without one, because no implicit selection ever chooses a prerelease. - - --journal , -j - Write a diagnostic JSONL trace of this run to a new file. The path - must not exist. The trace is evidence only: it is never read back, it - resumes nothing, and it changes no output, release choice or consent. - With --status it is the one file the command writes. - -Only a compiled xmd on macOS or Linux can replace itself: - - compiled binary macOS or Linux: self-upgrade - Windows: use the installer or a release asset - npm or Node update with npm - Bun update with Bun - Deno or repository source update the package version or the checkout - -Every other combination stops with instructions for that installation before -the command reads release metadata or changes any files. - -An install downloads the release binary for this platform, checks it against -the published SHA-256 checksum, runs the verified candidate and requires it -to report the selected version, and only then replaces the binary that ran -this command with one atomic rename. Anything that fails before that rename -leaves the installed xmd exactly as it was. ------ post-test output end ----- - UC3: command help offers nothing a run configures ... ok (552ms) - UC4: this entrypoint refuses with its own remedy, and reads nothing first ... -------- post-test output ------- -# Upgrade XMD -This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. ------ post-test output end ----- - UC4: this entrypoint refuses with its own remedy, and reads nothing first ... ok (605ms) - UC5: --status refuses on this entrypoint too, before any release lookup ... -------- post-test output ------- -# Upgrade XMD -This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. ------ post-test output end ----- - UC5: --status refuses on this entrypoint too, before any release lookup ... ok (586ms) - UC6: a command line this command does not define never reaches the policy ... -------- post-test output ------- -xmd upgrade does not recognize --nope. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. -xmd upgrade does not recognize --timeout. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. -xmd upgrade does not recognize --version. It accepts one optional release tag and these options: --status, --allow-downgrade, --allow-prerelease, --journal. -xmd upgrade accepts at most one release tag. v1.2.4 is an extra argument. -unrecognized option for xmd upgrade: --props-name — document properties are exclusive to xmd run -unrecognized option for xmd upgrade: --eval — inline documents are exclusive to xmd run ------ post-test output end ----- - UC6: a command line this command does not define never reaches the policy ... ok (3s) - UC7: a value written on a switch is refused rather than read as its default ... -------- post-test output ------- ---status does not take a value. Use --status by itself or omit it. ---status does not take a value. Use --status by itself or omit it. ---allow-downgrade does not take a value. Use --allow-downgrade by itself or omit it. ------ post-test output end ----- - UC7: a value written on a switch is refused rather than read as its default ... ok (1s) - UC8: xmd workflow keeps its own --status ... -------- post-test output ------- -unrecognized value for --status: nonsense — expected one of running, suspended, interrupted, completed, failed, cancelled ------ post-test output end ----- - UC8: xmd workflow keeps its own --status ... ok (541ms) - UC9: --journal writes one new trace and changes nothing a reader sees ... -------- post-test output ------- -# Upgrade XMD -This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. -# Upgrade XMD -This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. ------ post-test output end ----- - UC9: --journal writes one new trace and changes nothing a reader sees ... ok (1s) - UC10: -j is the same option, and both refuse a path that exists ... -------- post-test output ------- -# Upgrade XMD -This xmd is running through Deno or a repository checkout. Update the jsr:@executablemd/cli version, or update the checkout and run deno task setup. No release was read, and no binary was changed. -Journal trace already exists: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-uc-fd4b95c2-224e-46a4-87c7-c927513f229b/short.jsonl. Remove it or choose another path. -Journal trace already exists: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-uc-fd4b95c2-224e-46a4-87c7-c927513f229b/taken.txt. Remove it or choose another path. ------ post-test output end ----- - UC10: -j is the same option, and both refuse a path that exists ... ok (1s) - UC11: a journal option with no path is refused rather than ignored ... -------- post-test output ------- ---journal needs a path — write `--journal `, and the path must not already exist --j needs a path — write `--journal `, and the path must not already exist ---journal needs a path — write `--journal `, and the path must not already exist ---journal needs a path — write `--journal `, and the path must not already exist ------ post-test output end ----- - UC11: a journal option with no path is refused rather than ignored ... ok (2s) - UC12: no Upgrade phase is reachable from an ordinary document ... -------- post-test output ------- -## Built-in structural syntax - -### `` - -Run tasks in parallel. `firstsecond` expands every task at the same time, waits for them all to succeed, and preserves their Markdown order. Write at least two `` children directly inside it; if one fails, unfinished tasks are cancelled and `` produces no output. - -**Syntax:** - -```md -…… -``` - -**Body context:** The `` children this runs at the same time. - -### `` - -Supply one answer inside ``. `` answers any elicitation its template matches — `{?name}` matches any text. The first matching `` wins. - -**Syntax:** - -```md - -… -``` - -**Body context:** A multiline template, in place of the single-line `template` prop. - -### `` - -Answer any `` in its content without asking a person. `…` replies from the `` matchers declared inside it, reaching elicitations from nested components too. `delegate` passes an unmatched one outward instead of failing. - -**Syntax:** - -```md -… -``` - -**Body context:** `` matchers, and the body they answer for. - -### `` - -Exit the nearest enclosing ``. `` stops the current iteration where it is; nothing after it in that iteration runs. - -**Syntax:** - -```md - -``` - -### `` - -Define one branch of a ``. `…` matches with `===`; `…` is the final fallback. - -**Syntax:** - -```md -… -… -``` - -**Body context:** Markdown expanded when this case is selected. - -### `` - -Render what the caller wrote inside this component. `` renders all of it; `` renders just the part the caller marked `slot="footer"`. - -**Syntax:** - -```md - - -``` - -### `` - -Repeat content for each item in an array. `…` binds each one to `item` inside. - -**Syntax:** - -```md -… -``` - -**`as`:** Optional. Captures the whole rendered loop instead of emitting it. - -**Body context:** Markdown rendered once per element. - -### `` - -The branch `` takes when its condition is false. `…` is written directly inside an ``, and is an error anywhere else. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the enclosing condition does not hold. - -### `` - -Expand content only when a condition is true. `…` expands its content, or the `` branch instead. The branch not taken never runs. - -**Syntax:** - -```md -… -``` - -**Body context:** The branch taken when the condition holds, up to an ``. - -### `` - -Bind a name for the rest of the region. `…` binds what its content rendered; `` binds the value. `select` narrows the rendered content to one CSS selection. - -**Syntax:** - -```md -… - -``` - -**`as`:** Required. The binding name the value is available under. - -**Body context:** Markdown whose rendered text becomes the binding, in the paired form. - -### `` - -Repeat content up to `max` times. `…` expands its content again and again until a `` inside it, or until `max` is reached. `max` is required. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded once per iteration. - -### `` - -Restrict what a document or component renders. `…` becomes its entire output; anything outside the region is not rendered. - -**Syntax:** - -```md -… -``` - -**Body context:** The rendered output the run presents. - -### `` - -Convert thrown errors into output without failing. `…` renders any failure inside it as part of the output. - -**Syntax:** - -```md -… -``` - -**Body context:** The region whose failures are printed rather than raised. - -### `` - -Return a value instead of rendered markdown. `` hands the value to the caller, checked against the component's declared `returns` schema. - -**Syntax:** - -```md - -``` - -### `` - -Run a task in parallel inside of ``. Write `…` directly inside ``; bindings made in its content stay with that task, and `` or `` cannot affect work outside it. - -**Syntax:** - -```md -… -``` - -**Body context:** Markdown expanded in its own child, beside its siblings. - -### `` - -Choose one branch by comparing a value with `===`. `……` expands the first matching case, or the final default when none matches. - -**Syntax:** - -```md -… -``` - -**Body context:** Direct `` branches considered in source order. - -## Built-in components - -### `` - -Set the agent for every prompt in its content. `…` reaches prompts sent from nested components too. `` checks the agent is available. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches use this agent. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Set the agent provider for its content. `…` applies to everything inside, where `defaultAgent` sets the agent to use when none is named and `timeout` bounds each prompt. An unknown provider fails before the content runs. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `defaultAgent` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "defaultAgent": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "name" - ], - "additionalProperties": false -} -``` - -**Body context:** Markdown expanded with this provider installed. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Approve every permission request in its content. `…` answers for the agent so it never stops to ask you; requests offering no allow option are denied. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are approved. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Ask about every permission request in its content. `…` puts each request to you; with no interactive terminal, or no valid answer, it denies. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose permission requests are asked about. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Assert that a value is truthy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is neither null nor undefined — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a value is falsy — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `expr` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is greater than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that one number is less than or equal to another — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string matches a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not deeply equal — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string does not match a pattern — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are not the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that two values are the same, compared with `===` — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that a string contains a substring — ``. The optional `msg` prop replaces the reported failure message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `msg` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "msg": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Captures:** `actual`, `expected` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The diagnostic report this assertion rendered, as text — a passing assertion renders one only while testing or verbose output is on, so the binding is empty otherwise. A failing assertion does not return. - -**Body context:** The expected value, in place of the `expected` prop. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Assert that its content fails. `…` passes only if the content fails with a matching message. `message` is required and takes a string or a regular expression. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `message` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. The complete caught error segment, bound by reference — its `message`, `source` and structured `cause` as they were raised, not a description of them. - -**Body context:** The Markdown expected to fail. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Show arbitrary text as a fenced Markdown code block. `` chooses a fence the value cannot close. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `value` | `string` | yes | | -| `language` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "language": { - "type": "string", - "pattern": "^[A-Za-z0-9][A-Za-z0-9._+#-]*$" - } - }, - "required": [ - "value" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the exact fenced Markdown instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Capture a child execution's journal so a test can assert on it. `` goes inside ``, beside ``. It reads a journal the run already has — pair it with `` to create one. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The journal snapshot. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Capture a child execution's output so a test can assert on it. `` goes inside ``, before the assertions, and is invalid anywhere else. It changes nothing about the run, and a child that fails partway still leaves what it printed. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Required. The child's accumulated output. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Give a child execution a journal of its own. `` goes inside ``, before the assertions, and is invalid anywhere else. Without it the child keeps no journal — with it, `` has one to read. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a directory. `…` changes the working directory for its content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in that directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Ask a person a structured question. `…` shows the content as the request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated answer, as a structured value. - -**Body context:** The request message the person is shown. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Evaluate program text. `` runs it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | The program to evaluate, for the self-closing form. Written instead of content, never beside it. | -| `allow` | `array` | no | Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`. | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The program to evaluate, for the self-closing form. Written instead of content, never beside it." - }, - "allow": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": { - "enum": [ - "read", - "write" - ] - }, - "description": "Optional. Which effect classes the program may draw on, narrowing what this host already installed. Omitted asks for `read`." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the fragment's rendered output instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run another document from inside a test, and assert on how it finished. `…` runs it for real, with its own journal and output. Pass `source` instead of `target` to supply the markdown directly, and `props` for the document's properties. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `host` | `string` | yes | | -| `target` | `string` | no | | -| `source` | `string` | no | | -| `action` | `string` | no | | -| `props` | `object` | no | | - -```json -{ - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "target": { - "type": "string" - }, - "source": { - "type": "string" - }, - "action": { - "type": "string" - }, - "props": { - "type": "object" - } - }, - "required": [ - "host" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The child's outcome: a settled result, or a suspension. Without it a settled failure fails the owning test rather than passing vacuously. - -**Body context:** The declarations for the child, then the assertions about it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Stop authored work with an actionable failure. `` raises the message where it is written. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "message" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Fetch a URL. `` binds the response, and any status is data you can branch on. Without `as`, a non-2xx status fails. Only GET and HEAD methods currently supported. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `method` | `string` | no | | -| `headers` | `object` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "method": { - "type": "string" - }, - "headers": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "timeout": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the response, which is what makes a non-2xx status data instead of a failure. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or write a file. `` reads the content; `…` writes the content. The path is relative to the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string" - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the file's text instead of emitting it, in the reading form. - -**Body context:** The text to write, in the writing form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Delete a file. `` removes it. It does not error if the file doesn't exist, and produces no output. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `path` | `string` | yes | | - -```json -{ - "type": "object", - "properties": { - "path": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "path" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the empty string this renders, as for any text component. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Stage paths for commit. `` resolves Git pathspecs from the working directory. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `paths` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "paths": { - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "minLength": 1 - } - } - ] - } - }, - "required": [ - "paths" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Commit staged changes. `Prepare 1.4` uses its expanded content as the commit message. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `message` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "message": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. The full object id of the commit. - -**Body context:** The message body, expanded before the commit is made. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Publish the current branch. `` pushes its current commit to the same branch on `origin` without forcing. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Switch or create a branch. `` starts a missing branch at the specified base. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "branch" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -List files by pattern. `` matches paths relative to the working directory. The list is sorted. Directories and symbolic links are never results. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `include` | `array` | yes | | -| `exclude` | `array` | no | | - -```json -{ - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "required": [ - "include" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The matched paths, as a string array. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "string" - } -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Read or file an issue. `` reads one. `…` files its content in the issue tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | no | | -| `title` | `string` | no | | -| `tags` | `array` | no | | -| `assignee` | `string` | no | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Required for a read, which binds url, title, description, tags and assignee. A file binds the url alone. - -**Body context:** The issue's description, for the form that files one. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "oneOf": [ - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "description": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string", - "minLength": 1 - } - }, - "assignee": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "url", - "title", - "description", - "tags", - "assignee" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Select an issue tracker. `…` expands its content with the specified tracker in scope. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string" - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**Body context:** The Markdown whose issues are filed there. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Render a value as JSON text. `` writes the JSON where you put it. - -**Forms:** `` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Captures:** `value` — evaluated by the component itself, so these props are deliberately absent from the schema above. - -**`as`:** Optional. Captures the JSON text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Errors on invalid content. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated value. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Generate program text from a prompt. `Ask for the user's age.` emits the approved program text; `` runs it. - -**Forms:** `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "session": { - "type": "string", - "minLength": 1 - } - }, - "additionalProperties": false -} -``` - -**`as`:** Binds the exact approved program source and emits nothing. Omitted, that source is emitted where the component is written. - -**Body context:** The complete prompt, expanded once before authorship. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli/Plan.md` (declared Markdown) - -### `` - -Send a prompt and render the reply. `…` sends its content; `` sends the prop. `agent`, `session` and `timeout` override the surrounding scope. A failed prompt renders what it got and the document continues — `throwOnError` stops it instead. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `text` | `string` | no | | -| `agent` | `string` | no | | -| `session` | `string` | no | | -| `timeout` | `string` | no | | -| `throwOnError` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "agent": { - "type": "string" - }, - "session": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "throwOnError": { - "type": "boolean" - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the reply instead of emitting it. - -**Body context:** The prompt text, in the paired form. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Open or update a pull request. `…` uses its content as the body after ``. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `number` | `integer` | no | | -| `title` | `string` | yes | | -| `base` | `string` | no | | -| `draft` | `boolean` | no | | - -```json -{ - "type": "object", - "properties": { - "number": { - "type": "integer", - "minimum": 1 - }, - "title": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - }, - "draft": { - "type": "boolean", - "default": false - } - }, - "required": [ - "title" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The pull request's repository, number, url, state and head and base commits. - -**Body context:** The pull request's body. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "object", - "properties": { - "repository": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "locatorFingerprint": { - "type": "string", - "pattern": "^[0-9a-f]{64}$" - }, - "requestedBase": { - "type": [ - "string", - "null" - ] - }, - "creationCommit": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "primaryBranch": { - "type": "string", - "minLength": 1 - }, - "objectFormat": { - "enum": [ - "sha1", - "sha256" - ] - } - }, - "required": [ - "name", - "locatorFingerprint", - "requestedBase", - "creationCommit", - "primaryBranch", - "objectFormat" - ], - "additionalProperties": false - }, - "providerId": { - "type": "string", - "minLength": 1 - }, - "number": { - "type": "integer", - "minimum": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "state": { - "const": "open" - }, - "headSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - }, - "baseSha": { - "type": "string", - "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$" - } - }, - "required": [ - "repository", - "providerId", - "number", - "url", - "state", - "headSha", - "baseSha" - ], - "additionalProperties": false -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request checks. `` reads check runs and commit statuses for its head. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each check's kind, name, head commit and outcome. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "check-run" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "enum": [ - "queued", - "in_progress", - "completed", - "waiting", - "requested", - "pending" - ] - }, - "conclusion": { - "enum": [ - "success", - "failure", - "neutral", - "cancelled", - "skipped", - "timed_out", - "action_required", - null - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "startedAt": { - "type": [ - "string", - "null" - ] - }, - "completedAt": { - "type": [ - "string", - "null" - ] - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": [ - "string", - "null" - ] - }, - "text": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "status", - "conclusion", - "url", - "startedAt", - "completedAt", - "title", - "summary", - "text" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "commit-status" - }, - "id": { - "type": "string" - }, - "headSha": { - "type": "string" - }, - "name": { - "type": "string" - }, - "state": { - "enum": [ - "error", - "failure", - "pending", - "success" - ] - }, - "description": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": [ - "string", - "null" - ] - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "headSha", - "name", - "state", - "description", - "url", - "createdAt", - "updatedAt" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request comments. `` reads both conversation and review comments. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each comment's kind, author, body, timestamps and url, and a review comment's file, hunk and line. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "kind": { - "const": "conversation" - }, - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "kind", - "id", - "author", - "body", - "createdAt", - "updatedAt", - "url" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "kind": { - "const": "review" - }, - "id": { - "type": "string" - }, - "reviewId": { - "type": [ - "string", - "null" - ] - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "body": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "url": { - "type": "string" - }, - "path": { - "type": "string" - }, - "diffHunk": { - "type": "string" - }, - "commitSha": { - "type": "string" - }, - "originalCommitSha": { - "type": "string" - }, - "line": { - "type": [ - "integer", - "null" - ] - }, - "side": { - "enum": [ - "left", - "right", - null - ] - }, - "startLine": { - "type": [ - "integer", - "null" - ] - }, - "startSide": { - "enum": [ - "left", - "right", - null - ] - }, - "inReplyToId": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "kind", - "id", - "reviewId", - "author", - "body", - "createdAt", - "updatedAt", - "url", - "path", - "diffHunk", - "commitSha", - "originalCommitSha", - "line", - "side", - "startLine", - "startSide", - "inReplyToId" - ], - "additionalProperties": false - } - ] - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Read pull request reviews. `` reads reviews from the specified pull request. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `url` | `string` | yes | | -| `provider` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "url": { - "type": "string", - "minLength": 1 - }, - "provider": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. Each review's author, state, body, submission time, commit and url. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "author": { - "type": [ - "string", - "null" - ] - }, - "state": { - "enum": [ - "approved", - "changes-requested", - "commented", - "dismissed", - "pending" - ] - }, - "body": { - "type": "string" - }, - "submittedAt": { - "type": [ - "string", - "null" - ] - }, - "commitSha": { - "type": [ - "string", - "null" - ] - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "author", - "state", - "body", - "submittedAt", - "commitSha", - "url" - ], - "additionalProperties": false - } -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Clone or use a repository. `…` expands its content in the specified checkout. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `url` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "url": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "url" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the selected checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -### `` - -Parse a value using a JSON schema. `…` parses its content. Binds a result object instead of erroring. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | - -```json -{ - "type": "object", - "properties": { - "schema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The result: either the validated value or the issues that rejected it. - -**Body context:** The JSON text to parse. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "oneOf": [ - { - "type": "object", - "properties": { - "ok": { - "const": true - }, - "value": {} - }, - "required": [ - "ok", - "value" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "ok": { - "const": false - }, - "input": { - "type": "string" - }, - "errors": { - "type": "array", - "items": { - "type": "object", - "properties": { - "instancePath": { - "type": "string" - }, - "schemaPath": { - "type": "string" - }, - "keyword": { - "type": "string" - }, - "params": {}, - "message": { - "type": "string" - } - }, - "required": [ - "instancePath", - "schemaPath", - "keyword", - "params", - "message" - ], - "additionalProperties": false - } - } - }, - "required": [ - "ok", - "input", - "errors" - ], - "additionalProperties": false - } - ] -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Configure one Agent conversation for its content. `…` uses that exact session and configuration for prompts and native launches from nested components. A self-closing Session places or validates the conversation without sending a prompt. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `model` | `string` | no | | -| `effort` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "model": { - "type": "string" - }, - "effort": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** Markdown whose prompts and launches run in this session. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Launch a coding agent with prepared context. `…` makes its content the agent's starting context, hands the agent's own interface the terminal, and continues when you exit it. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `agent` | `string` | no | | -| `session` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "agent": { - "type": "string" - }, - "session": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The instructions the native session starts from. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Inspect available components and control-flow constructs. `` lists the symbols available here; `` renders selected documentation. - -**Forms:** `` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `names` | `array` | no | Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order. | - -```json -{ - "type": "object", - "properties": { - "names": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "uniqueItems": true, - "description": "Optional. Render these components' metadata and long-form documentation instead of the list of available symbols. Entries render once each, in symbol order." - } - }, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered text instead of emitting it. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (protected component) - -### `` - -Run work in a temporary working directory. `…` expands its content with the temporary directory as the working directory, so `` and commands inside write there rather than in the current one. `` renders the path instead. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered directory path instead of emitting it. - -**Body context:** Markdown expanded with the temporary directory as its working directory. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Define a test. `…` runs under `xmd test`, or inside a `` region; elsewhere it is skipped. A failing command or assertion inside fails the test rather than the document. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | no | | -| `timeout` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "timeout": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The body of the test: its assertions and the work they judge. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/core` (registered default) - -### `` - -Turn on testing for its content. `…` runs the `` elements inside and reports them; a failing test fails the document, and so does finding no tests at all. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Body context:** The Markdown expanded in testing mode. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Expand content when run verbosity is enabled. `--verbose` enables it for the run; a component may override verbosity for its content. - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**`as`:** Optional. Captures the rendered verbose text, or an empty string when verbosity is off. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/cli` (registered default) - -### `` - -Ask a person a question in a browser form. `…` builds the form from the schema and shows its content above it. `uiSchema` sets presentation options. `` asks the same question without choosing the browser. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `schema` | JSON Schema | yes | | -| `uiSchema` | JSON Schema | no | | - -```json -{ - "type": "object", - "properties": { - "schema": {}, - "uiSchema": {} - }, - "required": [ - "schema" - ], - "additionalProperties": false -} -``` - -**`as`:** Required. The validated response. - -**Body context:** The Markdown shown above the form. - -**Returns:** a value — it renders nothing, and `as` binds what it returns. - -```json -{} -``` - -**Origin:** `@executablemd/web` (registered default) - -### `` - -Scope a workflow-hosted execution. `…` holds `` children, and refuses unless the host supplies a workflow profile. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `id` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "additionalProperties": false -} -``` - -**Body context:** The workflow-hosted executions this scope owns. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/testing` (registered default) - -### `` - -Create or use a worktree. `…` expands its content in the worktree. - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `name` | `string` | yes | | -| `branch` | `string` | yes | | -| `base` | `string` | no | | - -```json -{ - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1 - }, - "branch": { - "type": "string", - "minLength": 1 - }, - "base": { - "type": "string", - "minLength": 1 - } - }, - "required": [ - "name", - "branch" - ], - "additionalProperties": false -} -``` - -**`as`:** Optional. The path of the linked checkout. - -**Body context:** The Markdown expanded in that checkout. - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `@executablemd/workflow/composition` (registered default) - -## User-provided components - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `AGENTS.md` - -### `` - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `package` | `string` | yes | Workspace package directory, e.g. packages/workflow | - -```json -{ - "type": "object", - "properties": { - "package": { - "type": "string", - "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", - "description": "Workspace package directory, e.g. packages/workflow" - } - }, - "required": [ - "package" - ], - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `components/BootstrapNpmPackage.md` - -### `` - -**Forms:** ``, `…` - -#### Props - -This component declares no individual props. - -```json -{ - "type": "object", - "properties": {}, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `CLAUDE.md` - -### `` - -**Forms:** ``, `…` - -#### Props - -| Prop | Type | Required | Description | -| --- | --- | --- | --- | -| `package` | `string` | no | Workspace package to reserve on npm, e.g. packages/workflow | - -```json -{ - "type": "object", - "properties": { - "package": { - "type": "string", - "pattern": "^packages/[a-z0-9][a-z0-9._-]*$", - "description": "Workspace package to reserve on npm, e.g. packages/workflow" - } - }, - "additionalProperties": false -} -``` - -**Returns:** text — the markdown this component renders. - -```json -{ - "type": "string" -} -``` - -**Origin:** `README.md` -# Try it - -Failed to import component Upgrade.Replace: Cannot resolve component: Upgrade.Replace (searched: components, .) ------ post-test output end ----- - UC12: no Upgrade phase is reachable from an ordinary document ... ok (1s) -Tier UC — xmd upgrade ... ok (14s) -running 1 test from ./packages/cli/tests/upgrade-command-document.test.ts -Tier UG — the packaged upgrade command document ... - UG1: an authorized install renders its milestones in source order ... ok (109ms) - UG2: an exact tag names itself in the opening ... ok (48ms) - UG3: --status reports the comparison and reaches no install phase ... ok (36ms) - UG4: an already-installed selection downloads nothing and says so ... ok (38ms) - UG5: an untaken branch contributes no prose at all ... ok (73ms) - UG6: a phase failure keeps completed milestones and claims nothing more ... ok (115ms) - UG7: an older release needs --allow-downgrade, and installs with it ... ok (70ms) - UG8: a prerelease needs --allow-prerelease, and installs with it ... ok (66ms) - UG9: an older prerelease is refused with one command carrying both consents ... ok (160ms) - UG10: consent that describes nothing is refused rather than ignored ... ok (64ms) - UG11: --status refuses either consent option, before reading anything ... ok (34ms) - UG12: --status accepts an older or prerelease tag without consent ... ok (59ms) - UG13: an already-installed prerelease needs no prerelease consent ... ok (57ms) - UG14: a draft, a missing tag and an empty listing are each refused by name ... ok (73ms) - UG15: an unsupported entrypoint refuses before it could read anything ... ok (27ms) - UG16: a compiled binary the release does not target refuses too ... ok (8ms) - UG17: every release-read failure code reaches its own answer ... ok (218ms) - UG18: every installation failure code reaches its own answer ... ok (396ms) - UG19: semantic version precedence is exact, past the safe-integer range ... ok (467ms) - UG20: a tag that is not exactly vX.Y.Z is refused before anything is read ... ok (195ms) - UG21: a running binary that reports no release version is refused ... ok (15ms) - UG22: a published release whose own tag is malformed is never selected ... ok (55ms) - UG23: the packaged source is an ordinary streaming text root ... ok (0ms) - UG24: every exact multi-way choice is a , not a lookup table ... ok (1ms) - UG25: each phase answers for the codes it can produce, and no others ... ok (1ms) -Tier UG — the packaged upgrade command document ... ok (2s) -running 1 test from ./packages/cli/tests/upgrade-output.test.ts -Tier UO — the upgrade transcript ... - UO1: each milestone reaches the reader before the next phase begins ... ok (95ms) - UO2: every consumer drains the same stream, and nothing is printed twice ... ok (88ms) - UO3: a consumer that fails cancels the run and reports rather than hanging ... ok (37ms) - UO4: the durable stream records the run and grants it nothing ... ok (79ms) - UO5: nothing in this module reaches the host's own output ... ok (1ms) -Tier UO — the upgrade transcript ... ok (305ms) -running 1 test from ./packages/cli/tests/value-root.test.ts -Tier VR — xmd run value roots ... - VR1: stdout carries only the JSON result ... -------- post-test output ------- -{"passed":true,"summary":"looks good"} ------ post-test output end ----- - VR1: stdout carries only the JSON result ... ok (699ms) - VR2: a string result stays a quoted JSON string ... -------- post-test output ------- -"shipped" ------ post-test output end ----- - VR2: a string result stays a quoted JSON string ... ok (698ms) - VR3: --verbose moves body output and diagnostics to stderr ... -------- post-test output ------- -[yield] import_component:__root__ → ok { path: 'doc.md' } - -BODY_MARKER - - -[close] root → ok -{"passed":true,"summary":"looks good"} ------ post-test output end ----- - VR3: --verbose moves body output and diagnostics to stderr ... ok (701ms) - VR4: a structural failure exits nonzero with empty stdout ... -------- post-test output ------- -A component that declares `returns` renders nothing and produces exactly one value through a its own body executes. Problems found: - - no ------ post-test output end ----- - VR4: a structural failure exits nonzero with empty stdout ... ok (701ms) - VR4a: a selected conditional writes its result ... -------- post-test output ------- -"chosen" ------ post-test output end ----- - VR4a: a selected conditional writes its result ... ok (701ms) - VR4b: an unselected conditional reaches the missing-return failure ... -------- post-test output ------- -The root document declares `returns` but produced no value. ------ post-test output end ----- - VR4b: an unselected conditional reaches the missing-return failure ... ok (711ms) - VR4c: two executed s exit nonzero with the duplicate diagnostic ... -------- post-test output ------- -The root document declares `returns` but executed more than one . ------ post-test output end ----- - VR4c: two executed s exit nonzero with the duplicate diagnostic ... ok (705ms) - RV10e: a document cannot select a value through the named return context ... -------- post-test output ------- -The root document declares `returns` but produced no value. ------ post-test output end ----- - RV10e: a document cannot select a value through the named return context ... ok (737ms) - VR5: a failure after exits nonzero with empty stdout ... -------- post-test output ------- -Failed to import component Missing: Cannot resolve component: Missing (searched: components, .) ------ post-test output end ----- - VR5: a failure after exits nonzero with empty stdout ... ok (718ms) - VR6: a text root still writes its rendering to stdout ... -------- post-test output ------- -TEXT_MARKER ------ post-test output end ----- - VR6: a text root still writes its rendering to stdout ... ok (740ms) - VR7: a targeted value root reserves stdout for its result ... -------- post-test output ------- -[yield] import_component:__root__ → ok { path: 'doc.md' } - -# Sectioned - -## Ready - -READY_MARKER - - -[close] root → ok -{"passed":true} ------ post-test output end ----- - VR7: a targeted value root reserves stdout for its result ... ok (725ms) - VR8: a projection without is the same structural failure ... -------- post-test output ------- -A component that declares `returns` renders nothing and produces exactly one value through a its own body executes. Problems found: - - no ------ post-test output end ----- - VR8: a projection without is the same structural failure ... ok (736ms) - VR10: a command's stdout is shown beside the result, and recorded as stdout ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -to-outto-err{"ok":true} ------ post-test output end ----- - VR10: a command's stdout is shown beside the result, and recorded as stdout ... ok (1s) - VR9: in a projected text root still selects what is emitted ... -------- post-test output ------- - - -SELECTED_MARKER - ------ post-test output end ----- - VR9: in a projected text root still selects what is emitted ... ok (758ms) -Tier VR — xmd run value roots ... ok (10s) -running 1 test from ./packages/cli/tests/verbose-component.test.ts -Tier VB — ... - VB5: the run syntax catalog describes it ... ok (145ms) -Tier VB — ... ok (146ms) -running 2 tests from ./packages/cli/tests/workflow-agent-sessions.test.ts -Tier WSR — a restart reattaches each Session site ... - WSR1: two same-named sites keep their own asserted identities across a restart ... ok (2s) - WSR2: a replayed site asks the provider for nothing ... ok (2s) -Tier WSR — a restart reattaches each Session site ... ok (4s) -Tier WSA — the workflow profile serves Claude over ACP alone ... - WSR3: a Claude session is retained and reattached with no machine-wide account ... ok (3s) -Tier WSA — the workflow profile serves Claude over ACP alone ... ok (3s) -running 1 test from ./packages/cli/tests/workflow-agent.test.ts -Tier WAL — the workflow Agent observation loop ... - WAL1: two observations then a proposal, all in one provider session ... ok (191ms) - WAL1: no Workspace path or caller path reaches the provider ... ok (75ms) - WAL2: a completed replay restores the run and reaches no provider ... ok (117ms) - WAL3: an interrupted run resumes without repeating what it committed ... ok (128ms) - WAL10: a named turn is retained against its Prompt and rendered nowhere ... ok (82ms) - WAL8: an admitted Fetch response reaches the next Prompt, values and all ... ok (83ms) - WAL8: a completed replay restores that response without asking again ... ok (103ms) - WAL4: exhausting the authored bound fails at the document's own gate ... ok (124ms) - WAL5: a mutation-shaped proposal is retained as data and mutates nothing ... ok (64ms) - WAL6: a denied native tool becomes the retained Prompt failure ... ok (63ms) - WAL9: an approved proposal is applied, and a refused one is not ... ok (115ms) - WAL11: the profile materializes the adapter a placement names, and only then ... ok (56ms) - WAL12: two hosts retain and serialize identical Agent identity, launching their own adapters ... ok (4s) - WAL13: an agent this build carries no snapshot for runs through ACPX unchanged ... ok (53ms) - WAL14: a completed and an interrupted run both replay from the stored Prompt ... ok (140ms) - WAL15: its retained identity is the resolved command, as it was before ... ok (44ms) - WAL16: a refusing snapshot refuses its own agent and leaves the others alone ... ok (84ms) - WAL7: a workflow with no Agent starts no provider and allocates no sidecar ... ok (28ms) -Tier WAL — the workflow Agent observation loop ... ok (5s) -running 4 tests from ./packages/cli/tests/workflow-cli.test.ts -Tier WFC — xmd workflow start and resume ... - WFC1: two starts without an id make two runs ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: 4ac4d4f6-5874-4626-872f-9ed57e13cd78 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow run: 4c9771d7-27df-4521-8f4f-f9c78c9f5ec1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed ------ post-test output end ----- - WFC1: two starts without an id make two runs ... ok (2s) - WFC2: reusing an id compatibly finds the run, and incompatibly is refused ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -The workflow run "release-1" is already stored with a different props. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed ------ post-test output end ----- - WFC2: reusing an id compatibly finds the run, and incompatibly is refused ... ok (3s) - WFC3: generated prop arguments belong to start alone ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: props-1 - -# Release - - - - - -Wrote: channel=beta -workflow status: completed -Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] - -Arguments: - [action] start, resume, fork, answer, status, list, history, cancel, delete or export - [target] markdown definition to start, the run a fork continues, or the run id every other action addresses - [argument] the definition a fork runs, or the wait an answer is delivered to - [value] the answer itself, as one JSON value (answer only) - -Options: - --id [ID] run id to create or address (start and fork only; generated when absent) - --at [AT] the retained event a fork continues from (fork only) - -V, --verbose log journal entries to stderr [default: false] - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - --json write the inspection result as JSON (status, list and history only) [default: false] - --forkable add each event's forkability to the history (history only) [default: false] - --status [STATUS] list only runs retaining this status - --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) - --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. - -Properties declared by release.md - - --props-channel - Environment: XMD_PROPS_CHANNEL - Default: "stable" - - --props - Set document properties as a JSON object - Environment: XMD_PROPS -unrecognized option for xmd workflow resume: --props-channel=stable — document properties belong to the start that created the run, whose props it retained -unrecognized argument for xmd workflow: {"channel":"stable"} — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFC3: generated prop arguments belong to start alone ... ok (3s) - WFC4: the definition is the file's current bytes, committed or not ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: pinned-1 - -# Release - - - - - -Wrote: channel=stable - -UNCOMMITTED -workflow status: completed ------ post-test output end ----- - WFC4: the definition is the file's current bytes, committed or not ... ok (1s) - WFC4b: an untracked file starts, and runs what it says ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: untracked-1 - -# Release - - - - - -Wrote: channel=stable - -UNTRACKED -workflow status: completed ------ post-test output end ----- - WFC4b: an untracked file starts, and runs what it says ... ok (1s) - WFC5: resume names only a run, and finds its definition again ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: resume-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow run: resume-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -unrecognized argument for xmd workflow: flows/release.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFC5: resume names only a run, and finds its definition again ... ok (3s) - WFC6: a failing document reports failed and exits 1, and replays as failed ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: failing-1 -# Refusing - -Failed to import component ComponentBesideTheDefinition: Cannot resolve component: ComponentBesideTheDefinition (searched: ) -workflow status: failed -workflow run: failing-1 -# Refusing - -Failed to import component ComponentBesideTheDefinition: Cannot resolve component: ComponentBesideTheDefinition (searched: ) -workflow status: failed ------ post-test output end ----- - WFC6: a failing document reports failed and exits 1, and replays as failed ... ok (2s) - WFC7: absent, foreign and unreadable storage is reported and left alone ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "never-started". Start the run before looking it up. -workflow run: corrupt-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -Error: file is not a database - at createConnection (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/connections.ts:188:14) - at Object.at (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/connections.ts:428:25) - at at.next () - at beginExecution (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/transitions.ts:135:41) - at beginExecution.next () - at beginRun (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/workflow/src/deno/lifecycle.ts:289:24) - at beginRun.next () - at admit (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/src/workflow.ts:1189:31) - at admit.next () - at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/cli/src/workflow.ts:965:26 { - errcode: 26, - code: "ERR_SQLITE_ERROR", - errstr: "file is not a database" -} ------ post-test output end ----- - WFC7: absent, foreign and unreadable storage is reported and left alone ... ok (2s) - WFC8: the grammar refuses what the command does not have ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd workflow requires a subcommand — `xmd workflow start ` or `xmd workflow resume ` -unrecognized subcommand for xmd workflow: resurrect — expected start, resume, fork, answer, status, list, history, cancel, delete, export -No workflow run is stored under the run id "release-1". Start the run before looking it up. -xmd workflow start requires a markdown definition — `xmd workflow start ` -unrecognized option for xmd workflow resume: --id — it belongs to another workflow action -unrecognized option for xmd workflow: --approve-all — agent options are exclusive to xmd run -unrecognized option for xmd workflow: --eval — inline documents are exclusive to xmd run ------ post-test output end ----- - WFC8: the grammar refuses what the command does not have ... ok (5s) - WFC13: answer takes three arguments, and only its own options ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "release-1". Start the run before looking it up. -xmd workflow answer names the wait it answers — `xmd workflow answer `. `xmd workflow status ` reports the request event the run stopped on. -xmd workflow answer requires the answer itself, as one JSON value — `xmd workflow answer ` -the answer for xmd workflow answer is not JSON: Unexpected token 'a', "approved" is not valid JSON. Quote it so the shell passes it as one argument. -unrecognized argument for xmd workflow: extra — start names one definition, resume names one run, and answer names a run, a wait and one JSON value -unrecognized option for xmd workflow answer: --json — it belongs to another workflow action -unrecognized option for xmd workflow answer: --verbose — it belongs to another workflow action -unrecognized option for xmd workflow answer: --id — it belongs to another workflow action -No workflow run is stored under the run id "release-1". Start the run before looking it up. -unrecognized argument for xmd workflow: wait-1 — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFC13: answer takes three arguments, and only its own options ... ok (6s) - WFC11: `--` ends the options, not the grammar ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized argument for xmd workflow: unexpected.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value -unrecognized argument for xmd workflow: second.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value -workflow run: 5ec92e5c-8fe9-4fb2-b702-9c90be98d564 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow run: 5ec92e5c-8fe9-4fb2-b702-9c90be98d564 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed ------ post-test output end ----- - WFC11: `--` ends the options, not the grammar ... ok (3s) - WFC12: a dash-leading definition and run id are what `--` is for ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: -architect-probe-run - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow run: -architect-probe-run - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -unrecognized argument for xmd workflow: unexpected.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFC12: a dash-leading definition and run id are what `--` is for ... ok (2s) - WFC9: a file outside any repository starts, and one that is not there does not ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -fatal: not a git repository (or any of the parent directories): .git -workflow run: outside-1 - -# Release - - - - - -Wrote: channel=stable - -OUTSIDE -workflow status: completed -the workflow definition could not be read from flows/absent.md: ENOENT: no such file or directory, open '/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-3f936c2f-4fa7-40ee-98b3-a6f962f6aaea/repository/flows/absent.md' ------ post-test output end ----- - WFC9: a file outside any repository starts, and one that is not there does not ... ok (2s) - WFC10: ordinary xmd run is unchanged by any of this ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm - -# Release - - - - - -Wrote: channel=beta ------ post-test output end ----- - WFC10: ordinary xmd run is unchanged by any of this ... ok (1s) - WFC9b: a reference selects one section, and the run is of that section ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: section-1 -# Release - -## Publish - -publishing. - -workflow status: completed -run: section-1 -status: completed -definition: 77e8d415cdbf5acb83eac9647563c22da947c45934294b9d1ca34f06835b10af sections.md#Publish -props: {} -created: 2026-10-09T10:43:51.310Z -updated: 2026-10-09T10:43:51.427Z -retrieval: revision 1 at 2026-10-09T10:43:51.310Z -workspace: 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -journal frontier: 8b25049c-03f1-47c3-b42d-d908f9725aee (Workspace 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30) -executions: 1 - a0de1c17-2ab8-4096-bd33-f34bdf564fd0 started 2026-10-09T10:43:51.312Z, completed at 2026-10-09T10:43:51.426Z -workflow run: section-1 -# Release - -## Publish - -publishing. - -workflow status: completed ------ post-test output end ----- - WFC9b: a reference selects one section, and the run is of that section ... ok (2s) - WFC9c: a whole-document run and a targeted one are two runs ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: whole-1 -# Release - -## Publish - -publishing. - -## Announce - -announcing. -workflow status: completed -The workflow run "whole-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -"Nowhere" matches no document target. -Available targets: - Publish - Announce ------ post-test output end ----- - WFC9c: a whole-document run and a targeted one are two runs ... ok (3s) -Tier WFC — xmd workflow start and resume ... ok (49s) -Tier WFC — a workflow closed over a component bundle ... - WFC14: the five declared stages run from the files beside the root ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: 94cbf601-5984-4a78-b102-ff93806026ec - -# Loop - -discovered. - -instruction files listed. - -EDITED IN THE WORKING TREE - - -EDITED IN THE WORKING TREE - - -checkpoint reached. - -EDITED IN THE WORKING TREE - - -planned. - -EDITED IN THE WORKING TREE - - -implemented. - -EDITED IN THE WORKING TREE - -workflow status: completed ------ post-test output end ----- - WFC14: the five declared stages run from the files beside the root ... ok (1s) - WFC15: a declared component the commit does not hold refuses before the run ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -the component "Planning" is not a file beside the document that declares it at Planning.md. Put the component next to the document, or correct the path it declares. -No workflow run is stored under the run id "loop-1". Start the run before looking it up. -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -the component "Planning" at Planning.md is not a Markdown component this version can read: expected a JSON object, got number -No workflow run is stored under the run id "loop-1". Start the run before looking it up. ------ post-test output end ----- - WFC15: a declared component the commit does not hold refuses before the run ... ok (4s) - WFC16: a declaration that names a directory names no component ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -the path declared for the component "Planning" is not a Markdown file, and a bundled component is Markdown. ------ post-test output end ----- - WFC16: a declaration that names a directory names no component ... ok (1s) - WFC17: the bundle decides compatible reuse ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: loop-2 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed -workflow run: loop-2 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed -[{"eventId":"8a85f490-8221-4a46-a11e-bda645410cb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-2","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c3f3a2f3-57e8-4fcd-85e2-181626af2765","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"9e810f8d-cd5d-429c-9f5c-150c489c406f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"96f729be-d32a-4a6b-bcbc-7c44fd329747","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24309669-6703-4abc-aa1d-bb95e2c92013","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dc5a79b9-631f-4bf8-9a25-62e941b9e6c7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d2717f66-1431-4502-a7c6-86fd7762b20a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b3626af-b47c-4645-a608-f35dfebaaf80","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] -The workflow run "loop-2" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -[{"eventId":"8a85f490-8221-4a46-a11e-bda645410cb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-2","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c3f3a2f3-57e8-4fcd-85e2-181626af2765","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"9e810f8d-cd5d-429c-9f5c-150c489c406f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"96f729be-d32a-4a6b-bcbc-7c44fd329747","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24309669-6703-4abc-aa1d-bb95e2c92013","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dc5a79b9-631f-4bf8-9a25-62e941b9e6c7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d2717f66-1431-4502-a7c6-86fd7762b20a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b3626af-b47c-4645-a608-f35dfebaaf80","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFC17: the bundle decides compatible reuse ... ok (4s) - WFC18: a resume reads the pinned tree, whatever the checkout now says ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: loop-3 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed -[{"eventId":"550721d4-2a11-451b-9011-418ac2ae69af","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-3","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e919132a-00c6-4bb3-965a-b267e3d502fd","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5c3aac01-7834-439e-8a71-f7c7aadcf8aa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"978fdd58-c624-4267-b5d9-2c37ed38c712","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30ec5af1-83b8-42cb-9c0e-05c302e00992","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ff42d1e-f55c-45c4-ae16-4b7de5f30bb3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e83bce2f-927b-486c-a545-8baa62a969ff","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"066eac09-9b12-4f29-a833-539278b40013","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] -workflow run: loop-3 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed -[{"eventId":"550721d4-2a11-451b-9011-418ac2ae69af","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"},"result":{"status":"ok","value":{"runId":"loop-3","bundleHash":"44e92b49809303ab74978cc1d622f0b95f34553bf3af56ac014413cc3b2ff582"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e919132a-00c6-4bb3-965a-b267e3d502fd","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"loop.md","content":"---\nworkflow:\n components:\n InstructionFiles: ./InstructionFiles.md\n Discovery: ./Discovery.md\n UserCheckpoint: ./UserCheckpoint.md\n Planning: ./Planning.md\n Implementation: ./Implementation.md\n---\n\n# Loop\n\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5c3aac01-7834-439e-8a71-f7c7aadcf8aa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Discovery","executablemd.source-position":{"path":"loop.md","offset":223,"line":13,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Discovery.md","sourceHash":"3ef691bbbd68fc0f8cb96143b9e88cc5bf06767b14a94a6ce3f8bbb1f4bae717","content":"discovered.\n\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":223,"line":13,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"978fdd58-c624-4267-b5d9-2c37ed38c712","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"InstructionFiles","executablemd.source-position":{"path":"Discovery.md","offset":13,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"InstructionFiles.md","sourceHash":"a0bc0c1f4075e32191b08ada4622a7e3c24fc30054297a13a745beaf2e13c5b7","content":"instruction files listed.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"Discovery.md","offset":13,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30ec5af1-83b8-42cb-9c0e-05c302e00992","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"UserCheckpoint","executablemd.source-position":{"path":"loop.md","offset":238,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"UserCheckpoint.md","sourceHash":"c192cd8fcf59aaaf5c3b6216e4c42a0634181c3c9489760a6c92911b171e8507","content":"checkpoint reached.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":238,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ff42d1e-f55c-45c4-ae16-4b7de5f30bb3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Planning","executablemd.source-position":{"path":"loop.md","offset":258,"line":17,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Planning.md","sourceHash":"11775b6035b5d81f8e6cc8c52d92ea28b3392c00379dda85334030a71e6ddd32","content":"planned.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":258,"line":17,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e83bce2f-927b-486c-a545-8baa62a969ff","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Implementation","executablemd.source-position":{"path":"loop.md","offset":272,"line":19,"column":1}},"result":{"status":"ok","value":{"kind":"workflow","path":"Implementation.md","sourceHash":"48272f88bbf18badf641dbc552ce5f844d75c0a02965c9d87a533c7e5b7eef1c","content":"implemented.\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"loop.md","offset":272,"line":19,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"066eac09-9b12-4f29-a833-539278b40013","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n","value":"\n# Loop\n\ndiscovered.\n\ninstruction files listed.\n\n\n\ncheckpoint reached.\n\n\nplanned.\n\n\nimplemented.\n\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFC18: a resume reads the pinned tree, whatever the checkout now says ... ok (3s) - WFC19: a resume needs no repository, because the run retains its bundle ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: loop-4 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed -workflow run: loop-4 - -# Loop - -discovered. - -instruction files listed. - - - -checkpoint reached. - - -planned. - - -implemented. - -workflow status: completed ------ post-test output end ----- - WFC19: a resume needs no repository, because the run retains its bundle ... ok (2s) -Tier WFC — a workflow closed over a component bundle ... ok (17s) -Tier WFX — xmd workflow export ... - WFX1: seals a completed run and reports both digests ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-24098a3d-078d-4eb5-bd4c-b37fda4b4aa1/repository/evidence.xmd -workflow run: release-1 -workflow frontier: 524e9ca4-a2d2-4f69-b357-11b3a00c8e55 -workflow root: cae46153927f0761afa199f22d6ec7c6270046e9e1e63c14deee16e4ea4948e8 -workflow artifact identity: ee3d530372552f25a60e26aa928c6c248cd08df5d43531a2475fee9c7f9e116b -workflow artifact sha256: d8b5e9b3bf02ef108a77775a88afc901807d9ce067e99ce4f8d7ffaa7c471522 ------ post-test output end ----- - WFX1: seals a completed run and reports both digests ... ok (2s) - WFX2: refuses a destination it cannot write, and leaves it alone ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -xmd workflow export writes one file and needs to be told where — `xmd workflow export --output=`. -xmd workflow export writes an XMD artifact, so --output names a .xmd file. "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-dd2ac114-dea1-4036-b006-cbff87c71320/repository/run.db" does not. -xmd workflow export writes a file rather than standard output. Give --output a path ending in .xmd. -xmd workflow export will not replace /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-dd2ac114-dea1-4036-b006-cbff87c71320/repository/taken.xmd. Remove it, or name a path that does not exist yet. ------ post-test output end ----- - WFX2: refuses a destination it cannot write, and leaves it alone ... ok (3s) - WFX3: refuses a run it does not have, without creating the target ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "no-such-run". Start the run before looking it up. ------ post-test output end ----- - WFX3: refuses a run it does not have, without creating the target ... ok (1s) -Tier WFX — xmd workflow export ... ok (7s) -Tier WFX — what xmd workflow export refuses ... - WFX4: refuses a run an executor is holding, and writes nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -The workflow run "release-1" is being executed right now, so there is no settled frontier to export. Nothing was written. Export it once the run stops. ------ post-test output end ----- - WFX4: refuses a run an executor is holding, and writes nothing ... ok (2s) - WFX5: exports after everything the run was started from is gone ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc-249700ef-1b4b-4476-9ad1-1ebf012326c5/home/detached.xmd -workflow run: release-1 -workflow frontier: 2e3af032-77ae-4ad4-bdc9-2cd76066d936 -workflow root: fdc8d9aa0c59d503ab947b3bce584df580798f11992cacb37812faa6cf63dd50 -workflow artifact identity: 07aa2d316619a4d6efba7912110bcf8be2031deceb22c216010776d3fc807542 -workflow artifact sha256: 3f0f4cd68f3652fffeee871e87c24558b50487d4073107b6fa0fb27bcf967948 ------ post-test output end ----- - WFX5: exports after everything the run was started from is gone ... ok (2s) - WFX6: refuses when the run's own retained source no longer describes itself ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: corrupt-1 - -# Release - - - - - -Wrote: channel=stable -workflow status: completed -This workflow run's retained source bundle disagrees with its own descriptor: a retained source is not the content it names. No partial source is returned and the run is left unchanged. ------ post-test output end ----- - WFX6: refuses when the run's own retained source no longer describes itself ... ok (2s) -Tier WFX — what xmd workflow export refuses ... ok (6s) -running 1 test from ./packages/cli/tests/workflow-crash.test.ts -Tier WFX — a killed workflow run resumes from its frontier ... - WFX1: SIGKILL mid-run, then resume: every effect exactly once ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: crashed-run -workflow run: crashed-run -# Many effects - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -workflow status: completed ------ post-test output end ----- - WFX1: SIGKILL mid-run, then resume: every effect exactly once ... ok (5s) - WFX2: Ctrl-C settles the run itself, releases it, and resumes clean ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: crashed-run -workflow status: interrupted -workflow run: crashed-run -# A run that waits - - - - - - - -workflow status: completed ------ post-test output end ----- - WFX2: Ctrl-C settles the run itself, releases it, and resumes clean ... ok (32s) - WFX3: two processes race one resumable run; exactly one advances it ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: crashed-run -workflow run: crashed-run -workflow run crashed-run is already running: one workflow executor advances a run, and this host reports that executor rather than following it. -'Tier WFX — a killed workflow run resumes from its frontier' has been running for over (1m0s) -# A run that waits - - - - - - - -workflow status: completed ------ post-test output end ----- - WFX3: two processes race one resumable run; exactly one advances it ... ok (32s) -Tier WFX — a killed workflow run resumes from its frontier ... ok (1m10s) -running 3 tests from ./packages/cli/tests/workflow-declaration.test.ts -Tier WFD — reading a workflow's component declaration ... - WFD1: the five-name map normalizes against a nested root ... ok (3ms) - WFD2: the order the author wrote is not the order identity keeps ... ok (1ms) - WFD3: a root at the repository root normalizes without a directory ... ok (0ms) - WFD4: two names may point at one blob on purpose ... ok (1ms) - WFD5: a root that declares nothing declares no bundle ... ok (0ms) - WFD6: an empty map is not a second spelling of no bundle ... ok (0ms) - WFD7: the declaration is one closed member ... ok (0ms) - WFD8: a value that is not a path is not a declaration ... ok (1ms) - WFD9: every path form a declaration may not take ... ok (1ms) - WFD10: a declaration may not claim structural syntax or a core component ... ok (1ms) - WFD11: a key that is not a component name is never printed back ... ok (1ms) - WFD12: a nested name is a name, and normalizes like one ... ok (0ms) -Tier WFD — reading a workflow's component declaration ... ok (14ms) -Tier WFD — establishing a declared bundle ... - WFD40: a root with no declaration retains exactly one source ... -------- post-test output ------- -fatal: not a git repository (or any of the parent directories): .git ------ post-test output end ----- - WFD40: a root with no declaration retains exactly one source ... ok (43ms) - WFD41: a declared component becomes a logical path beside the root ... -------- post-test output ------- -fatal: not a git repository (or any of the parent directories): .git ------ post-test output end ----- - WFD41: a declared component becomes a logical path beside the root ... ok (35ms) - WFD42: a declared component that is not beside the root refuses the start ... ok (5ms) - WFD43: a root that is not well-formed UTF-8 refuses before anything is read ... ok (2ms) -Tier WFD — establishing a declared bundle ... ok (86ms) -Tier WFD — the target a reference resolves ... - WFD44: a selector resolves to one exact target before storage exists ... -------- post-test output ------- -fatal: not a git repository (or any of the parent directories): .git -fatal: not a git repository (or any of the parent directories): .git ------ post-test output end ----- - WFD44: a selector resolves to one exact target before storage exists ... ok (56ms) - WFD45: a glob resolves to the canonical target, not to itself ... -------- post-test output ------- -fatal: not a git repository (or any of the parent directories): .git ------ post-test output end ----- - WFD45: a glob resolves to the canonical target, not to itself ... ok (36ms) - WFD46: a selector naming no section refuses, before anything is retained ... ok (7ms) - WFD47: a filename holding a # is addressable, and is not a logical path ... ok (6ms) -Tier WFD — the target a reference resolves ... ok (105ms) -running 1 test from ./packages/cli/tests/workflow-export-publication.test.ts -Tier WXP — what an export leaves behind ... - WXP1: a racing target is refused by link and survives byte-identical ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed -xmd workflow export will not replace /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-85b209e2-9ffa-4b46-afa5-f7142d58af1b/repository/raced.xmd, which something created while the artifact was being written. It is left exactly as it is. ------ post-test output end ----- - WXP1: a racing target is refused by link and survives byte-identical ... ok (1s) - WXP2: a publication failure reports nothing and leaves no target ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed -xmd workflow export could not put the artifact at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-be840d91-65f5-41cf-bf81-97df32d90152/repository/unpublished.xmd. Nothing was published. ------ post-test output end ----- - WXP2: a publication failure reports nothing and leaves no target ... ok (1s) - WXP3: a cleanup failure before publication publishes nothing at all ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed -xmd workflow export could not remove the temporary directory /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wxp-d8564ade-91f4-450a-8239-53b323ed6ca8/repository/.xmd-export-ZpzWlK, so it stopped before publishing anything. ------ post-test output end ----- - WXP3: a cleanup failure before publication publishes nothing at all ... ok (1s) - WXP4: halting a live export before it commits publishes nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed ------ post-test output end ----- - WXP4: halting a live export before it commits publishes nothing ... ok (1s) - WXP5: a cleanup failure after publication keeps the artifact and warns ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed ------ post-test output end ----- - WXP5: a cleanup failure after publication keeps the artifact and warns ... ok (1s) - WXP6: nothing an export does is ever aimed at removing its committed output ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -nothing to see here -workflow status: completed ------ post-test output end ----- - WXP6: nothing an export does is ever aimed at removing its committed output ... ok (1s) -Tier WXP — what an export leaves behind ... ok (10s) -running 1 test from ./packages/cli/tests/workflow-fetch.test.ts -Tier FT — a workflow run's Fetch ... - FTW1: commits one response, and a resume restores it without asking again ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: fetch-run -workflow run: fetch-run - - - - -SAID hello - -workflow status: completed ------ post-test output end ----- - FTW1: commits one response, and a resume restores it without asking again ... ok (2s) -Tier FT — a workflow run's Fetch ... ok (2s) -running 1 test from ./packages/cli/tests/workflow-fork.test.ts -Tier WFF — xmd workflow fork ... - WFF1: a compatible checkpoint admits a fork whose history begins as its own ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"b41af5d3-9234-40df-9cbd-fb378417dfda","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"314d022c-0583-404b-8b30-76a22e8c0b48","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0b0f5510-31a3-42b6-bc31-5446f4389176","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6743c2ab-41ba-4c38-91e0-002d82934f76","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -corrected -# Release - - - -workflow status: completed -[{"eventId":"8891fcf2-5197-42dc-8aaf-b1e149a27375","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"55a95cee-6189-4d1c-856b-3068d5f69b37","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"68df705e-adb3-4684-b2cf-dc4eae1802cc"}},{"eventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8"}},{"eventId":"4bbf5610-3219-4050-b2b2-172733ca1f88","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"87d02160-82ae-4561-9842-07e5e1c7dd69","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","forkability":{"forkable":true,"blockers":[]}}] -{"record":{"runId":"fork-1","definition":{"hashAlgorithm":"sha256","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"1550fcd734f99f4919bdaba9c51d5f638f03cfbc917609238cc4284d5cdd1094","byteLength":79}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:45:56.263Z","updatedAt":"2026-10-09T10:45:56.361Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-a8fd68f1-606a-480a-a2b8-8658777d5b1d/repository","commit":"dda8b31230a66d3bb7c6255077f4e619a94203c7","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:45:56.263Z"},"executions":[{"executionId":"67730872-30ac-47b3-934a-72de7c3283f6","startedAt":"2026-10-09T10:45:56.266Z","stoppedAt":"2026-10-09T10:45:56.361Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"87d02160-82ae-4561-9842-07e5e1c7dd69","workspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93"},"currentWorkspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93","lineage":{"sourceRunId":"source-1","checkpointEventId":"0a55c001-cda5-45e8-b36e-91bc30de67c8","checkpointWorkspaceRootId":"8ec8be088349a784cb65a564ea6331ac19dbd92ebfe696ad77b29d247cbe1a93"}} ------ post-test output end ----- - WFF1: a compatible checkpoint admits a fork whose history begins as its own ... ok (4s) - WFF2: forking changes nothing about the source and takes no lock on it ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"ad4908b8-d08c-4d27-9b05-2f03156d2611","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5dff6fff-a99f-43ac-8839-10b1b98044c6","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c0dc855-5ea9-4cb4-ad79-5def7f2d662e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"89e5bc23-c370-4de3-9c06-6c228aa30af2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -corrected -# Release - - - -workflow status: completed -[{"eventId":"ad4908b8-d08c-4d27-9b05-2f03156d2611","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"5dff6fff-a99f-43ac-8839-10b1b98044c6","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c0dc855-5ea9-4cb4-ad79-5def7f2d662e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"89e5bc23-c370-4de3-9c06-6c228aa30af2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] -[{"eventId":"e79df478-d1f2-45fa-be06-f8bf5bd650b6","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"347b1fab-cedb-41fb-a034-3bd0787ff042","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a4dca91b-3ac7-42fd-a303-435c78ce2d6e"}},{"eventId":"189077fe-5776-40ef-afdb-bb4fbcae5389","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"189077fe-5776-40ef-afdb-bb4fbcae5389"}},{"eventId":"ac61f166-e950-440d-904e-4f64d6821f8a","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"44c1734b-c9d9-45c0-90fe-88c022cb36d5","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"1253436b7228889a855419e06ba8b18273b430af426eea73d3cca8bb964873a3","forkability":{"forkable":true,"blockers":[]}}] -workflow run: source-1 -# Release - - - -workflow status: completed ------ post-test output end ----- - WFF2: forking changes nothing about the source and takes no lock on it ... ok (5s) - WFF3: the fork owns its inherited prefix and its own retained source ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"0769d7fa-682f-4bfe-bbaa-fd2a279e0e66","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"3b72347d-c6f7-4530-af54-1fa0e56e01fa","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"46d150a8-8481-4e5b-82b1-f5f0db317840","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"475060ea-6e96-481f-90ae-1960b40afa9f","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -corrected -# Release - - - -workflow status: completed -workflow delete: source-1 (run-storage) -No workflow run is stored under the run id "source-1". Start the run before looking it up. -[{"eventId":"d2d1a562-8fa7-468b-a660-d4e015cf129a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"12798a27-3ee4-492e-be80-b6368091e2cc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0ecbc1db-12f6-49e8-a339-29cc66db4fd3"}},{"eventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"0babe669-ee68-4e1c-a938-e66b9284bfcf"}},{"eventId":"99ddfb40-2b5e-4c1c-a120-9209e0d4a162","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0073de75-9037-4809-9147-f3a84b6000a3","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"0b6fdc13cebe3d079ba6c7f19f4ac35bcdcef50f8dd9c6e88a5d1d90516f356e","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -# Release - - - -workflow status: completed ------ post-test output end ----- - WFF3: the fork owns its inherited prefix and its own retained source ... ok (5s) - WFF4: divergence before the checkpoint leaves no fork at all ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"3497e95f-cd31-4f05-ad1f-b956fae3e123","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ab783f3c-7471-4d58-8798-e65f043e7b0d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"acec416d-617f-4b4f-acab-39fb5c11aa7a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"9c52492a-c990-4649-ade1-ff5fe3ac7a42","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d3e352e0-4b12-4786-a0e4-187e7cc07810","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"36d76882-308e-4995-968f-44b821948f0b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82","forkability":{"forkable":true,"blockers":[]}}] -the candidate definition diverges from the inherited history after 3 of 4 events, at 9c52492a-c990-4649-ade1-ff5fe3ac7a42 (workspace_file): Divergence at root[3]: expected workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md") at release.md:3:1, got workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/elsewhere.md") at release.md:3:1 -[{"record":{"runId":"source-1","definition":{"hashAlgorithm":"sha256","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"ade7461d573040f66a9e0cddc1539a691e3f6608296cae1b8f12c2a847afa022","byteLength":78}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:46:09.793Z","updatedAt":"2026-10-09T10:46:09.941Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-4e9ec4b7-ed76-4f78-b450-80161ed52cfd/repository","commit":"45b5b74c0ace973a4c6833e78edd1a9988b07679","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:09.793Z"},"executions":[{"executionId":"147c3a8a-599c-4429-9c0c-f9844aee4eb7","startedAt":"2026-10-09T10:46:09.796Z","stoppedAt":"2026-10-09T10:46:09.940Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"36d76882-308e-4995-968f-44b821948f0b","workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"},"currentWorkspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"}] -the candidate definition diverges from the inherited history after 2 of 4 events, at acec416d-617f-4b4f-acab-39fb5c11aa7a (import_component): Divergence: generator root returned after 2 yields, but journal has 4 yield entries; first unreached entry is import_component("File") at release.md:3:1 -[{"record":{"runId":"source-1","definition":{"hashAlgorithm":"sha256","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"ade7461d573040f66a9e0cddc1539a691e3f6608296cae1b8f12c2a847afa022","byteLength":78}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:46:09.793Z","updatedAt":"2026-10-09T10:46:09.941Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-4e9ec4b7-ed76-4f78-b450-80161ed52cfd/repository","commit":"45b5b74c0ace973a4c6833e78edd1a9988b07679","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:09.793Z"},"executions":[{"executionId":"147c3a8a-599c-4429-9c0c-f9844aee4eb7","startedAt":"2026-10-09T10:46:09.796Z","stoppedAt":"2026-10-09T10:46:09.940Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"36d76882-308e-4995-968f-44b821948f0b","workspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"},"currentWorkspaceRootId":"23bbebf443a7fed394fa40de9b597a48d39b88fa49716ae6bd9f18745da9cd82"}] ------ post-test output end ----- - WFF4: divergence before the checkpoint leaves no fork at all ... ok (5s) - WFF5: a reused fork id is compatible only for the same fork identity ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"ef14c02b-ae33-47c4-b18e-8a75a9da27b7","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b9ba0b86-59de-4328-a42c-46b5f0dadd22","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1c897af0-9368-4abf-b66f-634900c8141d","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"774ae95b-1702-460d-82f1-27d362d57e4d","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -corrected -# Release - - - -workflow status: completed -[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -# Release - - - -workflow status: completed -[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] -The workflow run "fork-1" is already stored with a different checkpoint. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -The workflow run "fork-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -[{"eventId":"2180745e-a835-47aa-8cd2-46b9c021a4fb","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"3f66f8d035d4f7516c349c0f871d4614f94ffcff7d9b23f33207cf50bf5f1a47"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"18145a7b-2f4a-4276-a08b-c01b94df68e7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a44ee42d-0cb3-4888-9ae4-1c5fa1a742f9"}},{"eventId":"b72488a2-84e7-442d-a742-3153cda9de7a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b72488a2-84e7-442d-a742-3153cda9de7a"}},{"eventId":"05da49bd-bad2-4aa7-890e-9c0815c4754b","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"163adb74-4894-4c91-82ee-551e553f57f2","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"4d668c8828397621bd4e6bf24256d60e44b0d25d98bc5f1d8e36052160502b2b","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFF5: a reused fork id is compatible only for the same fork identity ... ok (7s) - WFF9: a fork inherits the source's props, and an explicit one overrides ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original - -# Release - - - -workflow status: completed -[{"eventId":"0c3929c2-7d7b-4fe6-8c2e-cb9fc78c27df","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d0b7b601b14938f599b8d20bbc7be1f23ee26a9e8479e986b5d9f7f611145ced"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"d0b7b601b14938f599b8d20bbc7be1f23ee26a9e8479e986b5d9f7f611145ced"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"10536806-91b4-4bc4-9e4c-1f8ca1912cd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"---\nprops:\n type: object\n properties:\n channel: { type: string }\n required: [channel]\n additionalProperties: false\n---\n\n# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"bd20198a-48e5-4df7-a8aa-fe7f6b39ad45","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":138,"line":12,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":138,"line":12,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:5a34d30cb22a20a9ec678331d3d5e2768835d89bf04b9e83e420ff2ec363524b:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":138,"line":12,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","source":{"path":"release.md","offset":138,"line":12,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"0ba49522-7479-4fec-916d-1bc8ff55b5a7","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":174,"line":14,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","source":{"path":"release.md","offset":174,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b1d4ccdc-3dad-4eb0-8424-f8559c65c065","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n# Release\n\n\n\n","value":"\n# Release\n\n\n\n"}}},"workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-inherited -corrected - -# Release - - - -workflow status: completed -{"record":{"runId":"fork-inherited","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"stable"},"status":"completed","createdAt":"2026-10-09T10:46:24.290Z","updatedAt":"2026-10-09T10:46:24.389Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:24.290Z"},"executions":[{"executionId":"47b4f579-bf9f-4645-9b4c-3684fba4f4b5","startedAt":"2026-10-09T10:46:24.293Z","stoppedAt":"2026-10-09T10:46:24.389Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d8062097-fbc8-4cb7-99c0-b5ac9bbab0ae","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} -{"record":{"runId":"fork-inherited","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"stable"},"status":"completed","createdAt":"2026-10-09T10:46:24.290Z","updatedAt":"2026-10-09T10:46:24.389Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:24.290Z"},"executions":[{"executionId":"47b4f579-bf9f-4645-9b4c-3684fba4f4b5","startedAt":"2026-10-09T10:46:24.293Z","stoppedAt":"2026-10-09T10:46:24.389Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d8062097-fbc8-4cb7-99c0-b5ac9bbab0ae","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} -workflow run: fork-overridden -corrected - -# Release - - - -workflow status: completed -{"record":{"runId":"fork-overridden","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"beta"},"status":"completed","createdAt":"2026-10-09T10:46:26.315Z","updatedAt":"2026-10-09T10:46:26.412Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:26.315Z"},"executions":[{"executionId":"d7a304bf-3d6f-490d-ba3b-86fb0af3a7b4","startedAt":"2026-10-09T10:46:26.317Z","stoppedAt":"2026-10-09T10:46:26.412Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"21d52f25-3239-4d19-af69-4b08ac213a8f","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} -The workflow run "fork-overridden" is already stored with a different props. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -{"record":{"runId":"fork-overridden","definition":{"hashAlgorithm":"sha256","bundleHash":"ae33ff5a6983f199ba769108ff9a8ac0d69edcca50b60f0fb688a9888a6d5a51","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"98404bbcc73077e437684e70126d7e40ac347e7d2ac84d3413c7b64e3e72a050","byteLength":206}]},"props":{"channel":"beta"},"status":"completed","createdAt":"2026-10-09T10:46:26.315Z","updatedAt":"2026-10-09T10:46:26.412Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-de4e3300-8730-4920-a48d-4eb07ea08de8/repository","commit":"6e7413514576b438aa4b9c77df6bada12aa36d15","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:26.315Z"},"executions":[{"executionId":"d7a304bf-3d6f-490d-ba3b-86fb0af3a7b4","startedAt":"2026-10-09T10:46:26.317Z","stoppedAt":"2026-10-09T10:46:26.412Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"21d52f25-3239-4d19-af69-4b08ac213a8f","workspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"},"currentWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751","lineage":{"sourceRunId":"source-1","checkpointEventId":"2e500b55-00fc-4faa-b6cc-3857696d4750","checkpointWorkspaceRootId":"d0645927af8822b15bfe0bebd9bd8043737354685bf32bf88280a754397ac751"}} -workflow run: fork-overridden - -# Release - - - -workflow status: completed ------ post-test output end ----- - WFF9: a fork inherits the source's props, and an explicit one overrides ... ok (8s) - WFF10: a completed Git-host record is inherited without contacting anything ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original - - - - - - - - -workflow status: completed -[{"eventId":"82759f33-b4c6-48aa-ab70-609c5364939b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"5a653dd59605a21a2f91e84dbbbb3c720e236aa9850188c8aa57cb636bae660b"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"5a653dd59605a21a2f91e84dbbbb3c720e236aa9850188c8aa57cb636bae660b"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"314bfca2-2ac0-4ea2-8763-b8c8624f0c6f","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:038dd2fa0c973ecc","configuration":"038dd2fa0c973ecc","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a3b9606e-b46a-4829-8223-bbcd25da6254","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"b39ef7b3a486a43e1bc871e634bac371590a9496127689c05872f0a93c58244b:project:cf7c272765f826fb","configuration":"cf7c272765f826fb","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","before":{"branch":"main","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"052c4ffc-84a5-4657-a401-d3c2cebda988","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f6386d8a-e300-478f-b6ec-4e9805b328de","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:beaa6ffe1048f4f9faea9bac7129201cd64a764be7372f292c2a42e7578bdbbe:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"30578737-9110-4137-8cb6-dc0f7a90154c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"4845f6d5f2e4843d7823337bab01e7d51760cffb5c46e89d49374cd3e5e70973:project:6dd00294a0620dd8","configuration":"6dd00294a0620dd8","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"41c525af-3094-40f6-81aa-80cd1e11ec46","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"9d12854b-bae4-408c-993d-88c8606f4fb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"afeb173ca793e853496f51c71022c4ac5626b36cd316c0566af9cd276128e7ff:project:b521adb40dddf440","configuration":"b521adb40dddf440","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"a473534572338297beac5c1772441eab5a55d889","committedAt":1791542792,"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"a473534572338297beac5c1772441eab5a55d889","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"45929a41-df8d-4c53-a6af-7af842174c34","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d488838dfc9eb19aa9532b3eeb5a65776d9baa3e7a6a27d14a9b2480a8733d92","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"request":{"identity":{"runId":"source-1","expansionId":"59f24a464486aa21d07f3dcccc9fe0d0a04b7c0afcbfd30ec544af548ae15a52"},"kind":"git-push","inputs":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889"},"naturalKey":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","destinationRef":"refs/heads/publish/1"}},"preState":{"remoteCommit":null},"observations":{"remoteCommit":"a473534572338297beac5c1772441eab5a55d889"},"decision":"performed","result":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","refspec":"a473534572338297beac5c1772441eab5a55d889:refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889","observedRemoteCommit":"a473534572338297beac5c1772441eab5a55d889"}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fc4717ce-0327-44ba-b274-b415c221757e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":315,"line":11,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":315,"line":11,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fda7ee7b-c87d-4882-ae12-09e7f01d064c","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\n\n\n\n\n\n","value":"\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","forkability":{"forkable":true,"blockers":[]}}] -workflow run: fork-1 -corrected - - - - - - - - -workflow status: completed -[{"eventId":"5e27e07a-adf8-4948-b315-60f797e0516c","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"d6dabd8a65421a313f327f8bd50712be6f008d98db54cd328feab32b62f8a5f9"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"d6dabd8a65421a313f327f8bd50712be6f008d98db54cd328feab32b62f8a5f9"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b64bbf28-9dce-4e67-8509-2a2b6fc341eb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n\n```bash exec\necho corrected\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"94ae03f8-4f7f-415e-85e4-9b69f02ef552"}},{"eventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:038dd2fa0c973ecc","configuration":"038dd2fa0c973ecc","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"7e618d9d-3edb-4762-aed3-2e2b12aa368f"}},{"eventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"e48e5150b0743ef7853cd2dae80d8303cd3729d257419fc5c2a799c3e47d2528","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"b69010e1-c5db-4703-b840-cdf9ccfbd08e"}},{"eventId":"a3b9606e-b46a-4829-8223-bbcd25da6254","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"b39ef7b3a486a43e1bc871e634bac371590a9496127689c05872f0a93c58244b:project:cf7c272765f826fb","configuration":"cf7c272765f826fb","executablemd.source-position":{"path":"release.md","offset":139,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","before":{"branch":"main","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":139,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"a3b9606e-b46a-4829-8223-bbcd25da6254"}},{"eventId":"052c4ffc-84a5-4657-a401-d3c2cebda988","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"aa6ad74cd54bf06bdf3243e9b6deed1d6926e4b50d5bd9ce65f8812da171cb3a","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"052c4ffc-84a5-4657-a401-d3c2cebda988"}},{"eventId":"f6386d8a-e300-478f-b6ec-4e9805b328de","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:beaa6ffe1048f4f9faea9bac7129201cd64a764be7372f292c2a42e7578bdbbe:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":173,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":173,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"f6386d8a-e300-478f-b6ec-4e9805b328de"}},{"eventId":"30578737-9110-4137-8cb6-dc0f7a90154c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"8dc6170f65ebedf52224f80f575294cd5c57abcefd1de4c7b4e11c4dce2d13be","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"30578737-9110-4137-8cb6-dc0f7a90154c"}},{"eventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"4845f6d5f2e4843d7823337bab01e7d51760cffb5c46e89d49374cd3e5e70973:project:6dd00294a0620dd8","configuration":"6dd00294a0620dd8","executablemd.source-position":{"path":"release.md","offset":213,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":213,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"f61e6f9f-d411-4854-baa3-99d78b67ed4c"}},{"eventId":"41c525af-3094-40f6-81aa-80cd1e11ec46","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"310909a87a933503f90e2fe0d6d1062631e7b0aaa96a8dfd214d6470c77b8887","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"41c525af-3094-40f6-81aa-80cd1e11ec46"}},{"eventId":"9d12854b-bae4-408c-993d-88c8606f4fb5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"afeb173ca793e853496f51c71022c4ac5626b36cd316c0566af9cd276128e7ff:project:b521adb40dddf440","configuration":"b521adb40dddf440","executablemd.source-position":{"path":"release.md","offset":242,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"a473534572338297beac5c1772441eab5a55d889","committedAt":1791542792,"before":{"branch":"publish/1","commit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"a473534572338297beac5c1772441eab5a55d889","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":242,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"9d12854b-bae4-408c-993d-88c8606f4fb5"}},{"eventId":"45929a41-df8d-4c53-a6af-7af842174c34","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"45929a41-df8d-4c53-a6af-7af842174c34"}},{"eventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d488838dfc9eb19aa9532b3eeb5a65776d9baa3e7a6a27d14a9b2480a8733d92","executablemd.source-position":{"path":"release.md","offset":287,"line":8,"column":1}},"result":{"status":"ok","value":{"request":{"identity":{"runId":"source-1","expansionId":"59f24a464486aa21d07f3dcccc9fe0d0a04b7c0afcbfd30ec544af548ae15a52"},"kind":"git-push","inputs":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889"},"naturalKey":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","destinationRef":"refs/heads/publish/1"}},"preState":{"remoteCommit":null},"observations":{"remoteCommit":"a473534572338297beac5c1772441eab5a55d889"},"decision":"performed","result":{"repository":{"name":"project","locatorFingerprint":"8a190ad6c99e966199e115ec7a4707ce42ec65f2d5ff26206279f5ed2888300e","requestedBase":null,"creationCommit":"3df3ed4e5f4f69ec51e985c0134dd3f033e0776d","primaryBranch":"main","objectFormat":"sha1"},"remote":"origin","branch":"publish/1","destinationRef":"refs/heads/publish/1","refspec":"a473534572338297beac5c1772441eab5a55d889:refs/heads/publish/1","sourceCommit":"a473534572338297beac5c1772441eab5a55d889","observedRemoteCommit":"a473534572338297beac5c1772441eab5a55d889"}}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":287,"line":8,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"fc6fb6b3-1afe-428d-a864-9113d22165bc"}},{"eventId":"58aaab70-def7-4070-8103-a43366bf5846","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo corrected ","command":["bash","-c","echo corrected\n"],"executablemd.source-position":{"path":"release.md","offset":315,"line":11,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"corrected\n","stderr":""}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","source":{"path":"release.md","offset":315,"line":11,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"08c792b0-389a-4e31-9fbc-9f636e5bef53","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"\n\n\n\n\n\n\n\n","value":"\n\n\n\n\n\n\n\n"}}},"workspaceRootId":"bff5eb7545a90a14955d71f4b7d8575a4036d69c741c223e8413a6e03ec708c2","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFF10: a completed Git-host record is inherited without contacting anything ... ok (7s) - WFF11: a Git-host effect that established nothing is not forkable ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 - - - - -the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated. -workflow status: failed -[{"eventId":"a643365c-84ca-4357-9c1d-70afd8ec191b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"e61cb725a8bd35d8895c480e397e46ad6d5ae33c5246dba8dae5d54400ef0030"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"e61cb725a8bd35d8895c480e397e46ad6d5ae33c5246dba8dae5d54400ef0030"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"d852d847-6a62-432c-afb6-182890b906fc","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"\n\n\nprepared\n\n\n\n\n\n```bash exec\ngit --git-dir=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-320b7f57-0b55-43ce-8a36-9e615c9c6dea/refusing.git update-ref refs/heads/publish/1 refs/heads/diverged\n```\n\n\n\n\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"4481e1f2-f557-4c9f-8943-a858fb33abc7","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"8d1caf18-90c9-4eeb-bb2e-a5f54b2c9ef5","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"3bdd6bcab3b70f0cfd1c214ac2ef83c021e765f065531376d9bcb7173a6ae2a0:project:3744ae11fa984bfd","configuration":"3744ae11fa984bfd","executablemd.source-position":{"path":"release.md","offset":0,"line":1,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"ecbd3fae3f970d457374cbb69fe7cf5952157b4efb17ca27786bbccb0b6e3427","requestedBase":null,"creationCommit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"ff6439cb75924b6fc9b680a44c6dcbf10a4046d2c19d9a633b697e256fdbbff2","source":{"path":"release.md","offset":0,"line":1,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d74e1c5b-9d73-4b0e-a783-e55f094f10db","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Switch","executablemd.source-position":{"path":"release.md","offset":141,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"ff6439cb75924b6fc9b680a44c6dcbf10a4046d2c19d9a633b697e256fdbbff2","source":{"path":"release.md","offset":141,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2b9bc89d-8317-4536-a1d1-6337263824b4","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_switch","name":"9144de2e81e469b82451f7eb4636b44034a6ea345364d4dc056467fcdcf697a9:project:d903ed564ea3263f","configuration":"d903ed564ea3263f","executablemd.source-position":{"path":"release.md","offset":141,"line":2,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"requestedBranch":"publish/1","resolvedBranch":"publish/1","requestedBase":null,"resolvedBase":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","before":{"branch":"main","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"}}}}},"workspaceRootId":"6fc85192cc2d2d21342a00df8f86814fd2b40d1a9146eab8a7c1afeff99b8a9d","source":{"path":"release.md","offset":141,"line":2,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f120203c-e72e-4784-a0ea-d9ae8395ca36","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":175,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"6fc85192cc2d2d21342a00df8f86814fd2b40d1a9146eab8a7c1afeff99b8a9d","source":{"path":"release.md","offset":175,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"03e7ce86-54d8-464f-a980-26f4c0aca632","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:cfcfd308b4e5fbfaa44b760c44546802ad1b7e115912f66a3e31c65a1e547c74:/repositories/project-244210e48437b655/notes.md","path":"notes.md","cwd":"/repositories/project-244210e48437b655","executablemd.source-position":{"path":"release.md","offset":175,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"7f9a7d24c33d1a07b9c10adad947a8b6af18bb0aa01fef5952ec91ae01ff831f","source":{"path":"release.md","offset":175,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4211b114-6f5a-4030-8f9c-74539e0f0fb1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Add","executablemd.source-position":{"path":"release.md","offset":215,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"7f9a7d24c33d1a07b9c10adad947a8b6af18bb0aa01fef5952ec91ae01ff831f","source":{"path":"release.md","offset":215,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d8dc994d-42ec-4146-81f2-7f218a9bfba3","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_add","name":"0fc63ecec8c78ecdd54d780e2a8e56a89f879f09d27add73ad8ae93c6353c7bd:project:c92cf2916169a903","configuration":"c92cf2916169a903","executablemd.source-position":{"path":"release.md","offset":215,"line":6,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"paths":["notes.md"],"before":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"3d86700ad11f0efa83780083b313b1892074dd63"},"after":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"66f7e109322476f8f46371b731fcb1a2ecc561e4b33be532efb864d190fa0228","source":{"path":"release.md","offset":215,"line":6,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"41a0121b-e0b4-42b3-9097-d40bf363a44d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Commit","executablemd.source-position":{"path":"release.md","offset":244,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"66f7e109322476f8f46371b731fcb1a2ecc561e4b33be532efb864d190fa0228","source":{"path":"release.md","offset":244,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"07f75ae8-e002-44aa-9fba-716ac7ba83c9","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_git_commit","name":"f4b3293bedfd95159f08a2c6e50453351e8a54c0bb0dcd2304d51f628d68cc51:project:8bb0b71c1a33f3ef","configuration":"8bb0b71c1a33f3ef","executablemd.source-position":{"path":"release.md","offset":244,"line":7,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"checkout":{"repositoryName":"project","worktreeName":null,"checkoutPath":"/repositories/project-244210e48437b655"},"messageSource":"prop","messageDigest":"8687c50d465e1cd13a26bce37f6bc7481a861ae727ab99b57d1417ffe3a99acf","messageLength":8,"parent":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","tree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","commit":"31b13e81d57a941428b353ba4b5d32ed59bd4f76","committedAt":1791542799,"before":{"branch":"publish/1","commit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","headTree":"3d86700ad11f0efa83780083b313b1892074dd63","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"},"after":{"branch":"publish/1","commit":"31b13e81d57a941428b353ba4b5d32ed59bd4f76","headTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568","indexTree":"df1a08a7fa477b39733c21f855ed6eaf2340a568"}}}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":244,"line":7,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d79583eb-5982-403b-bb9a-01e4fd477c01","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:git --git-dir=/var/folders/6_/pc0hwbg54x","command":["bash","-c","git --git-dir=/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-320b7f57-0b55-43ce-8a36-9e615c9c6dea/refusing.git update-ref refs/heads/publish/1 refs/heads/diverged\n"],"executablemd.source-position":{"path":"release.md","offset":304,"line":10,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"","stderr":""}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":304,"line":10,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"c31c6aa0-b597-4df3-9e64-ff1d187617e4","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Repository","executablemd.source-position":{"path":"release.md","offset":495,"line":14,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":495,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d8b07683-7482-48b9-8cc8-86bccfb3d6ba","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_repository","name":"eeaf3ff4d0a484bb0eadb66442e5f3e2e8e5ed7d61550ba8fe2e51e9db2ba8d8:project:3744ae11fa984bfd","configuration":"3744ae11fa984bfd","executablemd.source-position":{"path":"release.md","offset":495,"line":14,"column":1}},"result":{"status":"ok","value":{"kind":"created","record":{"name":"project","locatorFingerprint":"ecbd3fae3f970d457374cbb69fe7cf5952157b4efb17ca27786bbccb0b6e3427","requestedBase":null,"creationCommit":"ff360a6201d1ab7a7e63123d3a77eadcb25cb8e0","primaryBranch":"main","objectFormat":"sha1","checkoutPath":"/repositories/project-244210e48437b655"}}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":495,"line":14,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"435766a8-4ece-4e3f-957e-6b7a527ebd20","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"Git.Push","executablemd.source-position":{"path":"release.md","offset":636,"line":15,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/workflow/composition","reserved":false}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":636,"line":15,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab","event":{"type":"yield","coroutineId":"root","description":{"type":"git_host_effect","name":"d3e43fd5c7b62167f11ee7246aaef2867deba7428261a9cfd76f60064b977298","executablemd.source-position":{"path":"release.md","offset":636,"line":15,"column":1}},"result":{"status":"err","error":{"message":"the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.","name":"GitHostConflictError","stack":"GitHostConflictError: the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.\n at reconcile (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:469:30)\n at reconcile.next ()\n at Object.run (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:562:48)\n at run.next ()\n at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/durable-streams/effect.ts:412:45\n at Generator.next ()\n at TaskGroup (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/task-group.js:35:27)\n at TaskGroup.next ()\n at Object.with (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/context.js:35:31)\n at with.next ()"}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","source":{"path":"release.md","offset":636,"line":15,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"external-state-unavailable","eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab"}]}},{"eventId":"617d6713-f6ca-4de2-8ea0-9f77367a4267","event":{"type":"close","coroutineId":"root","result":{"status":"err","error":{"message":"the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.","name":"GitHostConflictError","stack":"GitHostConflictError: the Git host already holds state this effect conflicts with. Nothing was performed: conflicting external state is diagnosed rather than overwritten or duplicated.\n at GitHostConflictError (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/errors.ts:94:31)\n at gitHostFailure (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/errors.ts:114:42)\n at reconcileGitHostEffect (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:673:11)\n at reconcileGitHostEffect.throw ()\n at file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/packages/git/src/git-host/effect.ts:224:5\n at Generator.throw ()\n at trap (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/trap.js:13:28)\n at trap.throw ()\n at Object.scoped (file:///Users/tarasmankovski/Repositories/taras/executable.md/.claude/worktrees/issue-881-pr2/node_modules/.deno/effection@4.1.0/node_modules/effection/esm/lib/scoped.js:38:44)\n at scoped.throw ()"}}},"workspaceRootId":"d337d2bed1437a75bd150f84f196abe0eeba8473e561fa62c46118bc9ebba0d4","forkability":{"forkable":false,"blockers":[{"code":"external-state-unavailable","eventId":"40ec7ce4-00ba-47ae-823e-5c6035c50cab"}]}}] -the prefix ending at "40ec7ce4-00ba-47ae-823e-5c6035c50cab" cannot be forked: external-state-unavailable at 40ec7ce4-00ba-47ae-823e-5c6035c50cab. Select a checkpoint before the earliest of those events. ------ post-test output end ----- - WFF11: a Git-host effect that established nothing is not forkable ... ok (5s) - WFF6: the fork commit is the boundary a crash falls on one side of ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"7139db62-45b8-403d-9ded-1a3158c9bb71","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f45f3816-fe1a-4664-b61f-edbb6181afec","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"21b5038a-4657-4a1e-8cf4-f6ed49e3dca4","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"7b2c02ba-b09a-4e33-aa21-ee39b80694f9","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","forkability":{"forkable":true,"blockers":[]}}] -the candidate definition diverges from the inherited history after 3 of 4 events, at 10ff2695-a681-4436-b8f5-8dea56899899 (workspace_file): Divergence at root[3]: expected workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md") at release.md:3:1, got workspace_file("write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/elsewhere.md") at release.md:3:1 -workflow run: fork-1 -{"record":{"runId":"fork-1","definition":{"hashAlgorithm":"sha256","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"409a785ed4ab316f01bdb8549aed6b0dd3bb35142a39851c66420c32ef4e4a62","byteLength":73}]},"props":{},"status":"running","createdAt":"2026-10-09T10:46:46.150Z","updatedAt":"2026-10-09T10:46:46.150Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wff-675993b5-2291-4bf2-95a9-2ed00526fdb1/repository","commit":"ac2175d6420999d7b96f358ea4ae7745bd74453b","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:46:46.150Z"},"executions":[{"executionId":"abb69993-b30d-4311-a961-99bb3f76feff","startedAt":"2026-10-09T10:46:46.153Z"}],"journalFrontier":{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db"},"currentWorkspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","lineage":{"sourceRunId":"source-1","checkpointEventId":"10ff2695-a681-4436-b8f5-8dea56899899","checkpointWorkspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db"}} -[{"eventId":"763a8b72-2d99-494a-a01f-2aad212be349","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f"},"result":{"status":"ok","value":{"runId":"fork-1","bundleHash":"104e42abd74bff391f586622eff422435cbc3e06b6926323298b033d14eea81f"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"17c5a7e3-c83e-4be9-8a59-982b86c05bd4","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\nsleep 30\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"26565ed8-87ef-4741-9c1a-fcc49432b3d1"}},{"eventId":"10ff2695-a681-4436-b8f5-8dea56899899","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e5543acec41d7549a2f0a2532129ee8bc6ee2a3de6e1ebbc266a58ba28451db","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]},"inherited":{"sourceRunId":"source-1","sourceEventId":"10ff2695-a681-4436-b8f5-8dea56899899"}}] -workflow cancel: fork-1 (cancelled) ------ post-test output end ----- - WFF6: the fork commit is the boundary a crash falls on one side of ... ok (5s) - WFF7: history forkability is stable, cumulative and free of retained values ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: source-1 -original -# Release - - - -workflow status: completed -[{"eventId":"c29a14bd-5336-4ec7-b174-44058f21c147","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"6a3bd568-8d44-409f-819e-978059c06141","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8269647-cd2d-4705-a215-52e66515c342","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ded0fe31-b5f7-42d4-ac2b-d55a870b4154","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24dd4a56-65f5-4dec-aafc-f38a6435a44e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8bd61eb-a1d1-406c-b3c4-102627c964be","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","forkability":{"forkable":true,"blockers":[]}}] -[{"eventId":"c29a14bd-5336-4ec7-b174-44058f21c147","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"},"result":{"status":"ok","value":{"runId":"source-1","bundleHash":"fef94ae15ca6326813d0184b114edcb6ae1dbc57020f7d38902d334836f12acb"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"6a3bd568-8d44-409f-819e-978059c06141","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nfirst\n\n```bash exec\necho original\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8269647-cd2d-4705-a215-52e66515c342","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ded0fe31-b5f7-42d4-ac2b-d55a870b4154","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"24dd4a56-65f5-4dec-aafc-f38a6435a44e","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo original ","command":["bash","-c","echo original\n"],"executablemd.source-position":{"path":"release.md","offset":47,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"original\n","stderr":""}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","source":{"path":"release.md","offset":47,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a8bd61eb-a1d1-406c-b3c4-102627c964be","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c","forkability":{"forkable":true,"blockers":[]}}] -EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS -c29a14bd-5336-4ec7-b174-44058f21c147 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -6a3bd568-8d44-409f-819e-978059c06141 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -a8269647-cd2d-4705-a215-52e66515c342 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -ded0fe31-b5f7-42d4-ac2b-d55a870b4154 workspace_file release.md:3:1 completed 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c yes - -24dd4a56-65f5-4dec-aafc-f38a6435a44e exec release.md:5:1 completed 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c yes - - -Outcome: completed at a8bd61eb-a1d1-406c-b3c4-102627c964be, Workspace 51d747afcf753c7d1762a29668a2c6fdb032870a02571a8b8a83db171265a06c ------ post-test output end ----- - WFF7: history forkability is stable, cumulative and free of retained values ... ok (3s) - WFF8: the fork grammar is action-scoped ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -xmd workflow fork requires the checkpoint it continues from — `xmd workflow fork --at= `. `xmd workflow history --forkable` lists the events it may select. -'Tier WFF — xmd workflow fork' has been running for over (1m0s) -xmd workflow fork requires the markdown definition it runs — `xmd workflow fork --at= ` -xmd workflow fork requires the run it continues — `xmd workflow fork --at= ` -unrecognized option for xmd workflow resume: --at — it belongs to another workflow action -unrecognized option for xmd workflow history: --props-channel=stable — document properties belong to the start that created the run, whose props it retained -unrecognized option for xmd workflow status: --forkable — it belongs to another workflow action -unrecognized argument for xmd workflow: flows/release.md — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFF8: the fork grammar is action-scoped ... ok (5s) -Tier WFF — xmd workflow fork ... ok (1m3s) -running 4 tests from ./packages/cli/tests/workflow-host.test.ts -Tier WFH — workflow host boundary ... - WFH1: an unsupported host refuses before creating or executing anything ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -fatal: not a git repository (or any of the parent directories): .git -workflow run: 493c18ef-e1b0-4995-b380-004b411c9ff8 -# Nothing - -no effects at all -workflow status: completed ------ post-test output end ----- - WFH1: an unsupported host refuses before creating or executing anything ... ok (1s) - WFH2: every host reads the same grammar ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] - -Arguments: - [action] start, resume, fork, answer, status, list, history, cancel, delete or export - [target] markdown definition to start, the run a fork continues, or the run id every other action addresses - [argument] the definition a fork runs, or the wait an answer is delivered to - [value] the answer itself, as one JSON value (answer only) - -Options: - --id [ID] run id to create or address (start and fork only; generated when absent) - --at [AT] the retained event a fork continues from (fork only) - -V, --verbose log journal entries to stderr [default: false] - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - --json write the inspection result as JSON (status, list and history only) [default: false] - --forkable add each event's forkability to the history (history only) [default: false] - --status [STATUS] list only runs retaining this status - --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) - --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - WFH2: every host reads the same grammar ... ok (1s) - WFH4: an unsupported host refuses a delivery, and retains nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "any-run". Start the run before looking it up. ------ post-test output end ----- - WFH4: an unsupported host refuses a delivery, and retains nothing ... ok (1s) - WFH3: an unsupported host refuses a resume too, and reads no store ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "any-run". Start the run before looking it up. ------ post-test output end ----- - WFH3: an unsupported host refuses a resume too, and reads no store ... ok (1s) -Tier WFH — workflow host boundary ... ok (5s) -Tier WFH — GitHub issue handling is adapter configuration ... - installs nothing when nothing is configured ... ok (0ms) - reads a ceiling, and canonicalizes every entry ... ok (1ms) - refuses configuration it cannot use rather than narrowing it ... ok (2ms) -Tier WFH — GitHub issue handling is adapter configuration ... ok (4ms) -Tier WFH — GitHub pull-request reading is adapter configuration ... - authorizes no read when nothing is configured ... ok (0ms) - reads what is allowed, and canonicalizes every entry ... ok (1ms) - refuses configuration it cannot use rather than narrowing it ... ok (1ms) -Tier WFH — GitHub pull-request reading is adapter configuration ... ok (2ms) -Tier WFH — the credential helper is host assembly ... - names the module to Deno from source, and the binary itself when compiled ... ok (0ms) - writes a shell launcher on Unix and a batch launcher on Windows ... ok (0ms) - quotes a path with spaces on either platform ... ok (0ms) - passes Git's operation through, whatever the platform ... ok (0ms) - puts no credential, locator or marker in any launcher ... ok (1ms) - answers as a helper when the real source entrypoint is asked to be one ... ok (528ms) - is an internal mode, dispatched before public parsing and absent from help ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -Usage: xmd [OPTIONS] - -Commands: - run - plan Turn a request into an XMD Plan, review it, and write the approved source. - test - syntax - agent Report the model and effort choices an agent advertises. - upgrade Upgrade the standalone xmd binary to the latest stable or a specified release. - repl Run and reconstruct one XMD entry in an interactive terminal. - test-agent - workflow - -Options: - -h, --help show help - -v, --version show version - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. -Usage: xmd workflow [OPTIONS] [action] [target] [argument] [value] - -Arguments: - [action] start, resume, fork, answer, status, list, history, cancel, delete or export - [target] markdown definition to start, the run a fork continues, or the run id every other action addresses - [argument] the definition a fork runs, or the wait an answer is delivered to - [value] the answer itself, as one JSON value (answer only) - -Options: - --id [ID] run id to create or address (start and fork only; generated when absent) - --at [AT] the retained event a fork continues from (fork only) - -V, --verbose log journal entries to stderr [default: false] - --raw output raw markdown without normalization or terminal formatting [default: false] - --secret-detection scan durable events for credentials before they persist; disable with --no-secret-detection [default: true] - --json write the inspection result as JSON (status, list and history only) [default: false] - --forkable add each event's forkability to the history (history only) [default: false] - --status [STATUS] list only runs retaining this status - --artifact [ARTIFACT] inspect this sealed .xmd artifact instead of a retained run (status and history only) - --output [OUTPUT] the .xmd file to write the artifact to (export only); the artifact contains this run's complete retained Workspace, which may include source, generated files and secrets — treat it as confidential - -h, --help show help - -PLUGINS - --plugin load a Plugin before the command runs (repeatable) - -A Plugin is a package or a file this invocation names. They install in the -order they are written, and that order is the whole order: xmd ships no -Plugin and installs none unless one is named. - -A selected Plugin is trusted executable code, not a sandboxed extension: -loading one runs its module, and selected Plugin code can execute whatever -the surrounding runtime permits. xmd discovers none on its own — a package -that happens to be installed does nothing until it is named — and loads none -over the network. ------ post-test output end ----- - is an internal mode, dispatched before public parsing and absent from help ... ok (1s) -Tier WFH — the credential helper is host assembly ... ok (2s) -running 2 tests from ./packages/cli/tests/workflow-inspection.test.ts -Tier WFI — xmd workflow status, list and history ... - WFI1: status reports one run, and --json is the same answer structurally ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:06.054Z -updated: 2026-10-09T10:47:06.202Z -retrieval: revision 1 at 2026-10-09T10:47:06.054Z -workspace: 7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25 -journal frontier: 68808a8e-13d1-4762-a5eb-e8d3614ad97f (Workspace 7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25) -executions: 1 - 4d59da7e-9e05-4028-be41-b3710a940751 started 2026-10-09T10:47:06.056Z, completed at 2026-10-09T10:47:06.201Z -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:06.054Z","updatedAt":"2026-10-09T10:47:06.202Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-283326da-44b2-4f91-ae4a-8d958105fddc/repository","commit":"e448eab431b7d285b8205fed7f0e128121849d51","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:06.054Z"},"executions":[{"executionId":"4d59da7e-9e05-4028-be41-b3710a940751","startedAt":"2026-10-09T10:47:06.056Z","stoppedAt":"2026-10-09T10:47:06.201Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"68808a8e-13d1-4762-a5eb-e8d3614ad97f","workspaceRootId":"7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25"},"currentWorkspaceRootId":"7858cd06483578306300de20107daa2841ec9c35a084eab0b5b73c95abd15c25"} ------ post-test output end ----- - WFI1: status reports one run, and --json is the same answer structurally ... ok (2s) - WFI1b: a run a lost host left mid-transaction is reported in the same shapes ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -workflow run: healthy-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"} -[{"eventId":"19ba96ab-57be-435d-98eb-443c14f77a2a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b6a649d-f2ec-44ac-8d30-6f4fef639afb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e277fcda-6a39-4ecb-97dc-434616357ac3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ad00b101-9b15-4ae9-939a-51340a6c339e","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4bf9eed5-d4b4-4c8d-87d5-47601cbba5c9","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","forkability":{"forkable":true,"blockers":[]}}] -READY -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"} -[{"eventId":"19ba96ab-57be-435d-98eb-443c14f77a2a","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"1b6a649d-f2ec-44ac-8d30-6f4fef639afb","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"e277fcda-6a39-4ecb-97dc-434616357ac3","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ad00b101-9b15-4ae9-939a-51340a6c339e","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4bf9eed5-d4b4-4c8d-87d5-47601cbba5c9","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b","forkability":{"forkable":true,"blockers":[]}}] -[{"record":{"runId":"healthy-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:09.812Z","updatedAt":"2026-10-09T10:47:09.957Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:09.812Z"},"executions":[{"executionId":"dee3c508-0fca-4258-94bf-7ed7c6c020d0","startedAt":"2026-10-09T10:47:09.815Z","stoppedAt":"2026-10-09T10:47:09.956Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"48706d15-bd05-4f62-b353-596377074f05","workspaceRootId":"b4e05c2515bf9435a705d858c5b3b1adda5e338a8d140b5e3733c7e6ea9a0354"},"currentWorkspaceRootId":"b4e05c2515bf9435a705d858c5b3b1adda5e338a8d140b5e3733c7e6ea9a0354"},{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:08.938Z","updatedAt":"2026-10-09T10:47:09.097Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8ba21ea7-860a-4e4f-8389-48c5a55198d5/repository","commit":"9cef811aa10caa4d517d9643944dc01c41231112","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:08.938Z"},"executions":[{"executionId":"9666a744-2b3a-4428-8c88-c2576c44192b","startedAt":"2026-10-09T10:47:08.940Z","stoppedAt":"2026-10-09T10:47:09.096Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"f88302b1-054f-4bf5-bf03-eb547fbc08f8","workspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"},"currentWorkspaceRootId":"beefa8af8a334b40d54547e15e3d6156d6903f6236ed4dc607ca247de6323a7b"}] ------ post-test output end ----- - WFI1b: a run a lost host left mid-transaction is reported in the same shapes ... ok (5s) - WFI2: list reports every run newest first and filters by one exact status ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: done-1 -hi -# Release - - - -workflow status: completed -workflow run: failed-1 - - -Failed to import component Missing: Cannot resolve component: Missing (searched: ) -workflow status: failed -[{"record":{"runId":"failed-1","definition":{"hashAlgorithm":"sha256","bundleHash":"9aad8ef9a176eb860b0a47d3415cc9cff806cc909a5fcb57c82bc70681eaddb6","entrypoint":"refusing.md","sources":[{"path":"refusing.md","sourceHash":"0d355040c54205c60287d77fb156cac0546391101891c4bdc7845b6e7dafce1c","byteLength":45}]},"props":{},"status":"failed","createdAt":"2026-10-09T10:47:15.219Z","updatedAt":"2026-10-09T10:47:15.339Z","stopReason":{"kind":"journal","eventId":"7a636c8f-5286-4866-87e1-36dd4e658a5c"}},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:15.219Z"},"executions":[{"executionId":"de846423-5663-4c89-b2f1-25a5831abe09","startedAt":"2026-10-09T10:47:15.221Z","stoppedAt":"2026-10-09T10:47:15.339Z","stopStatus":"failed","stopReason":{"kind":"journal","eventId":"7a636c8f-5286-4866-87e1-36dd4e658a5c"}}],"journalFrontier":{"eventId":"c21b46e9-2868-4ada-87fe-b2ff5d47c623","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},{"record":{"runId":"done-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:14.380Z","updatedAt":"2026-10-09T10:47:14.525Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:14.380Z"},"executions":[{"executionId":"672c5367-8893-4136-bed1-83c3d16b6da9","startedAt":"2026-10-09T10:47:14.383Z","stoppedAt":"2026-10-09T10:47:14.525Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"a3bb63bf-1d16-42e5-8b78-350ca448ec47","workspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"},"currentWorkspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"}] -[{"record":{"runId":"done-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:14.380Z","updatedAt":"2026-10-09T10:47:14.525Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-012b9ae7-48c3-4bdd-a8e5-7a5a95a316ef/repository","commit":"c3db9082d8f484cd0b80c907c1448b41290aaa06","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:14.380Z"},"executions":[{"executionId":"672c5367-8893-4136-bed1-83c3d16b6da9","startedAt":"2026-10-09T10:47:14.383Z","stoppedAt":"2026-10-09T10:47:14.525Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"a3bb63bf-1d16-42e5-8b78-350ca448ec47","workspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"},"currentWorkspaceRootId":"ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad"}] -RUN STATUS UPDATED DEFINITION WORKSPACE -failed-1 failed 2026-10-09T10:47:15.339Z 9aad8ef9a176eb860b0a47d3415cc9cff806cc909a5fcb57c82bc70681eaddb6 refusing.md 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -done-1 completed 2026-10-09T10:47:14.525Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md ca1fca64f24fd15d65e5cfe675a01b150e6b74831b9a49b259c45f6d6a6c86ad ------ post-test output end ----- - WFI2: list reports every run newest first and filters by one exact status ... ok (4s) - WFI3: history JSON holds every retained event, its root and its authored source ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -[{"eventId":"b2f212a3-6cea-4440-85a1-0fc3c2e08a71","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"8bfc6498-f21d-4d99-ad23-8b8aaa53cd8b","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0f5961a1-1496-422c-b39a-739f2ff1743d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"898f3076-6085-4c93-9ef1-66c69b2c6de0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"fdfd947c-51dd-4eda-8fc9-2cc55f6d7a72","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"bbc8708b-6562-4b24-ac4e-78ae91c23417","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69","forkability":{"forkable":true,"blockers":[]}}] -EVENT OPERATION SOURCE RESULT WORKSPACE -b2f212a3-6cea-4440-85a1-0fc3c2e08a71 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -8bfc6498-f21d-4d99-ad23-8b8aaa53cd8b import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -0f5961a1-1496-422c-b39a-739f2ff1743d import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -898f3076-6085-4c93-9ef1-66c69b2c6de0 workspace_file release.md:3:1 completed f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 -fdfd947c-51dd-4eda-8fc9-2cc55f6d7a72 exec release.md:5:1 completed f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 - -Outcome: completed at bbc8708b-6562-4b24-ac4e-78ae91c23417, Workspace f8f5ae3d583f5ab802109d0fbfdfdf13529dd6b87d72fbd0002b2ee7fc78ad69 ------ post-test output end ----- - WFI3: history JSON holds every retained event, its root and its authored source ... ok (2s) - WFI4: a run with no root Close says so rather than inventing an outcome ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: partial-1 -hi -# Release - - - -workflow status: completed -EVENT OPERATION SOURCE RESULT WORKSPACE -76c51517-e869-4294-8ba2-66609e2eb9e7 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -dc37cc8c-fd32-40dc-b4a5-11f82e556c5f import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -f097d5ec-8147-4629-b47e-b13329fa577d import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -7000ec0a-1358-4000-9693-fc7423b8cb90 workspace_file release.md:3:1 completed 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae -24bae7a8-ba9c-4998-bd84-6788729f682c exec release.md:5:1 completed 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae - -Outcome: no canonical document outcome was recorded. -run: partial-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:21.358Z -updated: 2026-10-09T10:47:21.510Z -retrieval: revision 1 at 2026-10-09T10:47:21.358Z -workspace: 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae -journal frontier: 24bae7a8-ba9c-4998-bd84-6788729f682c (Workspace 728946d66d7eece5bf22ab199a2097e09546ba0eb96a1547fd1e1e3e3e0404ae) -executions: 1 - 2f36902f-0d46-4cd5-8114-39d3cfdc5a36 started 2026-10-09T10:47:21.360Z, completed at 2026-10-09T10:47:21.510Z ------ post-test output end ----- - WFI4: a run with no root Close says so rather than inventing an outcome ... ok (2s) - WFI5: reading a run changes nothing about its file ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:24.219Z -updated: 2026-10-09T10:47:24.368Z -retrieval: revision 1 at 2026-10-09T10:47:24.219Z -workspace: 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406 -journal frontier: d56313d2-ca2b-4ef3-9d8b-9d564ce808fa (Workspace 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406) -executions: 1 - 1d6e0a6b-d2e0-49c4-84f0-8c6ff3da4154 started 2026-10-09T10:47:24.221Z, completed at 2026-10-09T10:47:24.368Z -RUN STATUS UPDATED DEFINITION WORKSPACE -release-1 completed 2026-10-09T10:47:24.368Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406 -[{"eventId":"66d91a66-443a-48e4-a4cd-1f317534d3e2","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ce0a9c17-30b5-4659-a746-b5b9fd04d1b5","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"036ae45a-3d11-4645-8c40-271835b908f2","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"87029b17-02fe-4cce-9d88-8280afdb375a","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"dccd7218-69a5-4010-bab4-16ab3d30ebf3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d56313d2-ca2b-4ef3-9d8b-9d564ce808fa","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"395d8d13510eee587bc53d5b6287b4aabc6826743585698720a847d509512406","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFI5: reading a run changes nothing about its file ... ok (3s) - WFI12: a retained Prompt checkpoint reaches no status or history output ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:27.565Z -updated: 2026-10-09T10:47:27.717Z -retrieval: revision 1 at 2026-10-09T10:47:27.565Z -workspace: 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a -journal frontier: 93d7f734-4869-41f7-9957-537e3989db3d (Workspace 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a) -executions: 1 - 94af77ad-fa52-4dbf-9658-ce2378f12bbd started 2026-10-09T10:47:27.567Z, completed at 2026-10-09T10:47:27.716Z -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:27.565Z","updatedAt":"2026-10-09T10:47:27.717Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-42cb3e72-d58c-4ee2-8666-11dd6f6a19d9/repository","commit":"a93cf50640c7b533da9b1fb43d8db06571cc0c9a","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:27.565Z"},"executions":[{"executionId":"94af77ad-fa52-4dbf-9658-ce2378f12bbd","startedAt":"2026-10-09T10:47:27.567Z","stoppedAt":"2026-10-09T10:47:27.716Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"},"currentWorkspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"} -RUN STATUS UPDATED DEFINITION WORKSPACE -release-1 completed 2026-10-09T10:47:27.717Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a -[{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:27.565Z","updatedAt":"2026-10-09T10:47:27.717Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-42cb3e72-d58c-4ee2-8666-11dd6f6a19d9/repository","commit":"a93cf50640c7b533da9b1fb43d8db06571cc0c9a","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:27.565Z"},"executions":[{"executionId":"94af77ad-fa52-4dbf-9658-ce2378f12bbd","startedAt":"2026-10-09T10:47:27.567Z","stoppedAt":"2026-10-09T10:47:27.716Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"},"currentWorkspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a"}] -EVENT OPERATION SOURCE RESULT WORKSPACE -19c5ccee-9800-426a-8048-4ab95b82a646 workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -b8ac7974-6267-4170-a849-1c3341e1220d import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -60073d09-ad68-4ddc-a229-a0032462455b import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -19fa3181-9bb4-47fc-9cb4-9383de1e6c20 workspace_file release.md:3:1 completed 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a -4dae717a-4c6b-4834-9d38-12f38b4ba813 exec release.md:5:1 completed 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a - -Outcome: completed at 93d7f734-4869-41f7-9957-537e3989db3d, Workspace 28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a -[{"eventId":"19c5ccee-9800-426a-8048-4ab95b82a646","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b8ac7974-6267-4170-a849-1c3341e1220d","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"60073d09-ad68-4ddc-a229-a0032462455b","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"19fa3181-9bb4-47fc-9cb4-9383de1e6c20","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"4dae717a-4c6b-4834-9d38-12f38b4ba813","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"93d7f734-4869-41f7-9957-537e3989db3d","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"28d84b168b914e7732855ed1484b9ea16906dd3528727042be84363e3478a85a","forkability":{"forkable":true,"blockers":[]}}] ------ post-test output end ----- - WFI12: a retained Prompt checkpoint reaches no status or history output ... ok (4s) - WFI6: one unreadable candidate fails the whole list ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-3f94ed0f-a12b-4c5d-863a-a6be16d7003c/runs/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc.sqlite is not a workflow-run database: SQLite does not recognize it as a database. It is left unchanged. -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:32.540Z -updated: 2026-10-09T10:47:32.697Z -retrieval: revision 1 at 2026-10-09T10:47:32.540Z -workspace: 8986346d95eb1722be9118d634c96e4b1f425fc6311ed73512363d4fc5609f21 -journal frontier: c177ecd8-9b2e-45a1-9452-85d137848a9c (Workspace 8986346d95eb1722be9118d634c96e4b1f425fc6311ed73512363d4fc5609f21) -executions: 1 - 491f2ca0-fdae-477c-b212-cfd257b66ad5 started 2026-10-09T10:47:32.543Z, completed at 2026-10-09T10:47:32.697Z ------ post-test output end ----- - WFI6: one unreadable candidate fails the whole list ... ok (2s) - WFI7: the grammar is by action, and refuses what an action does not have ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -unrecognized option for xmd workflow status: --forkable — it belongs to another workflow action -unrecognized argument for xmd workflow list: release-1 — list reports every run and names none -xmd workflow list accepts one --status filter, and two name two different lists -unrecognized value for --status: nowhere — expected one of running, suspended, interrupted, completed, failed, cancelled -unrecognized option for xmd workflow cancel: --json — it belongs to another workflow action -unrecognized option for xmd workflow status: --verbose — it belongs to another workflow action -No workflow run is stored under the run id "release-*". Start the run before looking it up. -xmd workflow status needs something to inspect — a run id (`xmd workflow status `) for a retained run, or `xmd workflow status --artifact=` for a sealed artifact. ------ post-test output end ----- - WFI7: the grammar is by action, and refuses what an action does not have ... ok (5s) - WFI8: a dash-leading run id is what `--` is for, and an extra one is refused ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: -inspected-run -hi -# Release - - - -workflow status: completed -run: -inspected-run -status: completed -definition: e6f2040ebc8a3ada51557d4deadbf10c1c39962aef50d3e0991dd1f0293bba1f -release.md -props: {} -created: 2026-10-09T10:47:41.213Z -updated: 2026-10-09T10:47:41.359Z -retrieval: revision 1 at 2026-10-09T10:47:41.213Z -workspace: 4df1d1f1e95b00bab1910d39dfb5980834965cf9a4b247b841fc8b416e663a47 -journal frontier: 08338cd0-399d-49bd-bce9-7e829234fcd2 (Workspace 4df1d1f1e95b00bab1910d39dfb5980834965cf9a4b247b841fc8b416e663a47) -executions: 1 - 8fb98c5f-b71d-461b-a852-888b3af464ae started 2026-10-09T10:47:41.216Z, completed at 2026-10-09T10:47:41.359Z -unrecognized argument for xmd workflow: unexpected — start names one definition, resume names one run, and answer names a run, a wait and one JSON value ------ post-test output end ----- - WFI8: a dash-leading run id is what `--` is for, and an extra one is refused ... ok (2s) - WFI10: an inspection reads no definition, so it answers outside a repository ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:44.026Z -updated: 2026-10-09T10:47:44.179Z -retrieval: revision 1 at 2026-10-09T10:47:44.026Z -workspace: 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 -journal frontier: 72c48853-0793-4e94-91e8-3461fed0ee32 (Workspace 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243) -executions: 1 - a0842304-8c6f-404d-9f6e-619f51a99a18 started 2026-10-09T10:47:44.028Z, completed at 2026-10-09T10:47:44.179Z -EVENT OPERATION SOURCE RESULT WORKSPACE -b50a000b-9b33-4c85-b925-51c292d57dce workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -3a8a5756-fb01-4394-b8ab-8dd6a863bfa7 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -eb281e51-23d0-4d4f-9611-5cb58b44bf82 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 -c2f0ab54-a483-4e3f-8dd6-ffa19a8530b9 workspace_file release.md:3:1 completed 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 -96d81262-9dd8-4402-9d04-cc14d881c85a exec release.md:5:1 completed 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 - -Outcome: completed at 72c48853-0793-4e94-91e8-3461fed0ee32, Workspace 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 -RUN STATUS UPDATED DEFINITION WORKSPACE -release-1 completed 2026-10-09T10:47:44.179Z 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md 939e30fafea85f7897ff5f66ad09b269205603932f8af0595c9554e874cfd243 ------ post-test output end ----- - WFI10: an inspection reads no definition, so it answers outside a repository ... ok (3s) - WFI11: a run id holding * or ? is inspected exactly, and matches nothing else ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-* -hi -# Release - - - -workflow status: completed -workflow run: release-? -hi -# Release - - - -workflow status: completed -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-*","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:47.400Z","updatedAt":"2026-10-09T10:47:47.550Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:47.400Z"},"executions":[{"executionId":"3640a2ba-59cd-49bb-89b0-cf2e04f36df6","startedAt":"2026-10-09T10:47:47.402Z","stoppedAt":"2026-10-09T10:47:47.550Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"e1d75989-b4e8-4633-b3a3-f66eb5200759","workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90"},"currentWorkspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90"} -{"record":{"runId":"release-?","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:48.230Z","updatedAt":"2026-10-09T10:47:48.387Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:48.230Z"},"executions":[{"executionId":"f8ddcc2f-3bf0-48fa-be6b-00d81ff975e2","startedAt":"2026-10-09T10:47:48.233Z","stoppedAt":"2026-10-09T10:47:48.386Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"cb0d67cd-752b-4f69-a304-5f14aee633cd","workspaceRootId":"b2409dfe09657b991ff9b53d8f2e0318e54765a0be1617d52484c7f4d40e01c1"},"currentWorkspaceRootId":"b2409dfe09657b991ff9b53d8f2e0318e54765a0be1617d52484c7f4d40e01c1"} -[{"eventId":"0f33de4a-d6e2-4189-be71-05acef0204b0","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-*","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"66cd34ad-873f-46fd-918c-cc7c75f0457c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"427d19c5-d519-4800-ae2b-bf6295311132","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"bbf18ee0-2ecc-4e37-9d73-e9827d167bfa","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"21353211-e3ed-4d34-b371-6d37be142833","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"e1d75989-b4e8-4633-b3a3-f66eb5200759","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"ddd348b4b60940f9bc0090d2ee6a55fee9ebdb855cb4522c193559ed2f869e90","forkability":{"forkable":true,"blockers":[]}}] -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:49.088Z","updatedAt":"2026-10-09T10:47:49.233Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d8c2f748-cb1e-407b-ba73-1bdc8ff9fa69/repository","commit":"8e5894e45c88a0f3b5c2eacad2f1ae3bfe570c73","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:49.088Z"},"executions":[{"executionId":"82633d70-7153-4d5d-b244-08528a7e0a76","startedAt":"2026-10-09T10:47:49.090Z","stoppedAt":"2026-10-09T10:47:49.233Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"6a09879d-c3f7-4754-b74c-24f8f8e937fa","workspaceRootId":"0556d0efa0c5b73cd2e6a7883d23c4168c5d6ccfd8f2b33c31f29c65c5bd6438"},"currentWorkspaceRootId":"0556d0efa0c5b73cd2e6a7883d23c4168c5d6ccfd8f2b33c31f29c65c5bd6438"} -No workflow run is stored under the run id "release-2". Start the run before looking it up. ------ post-test output end ----- - WFI11: a run id holding * or ? is inspected exactly, and matches nothing else ... ok (6s) - WFI9: an absent run is reported, and reading it creates nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "never-started". Start the run before looking it up. -No workflow run is stored under the run id "never-started". Start the run before looking it up. -no workflow runs ------ post-test output end ----- - WFI9: an absent run is reported, and reading it creates nothing ... ok (2s) -Tier WFI — xmd workflow status, list and history ... ok (49s) -Tier WFI — xmd workflow status and history over a sealed artifact ... - I1: an artifact answers the retained questions, and says which artifact it is ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:47:56.005Z","updatedAt":"2026-10-09T10:47:56.160Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository","commit":"7fd360d34b54ef5957ad1e8b3fae05bb432d5ebd","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:47:56.005Z"},"executions":[{"executionId":"a29cb119-9585-4910-a89e-d3887cb3d7b4","startedAt":"2026-10-09T10:47:56.008Z","stoppedAt":"2026-10-09T10:47:56.160Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"},"currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"} -[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}] -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd -workflow run: release-1 -workflow frontier: 1fdf685a-7853-4a72-9f47-d980c4461f74 -workflow root: 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d -workflow artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e -workflow artifact sha256: cfd95929b1c9875898d431425b8f426c7d894976a23775476d7fc69fe52338b6 -{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:47:56.005Z","updatedAt":"2026-10-09T10:47:56.160Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"a29cb119-9585-4910-a89e-d3887cb3d7b4","startedAt":"2026-10-09T10:47:56.008Z","stoppedAt":"2026-10-09T10:47:56.160Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"},"currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}}} -{"artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}},"entries":[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}]} -{"artifact":{"identity":"2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e","frontier":{"sourceRunId":"release-1","finalEventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","currentWorkspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d"}},"entries":[{"eventId":"5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"476ecff1-1f8c-408b-b1cc-71998905d540","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"f83df33e-c819-4faa-ab37-fafcf19d57d1","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"82044f6d-ecc0-470e-a692-f85cd371dee8","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"af08853a-3ed7-462f-9875-942ef9260da3","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"1fdf685a-7853-4a72-9f47-d980c4461f74","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d","forkability":{"forkable":true,"blockers":[]}}]} -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd -artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e -artifact frontier: run release-1, event 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:47:56.005Z -updated: 2026-10-09T10:47:56.160Z -workspace: 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d -journal frontier: 1fdf685a-7853-4a72-9f47-d980c4461f74 (Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d) -executions: 1 - a29cb119-9585-4910-a89e-d3887cb3d7b4 started 2026-10-09T10:47:56.008Z, completed at 2026-10-09T10:47:56.160Z -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-0daf5ea4-bfdd-45b3-b76d-4846538df5dd/repository/evidence.xmd -artifact identity: 2910011d1fd3bd696b82634ac503826c00836d159d05530fe91e2032865e096e -artifact frontier: run release-1, event 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d -EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS -5f3be864-f6c4-4b0e-94ff-f5c7b4dd8c4e workflow_run - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -476ecff1-1f8c-408b-b1cc-71998905d540 import_component - completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -f83df33e-c819-4faa-ab37-fafcf19d57d1 import_component release.md:3:1 completed 41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30 yes - -82044f6d-ecc0-470e-a692-f85cd371dee8 workspace_file release.md:3:1 completed 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d yes - -af08853a-3ed7-462f-9875-942ef9260da3 exec release.md:5:1 completed 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d yes - - -Outcome: completed at 1fdf685a-7853-4a72-9f47-d980c4461f74, Workspace 8e13f84b71c3e337f5dcba7049305c1a6d770319788da7ca3691f782754beb3d ------ post-test output end ----- - I1: an artifact answers the retained questions, and says which artifact it is ... ok (6s) - I1b: the frontier names the last event's own root, not the current pointer ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:02.073Z","updatedAt":"2026-10-09T10:48:02.228Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8c3c3441-7241-4814-aa4e-a1096467c542/repository","commit":"82fb13ff0f34e0264356907a3614239c5c41a0ed","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:02.073Z"},"executions":[{"executionId":"72fa77e6-e42e-4d22-87ff-3b61c5a823f8","startedAt":"2026-10-09T10:48:02.075Z","stoppedAt":"2026-10-09T10:48:02.228Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3e8485ff-f928-4591-a50e-1d500aab179d","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2"} -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-8c3c3441-7241-4814-aa4e-a1096467c542/repository/diverged.xmd -workflow run: release-1 -workflow frontier: 3e8485ff-f928-4591-a50e-1d500aab179d -workflow root: 3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2 -workflow artifact identity: 85e7aa165d7c8903bac1d7ef36c807484c9a10b3a1791d1a395ddc4a9942c111 -workflow artifact sha256: 5a4b225119a548e01e729adfd4e9ae251c768bb73359fca82e4b82514b948766 -{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:02.073Z","updatedAt":"2026-10-09T10:48:02.228Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"72fa77e6-e42e-4d22-87ff-3b61c5a823f8","startedAt":"2026-10-09T10:48:02.075Z","stoppedAt":"2026-10-09T10:48:02.228Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3e8485ff-f928-4591-a50e-1d500aab179d","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2","artifact":{"identity":"85e7aa165d7c8903bac1d7ef36c807484c9a10b3a1791d1a395ddc4a9942c111","frontier":{"sourceRunId":"release-1","finalEventId":"3e8485ff-f928-4591-a50e-1d500aab179d","currentWorkspaceRootId":"3ed11a5b38b57b8acf554c8e55a2c560852b8fccb0f71cdeef72fc911c8db8c2"}}} ------ post-test output end ----- - I1b: the frontier names the last event's own root, not the current pointer ... ok (3s) - I2: where the file is, is presentation — never part of the answer ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository","commit":"9383f194efcb135b9ca6e8bc5dc0d41629cdec46","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:05.474Z"},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"} -[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}] -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/evidence.xmd -workflow run: release-1 -workflow frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b -workflow root: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e -workflow artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 -workflow artifact sha256: 01e05ccb62d23463318f34789ce5b925c74acf7b9fd2f943dc47e687f8734663 -{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}}} -{"artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}},"entries":[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}]} -{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:05.474Z","updatedAt":"2026-10-09T10:48:05.623Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"c27c007c-0581-45db-83f5-d0d5841c65a0","startedAt":"2026-10-09T10:48:05.476Z","stoppedAt":"2026-10-09T10:48:05.623Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"},"currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}}} -{"artifact":{"identity":"2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79","frontier":{"sourceRunId":"release-1","finalEventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","currentWorkspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e"}},"entries":[{"eventId":"e55462ef-945e-4fdf-ba9f-5e0b0d806119","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"a942f06c-c8e9-463e-9d39-fccbe94affe9","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"349b2422-d718-4068-9a85-75d9b7c4953a","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"2245d9c3-e4b7-476c-9875-8df4475539ae","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a9b06f7b-c4d4-4b8e-9bf7-7e4964600ec2","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"d7dc19ea-2d08-452d-9594-b2cb3e69fd5b","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e","forkability":{"forkable":true,"blockers":[]}}]} -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/evidence.xmd -artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 -artifact frontier: run release-1, event d7dc19ea-2d08-452d-9594-b2cb3e69fd5b, Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:48:05.474Z -updated: 2026-10-09T10:48:05.623Z -workspace: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e -journal frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b (Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e) -executions: 1 - c27c007c-0581-45db-83f5-d0d5841c65a0 started 2026-10-09T10:48:05.476Z, completed at 2026-10-09T10:48:05.623Z -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-d9f0d89f-eda1-4992-afe7-7201eeb3f9ee/repository/copies/same.xmd -artifact identity: 2fe344368f7943753120b92b747494a9e3303a2bb250057edfe50ce8303e9b79 -artifact frontier: run release-1, event d7dc19ea-2d08-452d-9594-b2cb3e69fd5b, Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:48:05.474Z -updated: 2026-10-09T10:48:05.623Z -workspace: 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e -journal frontier: d7dc19ea-2d08-452d-9594-b2cb3e69fd5b (Workspace 3595c35798395785ba20676eb2983b0add437845c9def2393e5125daf6b5485e) -executions: 1 - c27c007c-0581-45db-83f5-d0d5841c65a0 started 2026-10-09T10:48:05.476Z, completed at 2026-10-09T10:48:05.623Z ------ post-test output end ----- - I2: where the file is, is presentation — never part of the answer ... ok (6s) - I3: inspecting an artifact reaches no run, and writes nothing ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:12.053Z","updatedAt":"2026-10-09T10:48:12.204Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-a77a5d5b-2c1f-4ceb-9b17-28851d1ee315/repository","commit":"613caeb088287bb2c40898c0930d7230f7a1b0d4","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:12.053Z"},"executions":[{"executionId":"65843f85-a4e7-4885-b691-74bf64174c75","startedAt":"2026-10-09T10:48:12.055Z","stoppedAt":"2026-10-09T10:48:12.203Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"},"currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"} -[{"eventId":"c296d521-fe5f-4e2b-a591-032ae896179b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c0e41362-78c2-4023-b1f8-449310cbcdd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b7ac91aa-e7a5-496c-b6f4-eb2d773c0eef","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"91b5350f-9acd-4d08-858a-e81fc5eef6a0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6abecbd4-1a04-4ba8-837b-a946e8a14504","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","forkability":{"forkable":true,"blockers":[]}}] -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-a77a5d5b-2c1f-4ceb-9b17-28851d1ee315/repository/evidence.xmd -workflow run: release-1 -workflow frontier: eb73591a-fea3-454e-8635-29aa8336276e -workflow root: b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84 -workflow artifact identity: 686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920 -workflow artifact sha256: 4bf6b991cd1612b5c348aa68b4dbac936c580140780e4e049dde83e9d3217735 -{"record":{"runId":"release-1","props":{},"status":"completed","createdAt":"2026-10-09T10:48:12.053Z","updatedAt":"2026-10-09T10:48:12.204Z","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]}},"executions":[{"executionId":"65843f85-a4e7-4885-b691-74bf64174c75","startedAt":"2026-10-09T10:48:12.055Z","stoppedAt":"2026-10-09T10:48:12.203Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"},"currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","artifact":{"identity":"686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920","frontier":{"sourceRunId":"release-1","finalEventId":"eb73591a-fea3-454e-8635-29aa8336276e","currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"}}} -{"artifact":{"identity":"686b7e7f8788c134c86cd18862e73fe05c62842d12714f286e658940c6ce5920","frontier":{"sourceRunId":"release-1","finalEventId":"eb73591a-fea3-454e-8635-29aa8336276e","currentWorkspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84"}},"entries":[{"eventId":"c296d521-fe5f-4e2b-a591-032ae896179b","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"c0e41362-78c2-4023-b1f8-449310cbcdd0","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"b7ac91aa-e7a5-496c-b6f4-eb2d773c0eef","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"91b5350f-9acd-4d08-858a-e81fc5eef6a0","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"6abecbd4-1a04-4ba8-837b-a946e8a14504","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"eb73591a-fea3-454e-8635-29aa8336276e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"b2e64fb1a5bf8bb60827cc82c30e26ec08f6d987937fa86cf04a846e1dc32e84","forkability":{"forkable":true,"blockers":[]}}]} ------ post-test output end ----- - I3: inspecting an artifact reaches no run, and writes nothing ... ok (4s) - I4: a file that is not an artifact is refused before anything is presented ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:16.587Z","updatedAt":"2026-10-09T10:48:16.737Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository","commit":"7111a498de0022870c0ba4713be51e2e528e48a6","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:16.587Z"},"executions":[{"executionId":"5d536300-01a7-4152-9253-b4c3ce7535e7","startedAt":"2026-10-09T10:48:16.590Z","stoppedAt":"2026-10-09T10:48:16.737Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"3a84b8e2-0b10-4d81-9191-574b8ac6f14e","workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80"},"currentWorkspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80"} -[{"eventId":"ee44e56a-879d-41ff-9328-c0c3ffe8cf2d","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"d389bc97-177d-4afe-a5be-d3fe1b253791","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"2117b1ec-eb3e-4de2-8a99-cc7ea638de19","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"ae3de7a9-42a8-48eb-bdde-cb862942b5f7","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"01fcf65b-7ec7-4420-9246-cf7314987371","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"3a84b8e2-0b10-4d81-9191-574b8ac6f14e","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80","forkability":{"forkable":true,"blockers":[]}}] -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/evidence.xmd -workflow run: release-1 -workflow frontier: 3a84b8e2-0b10-4d81-9191-574b8ac6f14e -workflow root: faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 -workflow artifact identity: 271abe466f57d169666a9e5d0f1739baf0a9af7da2eef950795013b7b184e56b -workflow artifact sha256: 7a02543697d54f15f0450007e6b7daf0b420dbc3c350321761afe34ed56c18f5 -The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/damaged.xmd is not an XMD artifact: SQLite does not recognize it as a database. It is left unchanged. -The file at /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/damaged.xmd is not an XMD artifact: SQLite does not recognize it as a database. It is left unchanged. -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-fb9065fc-03b0-4627-a4bb-926f3656c992/repository/evidence.xmd -artifact identity: 271abe466f57d169666a9e5d0f1739baf0a9af7da2eef950795013b7b184e56b -artifact frontier: run release-1, event 3a84b8e2-0b10-4d81-9191-574b8ac6f14e, Workspace faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 -run: release-1 -status: completed -definition: 620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783 release.md -props: {} -created: 2026-10-09T10:48:16.587Z -updated: 2026-10-09T10:48:16.737Z -workspace: faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80 -journal frontier: 3a84b8e2-0b10-4d81-9191-574b8ac6f14e (Workspace faac30bb36a453fe513218fdf7ba00b08a0b1aba7a23b7b532c4beafc171ca80) -executions: 1 - 5d536300-01a7-4152-9253-b4c3ce7535e7 started 2026-10-09T10:48:16.590Z, completed at 2026-10-09T10:48:16.737Z ------ post-test output end ----- - I4: a file that is not an artifact is refused before anything is presented ... ok (5s) - I5: exactly one source, and list stays a registry of runs ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -hi -# Release - - - -workflow status: completed -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:21.503Z","updatedAt":"2026-10-09T10:48:21.653Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository","commit":"f42779bdc61922367c3a333b3d9b412c8028fcf8","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:21.503Z"},"executions":[{"executionId":"9917f1d4-2ebb-44eb-9acb-b83d482c6861","startedAt":"2026-10-09T10:48:21.506Z","stoppedAt":"2026-10-09T10:48:21.653Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"},"currentWorkspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"} -[{"eventId":"2f96dcec-b411-46d8-b9f5-ae00e1f3b751","event":{"type":"yield","coroutineId":"root","description":{"type":"workflow_run","name":"workflow_run","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"},"result":{"status":"ok","value":{"runId":"release-1","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"ea81e3f3-9ef5-4f2d-91e1-0a8eb6c30239","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"__root__"},"result":{"status":"ok","value":{"kind":"repository","path":"release.md","content":"# Release\n\nwritten\n\n```bash exec\necho hi\n```\n"}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","forkability":{"forkable":true,"blockers":[]}},{"eventId":"0a2156b5-31f8-4ac8-bfe0-2559cd6c678c","event":{"type":"yield","coroutineId":"root","description":{"type":"import_component","name":"File","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"registered","origin":"@executablemd/core","reserved":false}}},"workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"3f7a960d-e00a-4e57-8560-e35037f2e2b3","event":{"type":"yield","coroutineId":"root","description":{"type":"workspace_file","name":"write:3b0a4c5c72e9ec5604a4978aeb095171927a5ede1bcbfd3a1ff05f9f18b24470:/notes.md","path":"notes.md","cwd":"/","executablemd.source-position":{"path":"release.md","offset":11,"line":3,"column":1}},"result":{"status":"ok","value":{"kind":"written"}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","source":{"path":"release.md","offset":11,"line":3,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"a78e4de6-3425-4026-90f7-f00a4f6768e8","event":{"type":"yield","coroutineId":"root","description":{"type":"exec","name":"exec:echo hi ","command":["bash","-c","echo hi\n"],"executablemd.source-position":{"path":"release.md","offset":49,"line":5,"column":1}},"result":{"status":"ok","value":{"exitCode":0,"stdout":"hi\n","stderr":""}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","source":{"path":"release.md","offset":49,"line":5,"column":1},"forkability":{"forkable":true,"blockers":[]}},{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","event":{"type":"close","coroutineId":"root","result":{"status":"ok","value":{"status":"ok","output":"# Release\n\n\n\n","value":"# Release\n\n\n\n"}}},"workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417","forkability":{"forkable":true,"blockers":[]}}] -workflow artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd -workflow run: release-1 -workflow frontier: 59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c -workflow root: d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417 -workflow artifact identity: 790fffb288a3da8c8f08d4b955e2b46406f5df3b60f8e097e7c1a4c8d59a19fb -workflow artifact sha256: 425bfa9e3bb63bffcad0b9bc0e2479de5dfcf893625d05df46d07df79e152fc6 -xmd workflow status needs something to inspect — a run id (`xmd workflow status `) for a retained run, or `xmd workflow status --artifact=` for a sealed artifact. -xmd workflow status inspects one thing — the run "release-1" or the artifact "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd", not both. Drop whichever one you did not mean. -xmd workflow status inspects one artifact, and two --artifact options name two different files -xmd workflow history needs something to inspect — a run id (`xmd workflow history `) for a retained run, or `xmd workflow history --artifact=` for a sealed artifact. -xmd workflow history inspects one thing — the run "release-1" or the artifact "/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository/evidence.xmd", not both. Drop whichever one you did not mean. -xmd workflow history inspects one artifact, and two --artifact options name two different files -[{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"620a2a59274dc36aa8e90b55e7fad74e6d5f4b84e5e097912143773f98c57783","entrypoint":"release.md","sources":[{"path":"release.md","sourceHash":"2fe9b79d4ff7f833f4cda9b4afb99bc842dbac367d0c4f894e788ca992fb8bce","byteLength":74}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:21.503Z","updatedAt":"2026-10-09T10:48:21.653Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-44073b6d-5cde-424f-aa8d-01fe4baa4b01/repository","commit":"f42779bdc61922367c3a333b3d9b412c8028fcf8","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:21.503Z"},"executions":[{"executionId":"9917f1d4-2ebb-44eb-9acb-b83d482c6861","startedAt":"2026-10-09T10:48:21.506Z","stoppedAt":"2026-10-09T10:48:21.653Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"59b6e9e9-2f22-400c-ae4c-49d18c9f2d0c","workspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"},"currentWorkspaceRootId":"d8405a8c89fa6c9942668ce839e531cca47119a0b52111e814023e12b344d417"}] -unrecognized option for xmd workflow list: --artifact — it belongs to another workflow action -unrecognized option for xmd workflow cancel: --artifact — it belongs to another workflow action ------ post-test output end ----- - I5: exactly one source, and list stays a registry of runs ... ok (8s) - I6: a finalized artifact's checkpoint and bundle evidence reaches no output ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd -artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 -artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -run: release-1.4 -status: suspended -definition: fee1b10874315dcbd100bb36a32b4fcc1d5d727da63250e99286036a62d9f25f workflows/release.md#release-steps -props: {"channel":"stable","retries":2} -created: 2026-01-02T03:04:05.000Z -updated: 2026-01-02T03:44:05.000Z -stop reason: journal event event-7 -forked from: release-1.3 at origin-2 (Workspace a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208) -workspace: 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -journal frontier: event-12 (Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb) -executions: 2 - execution-0 started 2026-01-02T03:04:05.000Z, interrupted at 2026-01-02T03:14:05.000Z - execution-1 started 2026-01-02T03:24:05.000Z, suspended at 2026-01-02T03:44:05.000Z -{"record":{"runId":"release-1.4","props":{"channel":"stable","retries":2},"status":"suspended","stopReason":{"kind":"journal","eventId":"event-7"},"createdAt":"2026-01-02T03:04:05.000Z","updatedAt":"2026-01-02T03:44:05.000Z","definition":{"hashAlgorithm":"sha256","bundleHash":"fee1b10874315dcbd100bb36a32b4fcc1d5d727da63250e99286036a62d9f25f","entrypoint":"workflows/release.md","sources":[{"path":"workflows/Checklist.md","sourceHash":"07015f69ff64556e40f1b662664edb371917dfd9ce736564de0c7cc31dbdaf03","byteLength":10},{"path":"workflows/Unused.md","sourceHash":"fd7e3b692ffc1862cc4dd847afa694d10e19805796a27aef21698e3654a63a3a","byteLength":48},{"path":"workflows/release.md","sourceHash":"e155d8bf3842de569979f953b92bbf3cc7d5db68d9468b77a8ef7bc2ad5e8f23","byteLength":25}],"targetPath":"release-steps","components":[{"name":"Checklist","path":"workflows/Checklist.md"},{"name":"Unused","path":"workflows/Unused.md"}]}},"executions":[{"executionId":"execution-0","startedAt":"2026-01-02T03:04:05.000Z","stoppedAt":"2026-01-02T03:14:05.000Z","stopStatus":"interrupted","stopReason":{"kind":"host","code":"host-lost"}},{"executionId":"execution-1","startedAt":"2026-01-02T03:24:05.000Z","stoppedAt":"2026-01-02T03:44:05.000Z","stopStatus":"suspended","stopReason":{"kind":"journal","eventId":"event-7"}}],"journalFrontier":{"eventId":"event-12","workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"},"currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","lineage":{"sourceRunId":"release-1.3","checkpointEventId":"origin-2","checkpointWorkspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208"},"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}}} -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd -artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 -artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -EVENT OPERATION SOURCE RESULT WORKSPACE -event-0 call workflows/release.md:3:1 completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 -event-1 suspension_request - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 -event-2 suspension_answer - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 -event-3 git_effect workflows/release.md:9:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-4 end of root.0 - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-5 suspension_request workflows/release.md:11:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-6 suspension_answer - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-7 suspension_request workflows/release.md:14:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-8 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-9 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-10 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-11 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -event-12 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb - -Outcome: no canonical document outcome was recorded. -{"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}},"entries":[{"eventId":"event-0","event":{"type":"yield","coroutineId":"root","description":{"type":"call","name":"workflow_run","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":3,"column":1}},"result":{"status":"ok","value":{"runId":"release-1.4"}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","source":{"path":"workflows/release.md","offset":0,"line":3,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-1","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd","request":{"kind":"approval","release":"1.3"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]}},"result":{"status":"ok","value":"c753b28bc956b71df2bd6edec9e185fd"}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-1"}},{"eventId":"event-2","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-2"}},{"eventId":"event-3","event":{"type":"yield","coroutineId":"root.0","description":{"type":"git_effect","name":"push","branch":"release","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":9,"column":1}},"result":{"status":"ok","value":{"commit":"9fceb02d0ae598e95dc970b74767f19372d61af8"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":9,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-3"}},{"eventId":"event-4","event":{"type":"close","coroutineId":"root.0","result":{"status":"ok","value":null}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-5","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4","request":{"kind":"approval","release":"1.4"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":11,"column":1}},"result":{"status":"ok","value":"d4f44f4045734897aa9999f472b4c7e4"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":11,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-6","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-7","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"bb918fa9153ede998639df289cb6e007","suspensionId":"bb918fa9153ede998639df289cb6e007","request":{"kind":"confirmation","question":"ship it?"},"responseSchema":{"type":"string"},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":14,"column":1}},"result":{"status":"ok","value":"bb918fa9153ede998639df289cb6e007"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":14,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-8","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-9","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 1 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-10","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-11","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"failed","text":"turn 1 reply","stopReason":"refusal"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-12","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[3]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:e73fcae09729af1ae89ed54a98272ab6","agentSessionId":"sess_04V","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}}]} -artifact: /var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfi-c6b0918f-8396-4c91-84ca-7d8616565dac/repository/finalized.xmd -artifact identity: 5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05 -artifact frontier: run release-1.4, event event-12, Workspace 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb -EVENT OPERATION SOURCE RESULT WORKSPACE FORKABLE BLOCKERS -event-0 call workflows/release.md:3:1 completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 -event-1 suspension_request - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 -event-2 suspension_answer - completed a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208 no unsupported-effect@event-0 -event-3 git_effect workflows/release.md:9:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 -event-4 end of root.0 - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 -event-5 suspension_request workflows/release.md:11:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 -event-6 suspension_answer - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 -event-7 suspension_request workflows/release.md:14:1 completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0 -event-8 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 -event-9 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 -event-10 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 -event-11 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 -event-12 agent_prompt - completed 438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb no unsupported-effect@event-0, agent-state-unavailable@event-8 - -Outcome: no canonical document outcome was recorded. -{"artifact":{"identity":"5100adb6a4fc7f122b8c1461d54c40102cb5680ff296b000816edde90168ac05","frontier":{"sourceRunId":"release-1.4","finalEventId":"event-12","currentWorkspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb"}},"entries":[{"eventId":"event-0","event":{"type":"yield","coroutineId":"root","description":{"type":"call","name":"workflow_run","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":3,"column":1}},"result":{"status":"ok","value":{"runId":"release-1.4"}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","source":{"path":"workflows/release.md","offset":0,"line":3,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-1","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd","request":{"kind":"approval","release":"1.3"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]}},"result":{"status":"ok","value":"c753b28bc956b71df2bd6edec9e185fd"}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-1"}},{"eventId":"event-2","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"c753b28bc956b71df2bd6edec9e185fd","suspensionId":"c753b28bc956b71df2bd6edec9e185fd"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"a226b9ef4f4c8982c79cd890f8c8dae92432b8f92d9305e8e6a8dbc254975208","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-2"}},{"eventId":"event-3","event":{"type":"yield","coroutineId":"root.0","description":{"type":"git_effect","name":"push","branch":"release","executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":9,"column":1}},"result":{"status":"ok","value":{"commit":"9fceb02d0ae598e95dc970b74767f19372d61af8"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":9,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]},"inherited":{"sourceRunId":"release-1.3","sourceEventId":"origin-3"}},{"eventId":"event-4","event":{"type":"close","coroutineId":"root.0","result":{"status":"ok","value":null}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-5","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4","request":{"kind":"approval","release":"1.4"},"responseSchema":{"type":"object","properties":{"approved":{"type":"boolean"}},"required":["approved"]},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":11,"column":1}},"result":{"status":"ok","value":"d4f44f4045734897aa9999f472b4c7e4"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":11,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-6","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_answer","name":"d4f44f4045734897aa9999f472b4c7e4","suspensionId":"d4f44f4045734897aa9999f472b4c7e4"},"result":{"status":"ok","value":{"approved":true}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-7","event":{"type":"yield","coroutineId":"root","description":{"type":"suspension_request","name":"bb918fa9153ede998639df289cb6e007","suspensionId":"bb918fa9153ede998639df289cb6e007","request":{"kind":"confirmation","question":"ship it?"},"responseSchema":{"type":"string"},"executablemd.source-position":{"path":"workflows/release.md","offset":0,"line":14,"column":1}},"result":{"status":"ok","value":"bb918fa9153ede998639df289cb6e007"}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","source":{"path":"workflows/release.md","offset":0,"line":14,"column":1},"forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"}]}},{"eventId":"event-8","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-9","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[1]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:070613770c4f09a46861224c9a64b5b3","agentSessionId":"sess_02P","status":"completed","text":"turn 1 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-10","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-11","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[2]/Session[0]#1","input":"turn 1"},"result":{"status":"ok","value":{"sequence":1,"agent":"claude","sessionKey":"xmd:workflow:v1:d31ff2a48f5344e1aa028182012fa1c2","agentSessionId":"sess_03C","status":"failed","text":"turn 1 reply","stopReason":"refusal"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}},{"eventId":"event-12","event":{"type":"yield","coroutineId":"root.1","description":{"type":"agent_prompt","name":"expansion:release/Agent[3]/Session[0]#0","input":"turn 0"},"result":{"status":"ok","value":{"sequence":0,"agent":"claude","sessionKey":"xmd:workflow:v1:e73fcae09729af1ae89ed54a98272ab6","agentSessionId":"sess_04V","status":"completed","text":"turn 0 reply"}}},"workspaceRootId":"438b0650932a46dfe11ae56206545b308e433cedd06c80a18c73927d008b39eb","forkability":{"forkable":false,"blockers":[{"code":"unsupported-effect","eventId":"event-0"},{"code":"agent-state-unavailable","eventId":"event-8"}]}}]} ------ post-test output end ----- - I6: a finalized artifact's checkpoint and bundle evidence reaches no output ... ok (4s) -Tier WFI — xmd workflow status and history over a sealed artifact ... ok (37s) -running 1 test from ./packages/cli/tests/workflow-installation.test.ts -Tier WFI — what a run hands to canonical core ... - WFI1: a run reaches core as one installation carrying its admission and preparation ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 -workflow run: 49759785-2257-49f6-b770-0433e37fa698 -workflow status: completed ------ post-test output end ----- - WFI1: a run reaches core as one installation carrying its admission and preparation ... ok (191ms) - WFI2: a completed run is given no Workspace to attach ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 -workflow run: dbee8c72-c06f-4886-a1bf-30df9998b57b -workflow status: completed -workflow run: dbee8c72-c06f-4886-a1bf-30df9998b57b -workflow status: completed ------ post-test output end ----- - WFI2: a completed run is given no Workspace to attach ... ok (182ms) - WFI3: a failed or cancelled run is refused before anything is opened ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 ------ post-test output end ----- - WFI3: a failed or cancelled run is refused before anything is opened ... ok (375ms) - WFI4: completed and interrupted runs are still admitted ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 -workflow run: 16b3be26-d81c-40b6-b5d7-40522f6a2338 -workflow status: completed -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 -workflow run: 6e48c23d-a459-4b8b-880b-65307b4740f3 -workflow status: completed ------ post-test output end ----- - WFI4: completed and interrupted runs are still admitted ... ok (360ms) - WFI5: a lifecycle write storage refused is never published as a status ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 ------ post-test output end ----- - WFI5: a lifecycle write storage refused is never published as a status ... ok (174ms) - WFI6: an interruption storage refusal is never published as a status ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 ------ post-test output end ----- - WFI6: an interruption storage refusal is never published as a status ... ok (173ms) - WFI7: an interruption that was retained keeps the ordinary outcome ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -sha1 ------ post-test output end ----- - WFI7: an interruption that was retained keeps the ordinary outcome ... ok (170ms) -Tier WFI — what a run hands to canonical core ... ok (1s) -running 2 tests from ./packages/cli/tests/workflow-lifecycle-control.test.ts -Tier WFC2 — xmd workflow cancel and delete ... - WFC2-1: a completed run refuses cancellation and reports its own request ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -Nothing but prose. -workflow status: completed -workflow run completed: a run whose outcome already won is not cancelled. The run is left exactly as it is. -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:36.235Z","updatedAt":"2026-10-09T10:48:36.354Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-caa92541-8581-407b-b402-9f0e87a6cc53/repository","commit":"56aee67dcb8e63dfc3b5b4b719e9d1c764d66d5f","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:36.235Z"},"executions":[{"executionId":"9768f2c7-80db-422d-a890-b66b3c997a3c","startedAt":"2026-10-09T10:48:36.238Z","stoppedAt":"2026-10-09T10:48:36.354Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"829921f6-8ae2-4a57-88bf-7e57348bd6d1","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} ------ post-test output end ----- - WFC2-1: a completed run refuses cancellation and reports its own request ... ok (2s) - WFC2-2: cancelling a resumable run succeeds and reports the retained status ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -Nothing but prose. -workflow status: completed -workflow cancel: release-1 (cancelled) -{"record":{"runId":"release-1","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"cancelled","createdAt":"2026-10-09T10:48:39.094Z","updatedAt":"2026-10-09T10:48:39.739Z","stopReason":{"kind":"host","code":"cancelled"}},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-40177019-6016-41d0-95cc-b2aa5752338a/repository","commit":"e4f4ec86d30e68d172d559c07c32baf9986b09c3","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:39.094Z"},"executions":[{"executionId":"affed2a9-6466-4c82-8fcb-66506a22ec24","startedAt":"2026-10-09T10:48:39.096Z","stoppedAt":"2026-10-09T10:48:39.210Z","stopStatus":"interrupted"}],"journalFrontier":{"eventId":"14c6d97a-cef5-4869-a777-a32e4fc359e1","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} -workflow cancel: release-1 (cancelled) ------ post-test output end ----- - WFC2-2: cancelling a resumable run succeeds and reports the retained status ... ok (3s) - WFC2-3: delete removes the run and says what went ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: release-1 -# Release - -Nothing but prose. -workflow status: completed -workflow run: release-2 -# Release - -Nothing but prose. -workflow status: completed -workflow delete: release-1 (run-storage) -{"record":{"runId":"release-2","definition":{"hashAlgorithm":"sha256","bundleHash":"69e677e7ffc7e8a7cc502b8a89ae1f47eb4db204751e96b6240a73b0d92cb2ba","entrypoint":"flow.md","sources":[{"path":"flow.md","sourceHash":"916acaf612ad3d27707baf49bac6f0f5483cbb72fae491b75912180512ea91e0","byteLength":30}]},"props":{},"status":"completed","createdAt":"2026-10-09T10:48:43.145Z","updatedAt":"2026-10-09T10:48:43.260Z"},"retrieval":{"metadata":{"checkout":"/private/var/folders/6_/pc0hwbg54xsgfstv9nwq5qpc0000gn/T/xmd-wfc2-205d3ec6-7279-421d-8b59-a331a01243f2/repository","commit":"9cb35c5de81a9138c48b6e0575d226853109d7f5","kind":"local-checkout","objectFormat":"sha1","version":1},"revision":1,"updatedAt":"2026-10-09T10:48:43.145Z"},"executions":[{"executionId":"98ff4f7c-d71a-44d8-a151-b66b59a4c84b","startedAt":"2026-10-09T10:48:43.148Z","stoppedAt":"2026-10-09T10:48:43.260Z","stopStatus":"completed"}],"journalFrontier":{"eventId":"2eb28e1a-0988-415b-834a-5442f627c839","workspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"},"currentWorkspaceRootId":"41fb0579b42ad63c0137033d5006fe5411295e9c2b08081aec90dc6fdda4bb30"} -No workflow run is stored under the run id "release-1". Start the run before looking it up. ------ post-test output end ----- - WFC2-3: delete removes the run and says what went ... ok (4s) - WFC2-4: an absent run is refused by both, and nothing is created ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -No workflow run is stored under the run id "never-started". Start the run before looking it up. -No workflow run is stored under the run id "never-started". Start the run before looking it up. ------ post-test output end ----- - WFC2-4: an absent run is refused by both, and nothing is created ... ok (1s) -Tier WFC2 — xmd workflow cancel and delete ... ok (12s) -Tier WFC3 — cancelling a run that is settling into a suspension ... - WFC3-1: refuses against the live lock, changes nothing, and settlement continues ... -------- post-test output ------- -e0aca5625f85532c6fbc1b4b62f45c1ce235373f -workflow run: 8f45c269-9abf-445d-b95c-cc7f37cc87ef -workflow suspension: 6a23f0e26a6bb42e3e2cd6599790bbc2 -workflow status: suspended ------ post-test output end ----- - WFC3-1: refuses against the live lock, changes nothing, and settlement continues ... ok (215ms) - WFC3-2: an attachment that fails to release settles failed, never suspended ... -------- post-test output ------- -e0aca5625f85532c6fbc1b4b62f45c1ce235373f -workflow run: 6274e44a-f5e5-41c3-b4d7-b64b18629d96 -PLANTED-ATTACHMENT-RELEASE-FAILURE -workflow status: failed ------ post-test output end ----- - WFC3-2: an attachment that fails to release settles failed, never suspended ... ok (176ms) -Tier WFC3 — cancelling a run that is settling into a suspension ... ok (392ms) -running 2 tests from ./packages/cli/tests/workflow-retention.test.ts -Tier FG — workflow retention ... - FG22: a workflow run retains its process results without naming a journal ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: retention-run -to-outto-err# Prints - -workflow status: completed ------ post-test output end ----- - FG22: a workflow run retains its process results without naming a journal ... ok (1s) -Tier FG — workflow retention ... ok (1s) -Tier FG — retained source ... - FG40: an edited, moved or deleted original changes nothing about the run ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: retained-edited -retained-output# Retained - -this line is the retained source - -workflow status: completed -workflow run: retained-edited -# Retained - -this line is the retained source - -workflow status: completed -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: retained-moved -retained-output# Retained - -this line is the retained source - -workflow status: completed -workflow run: retained-moved -# Retained - -this line is the retained source - -workflow status: completed -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: retained-deleted -retained-output# Retained - -this line is the retained source - -workflow status: completed -workflow run: retained-deleted -# Retained - -this line is the retained source - -workflow status: completed ------ post-test output end ----- - FG40: an edited, moved or deleted original changes nothing about the run ... ok (7s) - FG43: a damaged retained source refuses, and never falls back to the file ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: fallback-1 -retained-output# Retained - -this line is the retained source - -workflow status: completed -This workflow run's retained source bundle disagrees with its own descriptor: a retained source is not the content it names. No partial source is returned and the run is left unchanged. ------ post-test output end ----- - FG43: a damaged retained source refuses, and never falls back to the file ... ok (2s) - FG42: another entrypoint, or other bytes, is another run and conflicts ... -------- post-test output ------- -Download https://registry.npmjs.org/effection -Download https://registry.npmjs.org/@effectionx%2fmiddleware -Download https://registry.npmjs.org/@effectionx%2fstream-helpers -Download https://registry.npmjs.org/@effectionx%2fprocess -Download https://registry.npmjs.org/configliere -Download https://registry.npmjs.org/zod -Download https://registry.npmjs.org/@effectionx%2ftimebox -Download https://registry.npmjs.org/@effectionx%2fcontext-api -Download https://registry.npmjs.org/@effectionx%2ffetch -Download https://registry.npmjs.org/@effectionx%2ffs -Download https://registry.npmjs.org/@effectionx%2fnode -Download https://registry.npmjs.org/remend -Download https://registry.npmjs.org/@effectionx%2fscope-eval -Download https://registry.npmjs.org/acorn -Download https://registry.npmjs.org/magic-string -Download https://registry.npmjs.org/marked -Download https://registry.npmjs.org/marked-terminal -Download https://registry.npmjs.org/remark -Download https://registry.npmjs.org/mdast-util-to-string -Download https://registry.npmjs.org/gray-matter -Download https://registry.npmjs.org/@effectionx%2fconverge -Download https://registry.npmjs.org/unist-util-select -Download https://registry.npmjs.org/ajv -Download https://registry.npmjs.org/@secretlint%2fsecretlint-rule-preset-recommend -Download https://registry.npmjs.org/semver -Download https://registry.npmjs.org/@durable-streams%2fclient -Download https://registry.npmjs.org/@secretlint%2fprofiler -Download https://registry.npmjs.org/@secretlint%2fcore -Download https://registry.npmjs.org/@bomb.sh%2ftty -Download https://registry.npmjs.org/@agentclientprotocol%2fsdk -Download https://registry.npmjs.org/remark-rehype -Download https://registry.npmjs.org/rehype-sanitize -Download https://registry.npmjs.org/rehype-stringify -Download https://registry.npmjs.org/@rjsf%2fvalidator-ajv8 -Download https://registry.npmjs.org/esbuild-wasm -workflow run: named-1 -retained-output# Retained - -this line is the retained source - -workflow status: completed -The workflow run "named-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. -fatal: not a git repository (or any of the parent directories): .git -The workflow run "named-1" is already stored with a different definition. Immutable identity cannot be replaced by reusing a run id: start a new run instead. ------ post-test output end ----- - FG42: another entrypoint, or other bytes, is another run and conflicts ... ok (3s) -Tier FG — retained source ... ok (12s) -running 3 tests from ./packages/cli/tests/workflow-suspension.test.ts -Tier WFS — a suspended run and its no-input resumes ... - WFS1: suspends, exits 2, releases the lock, and resumes into the same wait ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b -workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 -workflow status: suspended -workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b -workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 -workflow status: suspended -workflow run: a3f06e3f-ff5c-4336-ae45-cae5aff7ff9b -workflow suspension: 61a2dc328ddc5ca2212f1a22cbd09cf1 -workflow status: suspended ------ post-test output end ----- - WFS1: suspends, exits 2, releases the lock, and resumes into the same wait ... ok (264ms) - WFS2: a run that never waits is unchanged by the suspension controller ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -workflow run: 8fd64caa-097a-440d-811a-d10120a35265 -workflow status: completed -workflow run: 8fd64caa-097a-440d-811a-d10120a35265 -workflow status: completed ------ post-test output end ----- - WFS2: a run that never waits is unchanged by the suspension controller ... ok (195ms) - WFS4: a delivery retains a value, changes nothing else, and a resume spends it ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -workflow run: a34186e4-7b8d-42c5-96b5-e285545f1b58 -workflow suspension: cfdcc7bd22aaee2e4c274d6643511321 -workflow status: suspended -workflow run: a34186e4-7b8d-42c5-96b5-e285545f1b58 -workflow status: completed ------ post-test output end ----- - WFS4: a delivery retains a value, changes nothing else, and a resume spends it ... ok (218ms) - WFS5: a delivery does not take the executor lock, and a wrong wait is refused ... -------- post-test output ------- -947000f5b6b77abe20d41bf2e8a3076952632743 -workflow run: b7475ae0-b372-49db-a854-38b056f6f148 -workflow suspension: a7bc692c1dc8dea67dcae8041167a402 -workflow status: suspended ------ post-test output end ----- - WFS5: a delivery does not take the executor lock, and a wrong wait is refused ... ok (196ms) - WFS3: an ordinary execution outside a workflow run is unaffected ... ok (16ms) -Tier WFS — a suspended run and its no-input resumes ... ok (895ms) -Tier CKX — a checkpoint a document asked for ... - CK1: a real start suspends, reports its identifiers, and releases the lock ... -------- post-test output ------- -924b8330998e936c0b508ed0770169ac3e838f8b ------ post-test output end ----- - CK1: a real start suspends, reports its identifiers, and releases the lock ... ok (239ms) - CK3/CK4: a delivery executes nothing, and a resume repeats no committed effect ... -------- post-test output ------- -924b8330998e936c0b508ed0770169ac3e838f8b ------ post-test output end ----- - CK3/CK4: a delivery executes nothing, and a resume repeats no committed effect ... ok (273ms) - CK5: an invalid and a duplicate delivery are refused, byte for byte ... -------- post-test output ------- -924b8330998e936c0b508ed0770169ac3e838f8b ------ post-test output end ----- - CK5: an invalid and a duplicate delivery are refused, byte for byte ... ok (232ms) -Tier CKX — a checkpoint a document asked for ... ok (744ms) -Tier WGAC — generated effects in a bundled component resume through a later wait ... - WGAC16: a generated read inside a bundled component resumes through the later wait ... -------- post-test output ------- -48aadd41a081f55c6bbf83826e55575ed33c0f81 -b8c10cb98dcc036d8f1f70e53542dda4fa70ba1f ------ post-test output end ----- - WGAC16: a generated read inside a bundled component resumes through the later wait ... ok (333ms) - WGAC16: a generated write inside a bundled component resumes through the later wait ... -------- post-test output ------- -7157374928496bf7036f0a0f2abc35bd649de3e0 -dcf70a8012c31d961bcfeb7e9496986bed11c9c3 ------ post-test output end ----- - WGAC16: a generated write inside a bundled component resumes through the later wait ... ok (322ms) - WGAC17: the current admission executes Dir, resumes, and publishes nothing further ... -------- post-test output ------- -7157374928496bf7036f0a0f2abc35bd649de3e0 -280f23b4058010992a008da95058e246eb5fc270 ------ post-test output end ----- - WGAC17: the current admission executes Dir, resumes, and publishes nothing further ... ok (319ms) - WGAC17: a continuation retaining the former Dir identity refuses before generated execution and mutation ... -------- post-test output ------- -7157374928496bf7036f0a0f2abc35bd649de3e0 -d60a46e4ea456c8fc590be09440b9b92989e5e34 ------ post-test output end ----- - WGAC17: a continuation retaining the former Dir identity refuses before generated execution and mutation ... ok (316ms) -Tier WGAC — generated effects in a bundled component resume through a later wait ... ok (1s) - -ok | 290 passed (1423 steps) | 0 failed (18m24s) - diff --git a/.controls.json b/.controls.json deleted file mode 100644 index ec05793cb..000000000 --- a/.controls.json +++ /dev/null @@ -1,199 +0,0 @@ -[ - { - "id": "K1-rails", - "says": "remove the rails", - "file": "packages/cli/src/repl/source-reading.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (60ms)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "restored": true - }, - { - "id": "K2-badges", - "says": "remove the lifecycle glyphs and words", - "file": "packages/cli/src/repl/source-reading.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts", - "packages/cli/tests/repl-presentation-style.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 12 passed (65 steps) | 1 failed (9 steps) (1s)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "restored": true - }, - { - "id": "K3-appended", - "says": "append the generated source instead of replacing the producer", - "file": "packages/cli/src/repl/source-reading.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (61ms)", - "firstFailure": "error: Error: expect(received).not.toContain(expected) // indexOf", - "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "restored": true - }, - { - "id": "K4-clipped", - "says": "clip the last wrapped row instead of keeping it", - "file": "packages/cli/src/repl/fitting.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts", - "packages/cli/tests/repl-presentation-style.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 11 passed (67 steps) | 2 failed (7 steps) (1s)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", - "bytesAfter": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", - "restored": true - }, - { - "id": "K5-rescued", - "says": "rescue a caught canonical failure instead of reporting it", - "file": "packages/core/src/component-expansion.ts", - "suites": [ - "packages/core/tests/component-expansion.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (21 steps) | 1 failed (3 steps) (218ms)", - "firstFailure": "error: Error: expect(received).toContain(expected) // indexOf", - "bytesBefore": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", - "bytesAfter": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", - "restored": true - }, - { - "id": "K6-unheld", - "says": "let a pending permission request count no wait", - "file": "packages/cli/src/repl/agent.ts", - "suites": [ - "packages/cli/tests/repl-agent-execution.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 12 passed (42 steps) | 1 failed (2 steps) (1s)", - "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", - "bytesBefore": "1a0102d6abe95a8f722e7e9dd31bc0dd5527992423410ba74af9282ec933ef54", - "bytesAfter": "1a0102d6abe95a8f722e7e9dd31bc0dd5527992423410ba74af9282ec933ef54", - "restored": true - }, - { - "id": "K7-collapsed", - "says": "read only the last call of a repeated element", - "file": "packages/cli/src/repl/source-reading.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (59ms)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "bytesAfter": "c1c4dc763817a6be8aabc049ccec1201f0130de7afee32a712139ac5263f184d", - "restored": true - }, - { - "id": "K8-unindented", - "says": "start a continuation at the margin instead of its own column", - "file": "packages/cli/src/repl/fitting.ts", - "suites": [ - "packages/cli/tests/repl-source-reading.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (34 steps) | 1 failed (2 steps) (61ms)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", - "bytesAfter": "1c2e64ac3b2ee281faca23ed8820019a517fde064c17a6e82c0fe57ef7cd8be3", - "restored": true - }, - { - "id": "K9-early-liveness", - "says": "say the entry is not live before releasing what it held", - "file": "packages/cli/src/repl/session.ts", - "suites": [ - "packages/cli/tests/repl-lifecycle.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (7 steps) | 1 failed (1 step) (251ms)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", - "bytesAfter": "59e98dc43ef620ef744da1b7fc04d7ebebe5d5ce9c993497bcb02080db23497d", - "restored": true - }, - { - "id": "K10-narrow-empty", - "says": "route a narrow frame to Entries and show it no reading", - "file": "packages/cli/src/repl/application.ts", - "suites": [ - "packages/cli/tests/repl-entries.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 18 passed (64 steps) | 1 failed (1 step) (1s)", - "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", - "bytesBefore": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", - "bytesAfter": "a3a60a20cfec80d467ac009f36dd01aad9f259205551f6c291597b0444207d36", - "restored": true - }, - { - "id": "K11-foreign", - "says": "let a terminal carry a request its invocation did not issue (R1)", - "file": "packages/core/src/component-api.ts", - "suites": [ - "packages/core/tests/component-expansion.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (23 steps) | 1 failed (1 step) (213ms)", - "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", - "bytesBefore": "8711622e0622d342b960d2bc4c60e4a7d984cea91ebec01cb285dde4e99f2e55", - "bytesAfter": "8711622e0622d342b960d2bc4c60e4a7d984cea91ebec01cb285dde4e99f2e55", - "restored": true - }, - { - "id": "K12-mutable-phase", - "says": "publish a phase a reader can rewrite (R3)", - "file": "packages/core/src/component-expansion.ts", - "suites": [ - "packages/core/tests/component-expansion.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (23 steps) | 1 failed (1 step) (214ms)", - "firstFailure": "error: Error: expect(received).toBe(expected) // Object.is equality", - "bytesBefore": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", - "bytesAfter": "d1d428c5ff52d4a8044b5c0d45736023d49a9fd9a22a3175e21fa0f5b8f70f0f", - "restored": true - }, - { - "id": "K13-envelope", - "says": "let the lexical envelope disagree with the extractor (R2)", - "file": "packages/core/src/source-inspection.ts", - "suites": [ - "packages/core/tests/source-inspection.test.ts" - ], - "outcome": "BROKEN", - "exit": 1, - "summary": "FAILED | 0 passed (12 steps) | 1 failed (1 step) (17ms)", - "firstFailure": "error: Error: expect(received).toEqual(expected) // deep equality", - "bytesBefore": "e6978c0d5ee73b2c1e94c9f2212bca067b32e7d64b1e55fb4bc50657b1d3064a", - "bytesAfter": "e6978c0d5ee73b2c1e94c9f2212bca067b32e7d64b1e55fb4bc50657b1d3064a", - "restored": true - } -] diff --git a/.gitignore b/.gitignore index c0c861c5c..df86be375 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,10 @@ packages/web/generated/ # that walked one would report on a file nobody wrote. site/*.timestamp-*.mjs .bench/ + +# Session scratch: a test log and the break-control record are evidence, and +# evidence belongs under .reviewer/ rather than in the product commit. +.cliall.log +.cli.log +.controls.json +.controls.py diff --git a/packages/cli/tests/repl-source-reading.test.ts b/packages/cli/tests/repl-source-reading.test.ts index 6a484ccaa..5e9b86718 100644 --- a/packages/cli/tests/repl-source-reading.test.ts +++ b/packages/cli/tests/repl-source-reading.test.ts @@ -825,6 +825,39 @@ describe("the reading one entry is shown as", () => { expect(reading.source.lines.filter((one) => one.text.includes(" + withRenderer(function* (renderer) { + // The gap K1 found. Every other case here reads `line.rail`, which is + // the model's answer; none of them asked whether a rail reaches the + // row. Removing it from the composed runs broke nothing, so a reading + // could have lost its rails entirely and every test would have passed. + const source = '\n Ask.\n\n'; + const reading = entryReading({ + entry: entryOf(source), + lifecycle: observing([{ position: at(0), phase: "active" }]), + live: "", + inspected: false, + }); + const prepared = yield* prepareReading(renderer, WIDE, reading.source.lines, 72); + expect(prepared.ok).toBe(true); + if (!prepared.ok) { + return; + } + expect(prepared.value.rows.length).toBeGreaterThan(0); + for (const row of prepared.value.rows) { + const runs = readingRuns(prepared.value, row); + // It is the first thing in the row, it is the rail glyph, and it is + // drawn under the rail role that says which region the row is in. + expect([row.key, runs[0].text]).toEqual([row.key, "\u2502"]); + expect([row.key, runs[0].token]).toEqual([row.key, row.rail]); + expect([row.key, runText(runs).startsWith("\u2502")]).toEqual([row.key, true]); + } + // And the observed region's rail really is the observed one, so this is + // not satisfied by painting every row the same. + const observed = prepared.value.rows.filter((one) => one.rail === "rail-active"); + expect(observed.length).toBeGreaterThan(0); + })); + it("aligns every badge at the same measured column", () => withRenderer(function* (renderer) { const source = '\n\n'; From ea95ccabfca6573410af9b459d7afb34c3dd103c Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 11:41:17 -0400 Subject: [PATCH 15/19] =?UTF-8?q?=F0=9F=90=9B=20R4:=20wrap=20a=20question'?= =?UTF-8?q?s=20preview,=20so=20its=20tail=20is=20somewhere=20to=20scroll?= =?UTF-8?q?=20to?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The re-review closed R1–R3 and found one blocking defect left. A question's message was split at its newlines and each logical line became one drawer row. A drawer row is one row — so a long line had nowhere to put its tail, and scrolling could only ever reveal rows that were prepared. At 72×20 the README confirmation showed `"summary": "A lightweight workspace for coordinati` and no continuation. Approve was still reachable, which is why reaching the controls never caught it. The preview is now fitted by the same engine-measured wrapping the reading uses, at the drawer's own width, in `prepareFrame` beside it. Its rows are what the description places, what the window counts and what a scroll moves through. `fitPlain` is the reading's cutting without the rail and status reservation: read-only text in a box uses all of the box. `drawerContentRows` is deleted. The review cited it as counting logical lines, which it did — and nothing called it. A dead function stating a rule the product no longer follows is worse than no function. The regression took two corrections worth keeping. Asserting on description labels proved nothing: the label always held the whole line, and the loss happened at the row. Asserting that the decisions stay reachable proved nothing either — the reviewed build satisfied that. What discriminates is that no message row is wider than the drawer it was measured for, together with every logical line being recoverable from the rows it was cut into. K14 restores one row per logical line and fails on `drawer:message:4` overflowing. Fifteen controls, all breaking and restoring byte-identically. Core 53 / 414, CLI 94 / 315, supplemental 14 / 52, all exit 0. --- packages/cli/src/repl/application.ts | 82 ++++++----- packages/cli/src/repl/fitting.ts | 72 ++++++++++ packages/cli/src/repl/program.ts | 31 ++++- .../cli/tests/fixtures/repl/presentation.ts | 5 +- packages/cli/tests/repl-forms.test.ts | 128 ++++++++++++++++++ specs/repl-spec.md | 5 + 6 files changed, 285 insertions(+), 38 deletions(-) diff --git a/packages/cli/src/repl/application.ts b/packages/cli/src/repl/application.ts index c9a6e31dc..99ae90ba6 100644 --- a/packages/cli/src/repl/application.ts +++ b/packages/cli/src/repl/application.ts @@ -85,7 +85,7 @@ import { jsonRuns, sourceRuns } from "./presentation-text.ts"; import { entryReading, NO_READING } from "./source-reading.ts"; import type { ReplReading } from "./source-reading.ts"; import { readingRuns } from "./fitting.ts"; -import type { ReplPreparedReading, ReplPreparedRow } from "./fitting.ts"; +import type { ReplFittedLine, ReplPreparedReading, ReplPreparedRow } from "./fitting.ts"; import type { ReplTerminalSize } from "./terminal.ts"; import { decodeLocation, @@ -3170,7 +3170,7 @@ function drawerFor( exit: Described, drawable: boolean, ): { readonly drawer: Described; readonly rows: readonly Described[] } | undefined { - const held = drawerContent(view, context.widths?.drawer ?? 0); + const held = drawerContent(view, context.widths?.drawer ?? 0, context.preview); if (held === undefined) { return undefined; } @@ -3261,7 +3261,35 @@ interface DrawerContent { * many rows there are to window. A second counter is how a clamp comes to * disagree with the list it is clamping. */ -function drawerContent(view: ReplView, width: number): DrawerContent | undefined { +/** + * The rows a question's message is read in. + * + * The frame's fitted rows where it prepared them, and the logical lines where + * it has not — the pass that measures the drawer's width cannot already have + * fitted text to it. An unfitted pass describes no window content anyway, so + * the fallback is what a measurement sees and never what a reader does. + */ +function messageRows( + question: ReplQuestion, + preview: readonly ReplFittedLine[] | undefined, +): readonly { readonly text: string; readonly runs: readonly ReplTokenRun[] }[] { + if (preview !== undefined) { + return preview.map((one) => ({ + text: " ".repeat(one.indent) + one.text, + runs: + one.indent === 0 + ? one.runs + : tokenRuns([{ text: " ".repeat(one.indent), token: "punctuation" }, ...one.runs]), + })); + } + return question.message.split("\n").map((text) => ({ text, runs: sourceRuns(text) })); +} + +function drawerContent( + view: ReplView, + width: number, + preview?: readonly ReplFittedLine[] | undefined, +): DrawerContent | undefined { const open = view.selection.drawers[view.selection.drawers.length - 1]; if (open === undefined) { return undefined; @@ -3383,14 +3411,14 @@ function drawerContent(view: ReplView, width: number): DrawerContent | undefined // [submit] — is built in order and then windowed. A drawer too short to hold // all of it scrolls, rather than describing rows that have no frame to be // placed in. - for (const [offset, text] of question.message.split("\n").entries()) { + for (const [offset, part] of messageRows(question, preview).entries()) { content.push({ described: drawerLine( `drawer:message:${offset}`, - text, + part.text, width, styleOf("source"), - sourceRuns(text), + part.runs, ), }); } @@ -3648,30 +3676,6 @@ function lasting(kind: ReplLiveChoice["kind"]): string { return kind === "allow_always" || kind === "reject_always" ? " for this Agent session" : ""; } -/** - * How many rows the drawer's ordered content holds in total. - * - * The complete message, the form's description, every field with its - * annotation, enum summary, offered values and editable line, every validation - * message, and `[submit]`. Counted the same way the rows are built, because the - * reducer clamps a scroll against this before any of them exist. - */ -function drawerContentRows(question: ReplQuestion | undefined, form: ReplFormState): number { - if (question === undefined) { - return 0; - } - let rows = question.message.split("\n").length; - rows += question.form.description === undefined ? 0 : 1; - for (const one of question.form.fields) { - rows += 2; - rows += one.description === undefined ? 0 : 1; - rows += one.choices === undefined ? 0 : 1 + one.choices.length; - } - rows += form.messages.length; - // [submit] scrolls with the form it submits. - return rows + 1; -} - /** The first line of a message, for a control that is one row tall. */ /** * One drawer's title: what kind of reading it is, and which one. @@ -4113,6 +4117,15 @@ export interface ReplPresentationContext { * which is why it describes none. */ readonly reading: ReplPreparedReading | undefined; + /** + * The open question's message, fitted to the drawer's own width. + * + * Prepared beside the reading and for the same reason: a drawer row is one + * row, so a long line of somebody's preview can only be shown whole if it + * was cut into rows before the window counted them. Scrolling reveals + * prepared rows; it cannot recover the rest of an unprepared one. + */ + readonly preview: readonly ReplFittedLine[] | undefined; } /** One reading's descriptions, paired with where the engine places them. */ @@ -4828,9 +4841,11 @@ export function admissionFor(input: { readonly widths: ReplMeasuredWidths; /** The reading this frame fitted, which is what its window admits rows of. */ readonly reading?: ReplPreparedReading | undefined; + /** The open question's message, fitted, which its own window admits rows of. */ + readonly preview?: readonly ReplFittedLine[] | undefined; readonly boundsOf: (id: string) => ReplBounds | undefined; }): ReplAdmission { - const { view, manifest, widths, reading, boundsOf } = input; + const { view, manifest, widths, reading, preview, boundsOf } = input; const windows = new Map(); for (const slot of manifest.viewports) { const capacity = capacityOf(boundsOf(slot.id)); @@ -4838,7 +4853,7 @@ export function admissionFor(input: { slot.window, admitRows({ offset: offsetFor(view, slot.window, capacity), - total: totalOf(view, widths, reading, slot.window), + total: totalOf(view, widths, reading, preview, slot.window), capacity, }), ); @@ -4919,6 +4934,7 @@ function totalOf( view: ReplView, widths: ReplMeasuredWidths, reading: ReplPreparedReading | undefined, + preview: readonly ReplFittedLine[] | undefined, window: string, ): number { if (window === SESSIONS_WINDOW) { @@ -4933,7 +4949,7 @@ function totalOf( if (window === READING_WINDOW) { return reading?.rows.length ?? 0; } - return drawerContent(view, widths?.drawer ?? 0)?.content.length ?? 0; + return drawerContent(view, widths?.drawer ?? 0, preview)?.content.length ?? 0; } export { HISTORY_ROWS }; diff --git a/packages/cli/src/repl/fitting.ts b/packages/cli/src/repl/fitting.ts index d26575cef..7777f6f1e 100644 --- a/packages/cli/src/repl/fitting.ts +++ b/packages/cli/src/repl/fitting.ts @@ -262,6 +262,78 @@ export function* prepareReading( return Ok(Object.freeze({ reservation, rows: Object.freeze(rows) })); } +/** One line of read-only text, fitted to a width. */ +export interface ReplFittedLine { + readonly key: string; + readonly text: string; + readonly runs: readonly ReplTokenRun[]; + /** Whether a previous row already carried the start of this line. */ + readonly continuation: boolean; + /** The column this line was written at, carried onto its continuations. */ + readonly indent: number; +} + +/** + * Fit read-only text to a width, with nothing reserved beside it. + * + * The reading's own `prepareReading` reserves a rail and a status column + * because every row of it carries both. A drawer's message carries neither: it + * is somebody's text in a box, and all of the box is for the text. + * + * The same measurement and the same cuts otherwise — engine widths, grapheme + * boundaries, word boundaries preferred, whitespace kept, blank lines kept — + * so concatenating one line's rows recovers exactly the line. A drawer that + * showed one row per logical line could only ever show the first screenful of + * a long one, and scrolling cannot reveal a row that was never prepared. + */ +export function* fitPlain( + renderer: ReplRenderer, + size: ReplTerminalSize, + lines: readonly { + readonly key: string; + readonly text: string; + readonly runs?: readonly ReplTokenRun[]; + }[], + room: number, +): Operation> { + if (room < 1) { + return Ok([]); + } + const fitted: ReplFittedLine[] = []; + for (const one of lines) { + const runs = one.runs ?? tokenRuns([{ text: one.text, token: "source" }]); + const rows = yield* fitLine( + renderer, + size, + Object.freeze({ + key: one.key, + text: one.text, + runs, + rail: "rail-pending" as const, + depth: 0, + badge: undefined, + style: Object.freeze({ role: "source" as const, selected: false, inspected: false }), + }), + room, + ); + if (!rows.ok) { + return rows; + } + for (const row of rows.value) { + fitted.push( + Object.freeze({ + key: row.key, + text: row.text, + runs: row.runs, + continuation: row.continuation, + indent: row.indent, + }), + ); + } + } + return Ok(Object.freeze(fitted)); +} + /** One logical line as its rows. */ function* fitLine( renderer: ReplRenderer, diff --git a/packages/cli/src/repl/program.ts b/packages/cli/src/repl/program.ts index baad4822a..efe4c0183 100644 --- a/packages/cli/src/repl/program.ts +++ b/packages/cli/src/repl/program.ts @@ -83,8 +83,9 @@ import type { ReplSession } from "./session.ts"; import { useReplFrames } from "./frame.ts"; import type { ReplFrames } from "./frame.ts"; import { committedOps, flatten, profileFor, skeletonOps } from "./layout.ts"; -import { prepareReading } from "./fitting.ts"; +import { fitPlain, prepareReading } from "./fitting.ts"; import { readingLines } from "./source-reading.ts"; +import { sourceRuns } from "./presentation-text.ts"; import type { ReplBox, ReplLayoutManifest, ReplRegion } from "./layout.ts"; import { capacityOf, NOTHING_ADMITTED } from "./layout-admission.ts"; import type { ReplAdmission } from "./layout-admission.ts"; @@ -1367,9 +1368,10 @@ function measuringAt( entriesRows, capture: "capture", // The measuring pass describes no width-dependent text, so it has no - // fitted reading either: a reading prepared against a width this pass is - // still asking for would be a reading fitted to nothing. + // fitted reading or preview either: text prepared against a width this + // pass is still asking for would be text fitted to nothing. reading: undefined, + preview: undefined, }; } @@ -1440,11 +1442,33 @@ export function* prepareFrame( if (!reading.ok) { return reading; } + // The open question's message, fitted to the drawer's own width. Prepared + // here for the same reason the reading is: a drawer row is one row, so a + // long preview line is only reachable if it was cut into rows before the + // window counted them. + const asked = view.live.question; + const preview = + asked === undefined || widths.drawer < 1 + ? Ok(undefined) + : yield* fitPlain( + renderer, + view.size, + asked.message.split("\n").map((text, offset) => ({ + key: `message:${offset}`, + text, + runs: sourceRuns(text), + })), + widths.drawer, + ); + if (!preview.ok) { + return preview; + } const admission = admissionFor({ view, manifest: measured.manifest, widths, reading: reading.value, + preview: preview.value, boundsOf: (id: string) => third.value.boundsOf(id), }); const context: ReplPresentationContext = { @@ -1455,6 +1479,7 @@ export function* prepareFrame( entriesRows, capture: "capture", reading: reading.value, + preview: preview.value, }; return Ok({ context, admission, presentation: presentationFor(view, context) }); } diff --git a/packages/cli/tests/fixtures/repl/presentation.ts b/packages/cli/tests/fixtures/repl/presentation.ts index 1c60c3830..b548f658a 100644 --- a/packages/cli/tests/fixtures/repl/presentation.ts +++ b/packages/cli/tests/fixtures/repl/presentation.ts @@ -705,9 +705,10 @@ export function measuringContext(size: ReplTerminalSize): ReplPresentationContex entriesWindowed: false, entriesRows: undefined, capture: "capture", - // The measuring pass has no fitted reading, which is what makes it the pass - // that asks how wide the pane holding one is. + // The measuring pass has no fitted reading or preview, which is what makes + // it the pass that asks how wide the panes holding them are. reading: undefined, + preview: undefined, }; } diff --git a/packages/cli/tests/repl-forms.test.ts b/packages/cli/tests/repl-forms.test.ts index f25e2aa6b..7699f704e 100644 --- a/packages/cli/tests/repl-forms.test.ts +++ b/packages/cli/tests/repl-forms.test.ts @@ -867,6 +867,134 @@ describe("F3 — complete content and reachable navigation", () => { } }); + it("F3: a long preview line is readable to its last character at 72x20", function* () { + // R4. A drawer row is one row, so a message split only at its newlines + // puts a long line's tail nowhere: the window can scroll to rows that + // were prepared and cannot recover the rest of one that was not. The + // reviewed build lost `ng coding agents."` off the end of the README + // summary at this size, with Approve still reachable — so reaching the + // controls is not what discriminates this. + // + // Walked through the real tree, the real admission and the real scroll, + // concatenating what the drawer actually placed. + const summary = "A lightweight workspace for coordinating coding agents."; + const long = [ + "Proposed README.md:", + "", + "{", + ` "project": "Northstar",`, + ` "summary": "${summary}"`, + "}", + "", + ].join("\n"); + const asked = yield* askingFor(PLAN_SCHEMA, long); + const live = asking(asked.question); + const tree = yield* useReplTree(); + + let state = opened(live); + const rows: string[] = []; + const seenKeys = new Set(); + for (let press = 0; press < 160; press++) { + const view = reading(state, live, EMPTY_MODEL, NARROW, undefined); + for (const [key] of yield* placedKeys(tree, view)) { + if (key.startsWith("drawer:message:") && !seenKeys.has(key)) { + seenKeys.add(key); + } + } + for (const row of yield* framed(state, live)) { + if ( + row.key.startsWith("drawer:message:") && + !rows.includes(row.key + "\u0000" + row.label) + ) { + rows.push(row.key + "\u0000" + row.label); + } + } + const next = reduceRepl( + state, + { kind: "scroll", delta: 1 }, + EMPTY_MODEL, + live, + yield* admissionOf(state, live), + ).state; + if (next.form.offset === state.form.offset) { + break; + } + state = next; + } + + // Every row the drawer showed, in the order its keys number them. + // + // Compared with runs of whitespace collapsed, because the display adds + // two kinds of its own: `drawerLine` pads each row to the drawer's width, + // and a continuation is set in to the column its line was written at. + // Neither is content, and neither can be told from the content's own + // spaces in a drawn row — so the recovery rule is "every character, in + // order, up to the whitespace the display inserted". That is exactly the + // rule that catches the defect: a dropped tail is missing characters, not + // extra spaces. + const flat = (text: string): string => text.replace(/\s+/g, " ").trim(); + const whole = flat( + rows + .map((one) => one.split("\u0000")) + .sort((a, b) => Number(a[0].split(":")[2]) - Number(b[0].split(":")[2])) + .map(([, label]) => label) + .join(" "), + ); + + // The property that makes the text *drawable*, and the one the reviewed + // build failed. A description's label always held the whole line — the + // loss happened at the row, where a label wider than the drawer has + // nowhere to put its tail and the window has no second row to scroll to. + // So every message row must fit the width the drawer was measured at. + const room = + (yield* contextOf(reading(opened(live), live, EMPTY_MODEL, NARROW, undefined))).widths + ?.drawer ?? 0; + expect(room).toBeGreaterThan(0); + const overflowing = rows + .map((one) => one.split("\u0000")) + .filter(([, label]) => label.replace(/\s+$/, "").length > room); + expect(overflowing.map(([key]) => key)).toEqual([]); + // And there really are more rows than logical lines, so this is wrapping + // rather than a message that happened to be short enough. + expect(rows.length).toBeGreaterThan(long.split("\n").length); + + // The tail the reviewed build dropped. + expect(whole).toContain("ng coding agents."); + // And the value entire, with its closing quote. + expect(whole).toContain(flat(`"summary": "${summary}"`)); + // Every logical line is in there whole, so nothing was shortened and + // nothing was invented. + for (const line of long.split("\n").filter((one) => one.trim().length > 0)) { + expect([line, whole.includes(flat(line))]).toEqual([line, true]); + } + // The decisions are still reachable afterwards, which is the half the + // reviewed build already satisfied. + const reached = new Set(); + let at = opened(live); + for (let press = 0; press < 160; press++) { + for (const [key, targetable] of yield* placedKeys( + tree, + reading(at, live, EMPTY_MODEL, NARROW, undefined), + )) { + if (targetable) { + reached.add(key); + } + } + const next = reduceRepl( + at, + { kind: "scroll", delta: 1 }, + EMPTY_MODEL, + live, + yield* admissionOf(at, live), + ).state; + if (next.form.offset === at.form.offset) { + break; + } + at = next; + } + expect(reached.has("drawer:form:submit")).toBe(true); + }); + it("F3: the viewport walks the whole message before the form controls", function* () { const asked = yield* askingFor(PLAN_SCHEMA, DRAFT); const live = asking(asked.question); diff --git a/specs/repl-spec.md b/specs/repl-spec.md index dfbc057cc..3839c7164 100644 --- a/specs/repl-spec.md +++ b/specs/repl-spec.md @@ -694,6 +694,11 @@ counts, and the column is wide enough for every reading a badge can hold — including a cleanup wait, which says two things at once — so an element settling cannot reflow the document beside it. +A question's own read-only preview is measured the same way, at the width its +drawer was given. A drawer row is one row, so a line left unwrapped has nowhere +to put its tail and the window has no second row to scroll to — reaching the +decisions below it is not the same as having read what they decide. + A region with no room for even one grapheme is the frame refusal that already recovers on resize. It is never a clip: shortening somebody's source would be this screen editing the content it exists to show. From a49f2826eb051ed5046abbdf2bed00a3a38e3a5f Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 12:31:29 -0400 Subject: [PATCH 16/19] =?UTF-8?q?=E2=9C=85=20Check=20the=20badge=20alignme?= =?UTF-8?q?nt=20where=20it=20is=20drawn,=20not=20where=20it=20is=20compose?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-audit, prompted by the shape of what the reviews keep finding. Twice now a control was vacuous because the assertion behind it read the model where the claim was about the screen: K1 read `line.rail` and never asked whether a rail reached a row; K14's first draft read a description's label, which always held the whole line while the drawn row lost its tail. Badge alignment had the same shape. "All lifecycle glyphs/words align at the measured source pane's right inner edge" is a frozen requirement, and everything asserting it read the composed run strings — this terminal's own answer about itself. Nothing checked a cell. P1-T3 now commits a frame with one observed element and finds the row that actually says `● ACTIVE`: its last cell is the transcript interior's last cell, it is drawn in the archive's own literal for that phase, and the source beside it keeps its own colours. K15 shortens the pad by three columns and it fails at 121 instead of 124. Two fixture details the check needed, both real product behaviour: a fence is not an element the scanner reports, so observing at one matches nothing; and an occurrence whose position names no path is not matched to an entry's own source, which is what keeps another document's position from claiming a row here. The control runner now writes itself and its record into the review packet, so a stale copy cannot describe a different list than the one that ran — it did twice while I was adding to it. Sixteen controls, all breaking and restoring byte-identically. Core 53 / 414, CLI 94 / 316, supplemental 14 / 52, all exit 0. --- .../cli/tests/repl-presentation-style.test.ts | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/packages/cli/tests/repl-presentation-style.test.ts b/packages/cli/tests/repl-presentation-style.test.ts index 9a57082a6..deb9c598b 100644 --- a/packages/cli/tests/repl-presentation-style.test.ts +++ b/packages/cli/tests/repl-presentation-style.test.ts @@ -69,6 +69,7 @@ import { SEMANTIC, SURFACE, SYNTAX, + LIFECYCLE, } from "./fixtures/repl/reference-style.ts"; import type { ReplTerminalSize } from "../src/repl/terminal.ts"; import { @@ -124,6 +125,46 @@ const NOTHING_LIVE: ReplLive = Object.freeze({ lifecycle: NO_LIFECYCLE, }); +/** + * This process observing one element of the entry it is running. + * + * The lifecycle reading the session would publish, so a frame can be asked + * what an observed element's badge looks like where it actually lands. + */ +function observing( + entry: string, + name: string, + offset: number, + phase: "active", + path: string, +): ReplLive { + return Object.freeze({ + ...NOTHING_LIVE, + running: true, + pausable: true, + lifecycle: Object.freeze({ + entry, + occurrences: Object.freeze([ + Object.freeze({ + key: `${entry}#1`, + expansion: "x", + name, + parent: undefined, + position: Object.freeze({ + path, + generatedSource: undefined, + offset, + line: 1, + column: 1, + }), + phase, + waiting: Object.freeze([]), + }), + ]), + }), + }); +} + /** This process part-way through an entry: output on the overlay, nothing closed. */ function streaming(output: string): ReplLive { return Object.freeze({ ...NOTHING_LIVE, output, running: true, pausable: true }); @@ -1649,6 +1690,70 @@ describe("REPL presentation: focus marks the row without repainting it", () => { describe("REPL presentation: the surfaces a reading is drawn on", () => { beforeAll(() => useTempFileCompiler()); + it("P1-T3: an observed badge ends at the pane's right inner edge, in its own ink", function* () { + // The frozen requirement is that these align at the *measured source + // pane's right inner edge*. Everything asserting it so far has read the + // composed run strings, which is the model's answer — the same shape of + // claim that let a clipped drawer preview pass its own regression. This + // reads the cells. + // An entry whose source holds an element the scanner reports — a fence is + // not one, so observing at its offset would match nothing and prove + // nothing. + const source = '\n'; + const model = yield* scoped(function* () { + const physical = new InMemoryStream(); + yield* runEntry(physical, source); + return projected(yield* physical.readAll()); + }); + const entry = model.entries[0]; + const at = entry.source.indexOf(" key.startsWith("reading:")) + .map((key) => ({ key, bounds: observed.boundsOf(key) })) + .find((one) => one.bounds !== undefined && textOf(grid, one.bounds).includes(badge)); + if (carrying?.bounds === undefined) { + throw new Error( + `no reading row says ${badge}; they say ${observed.keys + .filter((key) => key.startsWith("reading:")) + .map((key) => textOf(grid, observed.boundsOf(key) ?? inside).trim()) + .join(" | ")}`, + ); + } + const row = textOf(grid, carrying.bounds); + const starts = row.indexOf(badge); + // Its last cell is the pane interior's last cell: right inner edge, in + // cells, not in a string this test composed for itself. + expect([carrying.key, carrying.bounds.x + starts + badge.length]).toEqual([ + carrying.key, + inside.x + inside.width, + ]); + // And it is drawn in the archive's own literal for that phase. + expect(inkOfSpan(grid, carrying.bounds, badge).foreground).toBe(LIFECYCLE.active.colour); + // The source beside it keeps its own colours, so the badge is not + // repainting the row it sits on. + expect(inkOfSpan(grid, carrying.bounds, "<").foreground).not.toBe(LIFECYCLE.active.colour); + }); + it("P1-T3: an empty screen's panes, edges and uncovered area are each their own", function* () { const model = yield* settledAndFailed(); const presenter = yield* usePresenter(WIDE); From 3815aef4eb72000c2c59f8b06a8e01ed8c9070b5 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 9 Oct 2026 13:24:23 -0400 Subject: [PATCH 17/19] =?UTF-8?q?=E2=9C=85=20Check=20the=20rails=20and=20t?= =?UTF-8?q?he=20one-badge=20rule=20in=20cells=20too?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Finishing the audit the last commit started. Three frozen visual claims were asserted against the model rather than the screen; one is now cells, and these are the other two. **Every reading row opens with its rail, in cells**, in the rail's own ink, with the observed region drawn in the archive's `active` literal so painting every row alike does not satisfy it. K1 checks the composed runs; nothing checked what the terminal drew. **Exactly one row says the badge.** "Only the first visual row carries each badge" is frozen: a second would say the phase changed between two halves of one element. K16 puts the badge on every row of its delimiter — and came back **UNBROKEN**, because the fixture's tag fitted on one row. A rule about continuation rows cannot be tested by an element that has none. The observed element is now long enough to wrap, and K16 fails. That is the third vacuous control this slice has produced, all the same shape: an assertion that cannot reach the thing it claims. K1 read the model where the claim was the screen, K14's first draft read a label where the loss was at the row, and K16 read a fixture that could not exhibit the defect. Each was found by making the control honest, never by reading the code. Seventeen controls, all breaking and restoring byte-identically. Core 53 / 414, CLI 94 / 316, supplemental 14 / 52, all exit 0. --- .../cli/tests/repl-presentation-style.test.ts | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/cli/tests/repl-presentation-style.test.ts b/packages/cli/tests/repl-presentation-style.test.ts index deb9c598b..e760cb22a 100644 --- a/packages/cli/tests/repl-presentation-style.test.ts +++ b/packages/cli/tests/repl-presentation-style.test.ts @@ -70,6 +70,7 @@ import { SURFACE, SYNTAX, LIFECYCLE, + RAIL, } from "./fixtures/repl/reference-style.ts"; import type { ReplTerminalSize } from "../src/repl/terminal.ts"; import { @@ -1699,7 +1700,10 @@ describe("REPL presentation: the surfaces a reading is drawn on", () => { // An entry whose source holds an element the scanner reports — a fence is // not one, so observing at its offset would match nothing and prove // nothing. - const source = '\n'; + // Long enough that its opening delimiter wraps: "only the first visual row + // carries each badge" says nothing about an element that fits on one row, + // and a check written against one cannot see a badge repeated. + const source = '\n'; const model = yield* scoped(function* () { const physical = new InMemoryStream(); yield* runEntry(physical, source); @@ -1752,6 +1756,47 @@ describe("REPL presentation: the surfaces a reading is drawn on", () => { // The source beside it keeps its own colours, so the badge is not // repainting the row it sits on. expect(inkOfSpan(grid, carrying.bounds, "<").foreground).not.toBe(LIFECYCLE.active.colour); + + // Exactly one row says it. "Only the first visual row carries each badge" + // is frozen, and a second one would say the phase changed between two + // halves of one element — counted in cells, because that is where a + // reader would see it twice. + const saying = observed.keys + .filter((key) => key.startsWith("reading:")) + .map((key) => observed.boundsOf(key)) + .filter((bounds) => bounds !== undefined && textOf(grid, bounds).includes(badge)); + expect(saying.length).toBe(1); + + // And every row of the reading opens with its rail, in cells. The rail is + // what says which region a row is in, so a reading drawn without one is a + // reading with its structure removed — and until now nothing asked the + // screen whether it was there. + const railed = observed.keys + .filter((key) => key.startsWith("reading:src:") || key.startsWith("reading:output:")) + .map((key) => ({ key, bounds: observed.boundsOf(key) })) + .filter((one) => one.bounds !== undefined); + expect(railed.length).toBeGreaterThan(0); + for (const one of railed) { + const bounds = one.bounds; + if (bounds === undefined) { + continue; + } + expect([one.key, grid.at(bounds.x, bounds.y)]).toEqual([one.key, "\u2502"]); + // In the rail's own ink, which for an observed region is not the + // unobserved one: a rail painted the same everywhere says nothing. + expect([one.key, grid.styleAt(bounds.x, bounds.y).foreground]).not.toEqual([ + one.key, + REPL_PALETTE.source, + ]); + } + // The observed region really is drawn in the archive's active rail, so + // this is not satisfied by painting every row alike. + const activeRail = railed.filter( + (one) => + one.bounds !== undefined && + grid.styleAt(one.bounds.x, one.bounds.y).foreground === RAIL.active, + ); + expect(activeRail.length).toBeGreaterThan(0); }); it("P1-T3: an empty screen's panes, edges and uncovered area are each their own", function* () { From a85c36cb2edc184055b9aa3e270ba1d70b20670f Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Sat, 10 Oct 2026 05:17:47 -0400 Subject: [PATCH 18/19] =?UTF-8?q?=F0=9F=9A=A8=20Drop=20the=20redundant=20s?= =?UTF-8?q?copes=20oxlint=20refuses=20in=20the=20lifecycle=20suite=20(#881?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli/tests/repl-lifecycle.test.ts | 266 ++++++++++------------ 1 file changed, 125 insertions(+), 141 deletions(-) diff --git a/packages/cli/tests/repl-lifecycle.test.ts b/packages/cli/tests/repl-lifecycle.test.ts index c04563e70..47a3da69a 100644 --- a/packages/cli/tests/repl-lifecycle.test.ts +++ b/packages/cli/tests/repl-lifecycle.test.ts @@ -76,110 +76,98 @@ describe("Tier L — the reading one entry leaves behind", () => { beforeAll(() => useTempFileCompiler()); it("L1: a repeated element is two calls, never one overwritten by the other", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - const watched = yield* watching(session); - accepted(yield* session.submit('\n\n\n')); - yield* session.join(); - yield* sleep(0); - - const seen = watched.calls("Json"); - expect(seen.length).toBe(2); - expect(new Set(seen.map((one) => one.key)).size).toBe(2); - // Both reached a terminal observation of their own. - expect(seen.map((one) => one.phase).sort()).toEqual(["settled", "settled"]); - }); + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n\n\n')); + yield* session.join(); + yield* sleep(0); + + const seen = watched.calls("Json"); + expect(seen.length).toBe(2); + expect(new Set(seen.map((one) => one.key)).size).toBe(2); + // Both reached a terminal observation of their own. + expect(seen.map((one) => one.phase).sort()).toEqual(["settled", "settled"]); }); it("L1: a nested element is a child of the call that reached it", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - const watched = yield* watching(session); - accepted(yield* session.submit('\n')); - yield* session.join(); - yield* sleep(0); - - const outer = watched.calls("Each"); - const inner = watched.calls("Json"); - expect(outer.length).toBe(1); - expect(inner.length).toBe(2); - // Each iteration's element names the call it was reached through, and - // the two iterations are separate calls rather than one id twice. - for (const one of inner) { - expect(one.parent).toBe(outer[0].key); - } - expect(new Set(inner.map((one) => one.key)).size).toBe(2); - }); + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + const outer = watched.calls("Each"); + const inner = watched.calls("Json"); + expect(outer.length).toBe(1); + expect(inner.length).toBe(2); + // Each iteration's element names the call it was reached through, and + // the two iterations are separate calls rather than one id twice. + for (const one of inner) { + expect(one.parent).toBe(outer[0].key); + } + expect(new Set(inner.map((one) => one.key)).size).toBe(2); }); it("L2: an element waiting on a question says so, and stops when it is answered", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - accepted( - yield* session.submit( - 'Answer this.\n', - ), - ); - // Several turns: the phases a consumer is told travel through its own - // queue, and the question itself is published from inside the element. - for (let turn = 0; turn < 5; turn += 1) { - yield* sleep(0); - } - - const waiting = session.lifecycle.occurrences.filter((one) => one.waiting.length > 0); - // The element that is waiting, what it is waiting on, and that it is - // the only one: a session-wide "busy" would name every element here. - expect( - session.lifecycle.occurrences.map( - (one) => `${one.name}:${one.phase}:${one.waiting.join()}`, - ), - ).toEqual(["Elicit:active:question"]); - expect(waiting.map((one) => one.name)).toEqual(["Elicit"]); - - const question = session.elicitation.pending; - if (question === undefined) { - throw new Error("this session is waiting on no question"); - } - question.submit({ note: "answered" }); - yield* session.join(); + const session = opened(yield* openReplSession({ execution: execution() })); + accepted( + yield* session.submit( + 'Answer this.\n', + ), + ); + // Several turns: the phases a consumer is told travel through its own + // queue, and the question itself is published from inside the element. + for (let turn = 0; turn < 5; turn += 1) { yield* sleep(0); - // The entry closed, so its reading went with it. - expect(session.lifecycle.occurrences).toEqual([]); - expect(session.live).toBe(false); - }); + } + + const waiting = session.lifecycle.occurrences.filter((one) => one.waiting.length > 0); + // The element that is waiting, what it is waiting on, and that it is + // the only one: a session-wide "busy" would name every element here. + expect( + session.lifecycle.occurrences.map((one) => `${one.name}:${one.phase}:${one.waiting.join()}`), + ).toEqual(["Elicit:active:question"]); + expect(waiting.map((one) => one.name)).toEqual(["Elicit"]); + + const question = session.elicitation.pending; + if (question === undefined) { + throw new Error("this session is waiting on no question"); + } + question.submit({ note: "answered" }); + yield* session.join(); + yield* sleep(0); + // The entry closed, so its reading went with it. + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.live).toBe(false); }); it("L2: ordinary work is not a wait", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - const watched = yield* watching(session); - accepted(yield* session.submit('\n')); - yield* session.join(); - yield* sleep(0); - - const waited = watched.readings.flatMap((reading) => - reading.occurrences.filter((one) => one.waiting.length > 0), - ); - expect(waited).toEqual([]); - }); + const session = opened(yield* openReplSession({ execution: execution() })); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + const waited = watched.readings.flatMap((reading) => + reading.occurrences.filter((one) => one.waiting.length > 0), + ); + expect(waited).toEqual([]); }); it("L3: an entry that closes takes its reading, and says it is no longer live", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - accepted(yield* session.submit('\n')); - yield* session.join(); - yield* sleep(0); - - expect(session.lifecycle.entry).toBe(undefined); - expect(session.lifecycle.occurrences).toEqual([]); - expect(session.live).toBe(false); - // The entry really ran: the reading going is the reading going, not the - // work never having happened. - expect(session.model.entries.length).toBe(1); - expect(session.model.entries[0]?.terminal?.status).toBe("ok"); - }); + const session = opened(yield* openReplSession({ execution: execution() })); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + expect(session.lifecycle.entry).toBe(undefined); + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.live).toBe(false); + // The entry really ran: the reading going is the reading going, not the + // work never having happened. + expect(session.model.entries.length).toBe(1); + expect(session.model.entries[0]?.terminal?.status).toBe("ok"); }); it("L3: everything this entry held is released before the session says it is not live", function* () { @@ -190,61 +178,57 @@ describe("Tier L — the reading one entry leaves behind", () => { // acquires, it would run before them and this would read `false` — and a // reader woken then would be told the entry was over while its provider, // its middleware and its Agent attachment were still standing. - yield* scoped(function* () { - let liveWhenReleased: boolean | undefined; - let released = false; - const session = opened( - yield* openReplSession({ - execution: execution(), - installations: [ - { - *install(): Operation { - yield* ensure(() => { - released = true; - liveWhenReleased = session.live; - }); - }, + let liveWhenReleased: boolean | undefined; + let released = false; + const session = opened( + yield* openReplSession({ + execution: execution(), + installations: [ + { + *install(): Operation { + yield* ensure(() => { + released = true; + liveWhenReleased = session.live; + }); }, - ], - }), - ); - const watched = yield* watching(session); - accepted(yield* session.submit('\n')); - yield* session.join(); - yield* sleep(0); - - // The installation really was released, so this is an ordering rather - // than an assertion about something that never ran. - expect(released).toBe(true); - expect(liveWhenReleased).toBe(true); - // And by now the session says what it is. - expect(session.live).toBe(false); - // The wake arrived with no input: nothing was typed, nothing activated, - // and a reader waiting for the entry to end was still told. - expect(watched.readings.length).toBeGreaterThan(0); - expect(watched.readings[watched.readings.length - 1].occurrences).toEqual([]); - expect(watched.readings[watched.readings.length - 1].entry).toBe(undefined); - }); + }, + ], + }), + ); + const watched = yield* watching(session); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + + // The installation really was released, so this is an ordering rather + // than an assertion about something that never ran. + expect(released).toBe(true); + expect(liveWhenReleased).toBe(true); + // And by now the session says what it is. + expect(session.live).toBe(false); + // The wake arrived with no input: nothing was typed, nothing activated, + // and a reader waiting for the entry to end was still told. + expect(watched.readings.length).toBeGreaterThan(0); + expect(watched.readings[watched.readings.length - 1].occurrences).toEqual([]); + expect(watched.readings[watched.readings.length - 1].entry).toBe(undefined); }); it("L3: a late producer update cannot revive a reading the entry took with it", function* () { - yield* scoped(function* () { - const session = opened(yield* openReplSession({ execution: execution() })); - accepted(yield* session.submit('\n')); - yield* session.join(); + const session = opened(yield* openReplSession({ execution: execution() })); + accepted(yield* session.submit('\n')); + yield* session.join(); + yield* sleep(0); + expect(session.lifecycle.occurrences).toEqual([]); + + // Whatever is still draining from the entry that closed — a terminal + // phase published as its dispatch unwound — arrives after the generation + // it belonged to is gone, and is refused by generation rather than + // appended to nothing. + for (let turn = 0; turn < 5; turn += 1) { yield* sleep(0); - expect(session.lifecycle.occurrences).toEqual([]); - - // Whatever is still draining from the entry that closed — a terminal - // phase published as its dispatch unwound — arrives after the generation - // it belonged to is gone, and is refused by generation rather than - // appended to nothing. - for (let turn = 0; turn < 5; turn += 1) { - yield* sleep(0); - } - expect(session.lifecycle.occurrences).toEqual([]); - expect(session.lifecycle.entry).toBe(undefined); - }); + } + expect(session.lifecycle.occurrences).toEqual([]); + expect(session.lifecycle.entry).toBe(undefined); }); it("L3: observing changes neither the outcome nor what the document rendered", function* () { From ecca5c459b77bed653bcdeab5efd4f9ab656bb2e Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Sat, 10 Oct 2026 05:45:55 -0400 Subject: [PATCH 19/19] =?UTF-8?q?=F0=9F=90=9B=20Keep=20a=20fatal=20failure?= =?UTF-8?q?=20fatal=20when=20the=20body=20failed=20too=20(#881)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An ordinary body failure hid a `DurablePersistenceError` or a Files fatal raised while expansion middleware unwound: `observeExpansion` reported and threw the canonical settlement before looking at what the dispatch raised on its way out, so `durabilityFailure()` found nothing and enclosing reconciliation read the run as merely incorrect rather than unable to persist. Reconcile the two halves after the whole dispatch has unwound, in the order `expand.ts` already ranks bound failures: durability, then a Files fatal, then the canonical failure over a later ordinary middleware one. The earlier canonical failure is still preferred within each fatal kind, and middleware still cannot rescue a canonical failure. The selected failure is both what is thrown and what the one detached terminal report conveys. --- packages/core/src/component-expansion.ts | 39 ++++- .../core/tests/component-expansion.test.ts | 139 ++++++++++++++++++ 2 files changed, 176 insertions(+), 2 deletions(-) diff --git a/packages/core/src/component-expansion.ts b/packages/core/src/component-expansion.ts index 6052c1aeb..c5ab0b874 100644 --- a/packages/core/src/component-expansion.ts +++ b/packages/core/src/component-expansion.ts @@ -19,6 +19,7 @@ import type { Operation, Queue, Stream } from "effection"; import { expandThroughTerminal } from "./component-api.ts"; import type { ComponentExpansionPhase, ComponentExpansionRequest } from "./component-api.ts"; import type { Expansion } from "./expansion.ts"; +import { durabilityFailure, filesFatalFailure } from "./errors.ts"; /** What an observer did that canonical expansion cannot act on. */ export class ComponentExpansionProtocolError extends Error { @@ -318,6 +319,33 @@ function explanatory( }; } +/** + * Which failure a competing canonical and middleware outcome settles on. + * + * The same order expansion already reconciles bound failures in: durability + * first, then a Files fatal, then the canonical failure over a later ordinary + * one. Stated here rather than shared with `expand.ts`, because the two reach + * it with different shapes and a helper common to both would be a third + * boundary to keep in step. + * + * Within each fatal kind the canonical failure is preferred, so the earlier + * one wins. Middleware still cannot rescue a canonical failure: an ordinary + * middleware failure never displaces it. + */ +function selectedFailure(canonical: unknown, laterFailed: boolean, later: unknown): unknown { + const durable = + durabilityFailure(canonical) ?? (laterFailed ? durabilityFailure(later) : undefined); + if (durable !== undefined) { + return durable; + } + const files = + filesFatalFailure(canonical) ?? (laterFailed ? filesFatalFailure(later) : undefined); + if (files !== undefined) { + return files; + } + return canonical; +} + /** * Surround one element's work with its canonical observation. * @@ -329,6 +357,7 @@ function explanatory( * happened and nothing more: it cannot read the value, and a handler cannot * replace it, rescue a failure or complete the element early. */ + export function* observeExpansion( expansion: Expansion, work: (observed: ObservedExpansion) => Operation, @@ -376,8 +405,14 @@ export function* observeExpansion( // from the terminal rather than from whether the chain returned normally. const settlement = issued.settlement(); if (settlement.status === "raised") { - terminate({ phase: "complete", result: Err(reported(settlement.raised)) }); - throw settlement.raised; + // Both halves can have failed: the body raised, and middleware's own + // unwind raised something else on the way out. A fatal failure is fatal + // whichever half it came from — an ordinary body error that hid a + // Journal failure would leave enclosing reconciliation believing the + // run is merely incorrect rather than unable to persist. + const selected = selectedFailure(settlement.raised, chainFailed, chainFailure); + terminate({ phase: "complete", result: Err(reported(selected)) }); + throw selected; } if (settlement.status === "absent") { const refusal = chainFailed ? chainFailure : settlement.refusal; diff --git a/packages/core/tests/component-expansion.test.ts b/packages/core/tests/component-expansion.test.ts index 5c365d18f..8ae163712 100644 --- a/packages/core/tests/component-expansion.test.ts +++ b/packages/core/tests/component-expansion.test.ts @@ -15,8 +15,11 @@ import { expect } from "@executablemd/test-support/expect"; import { each, ensure, scoped, sleep, spawn, useScope, withResolvers } from "effection"; import type { Scope } from "effection"; import type { Operation } from "effection"; +import { DurablePersistenceError } from "@executablemd/durable-streams"; +import { FilesProviderUnavailableError } from "@executablemd/runtime"; import { Component } from "../src/component-api.ts"; import { printErrors } from "../src/component-failures.ts"; +import { durabilityFailure, filesFatalFailure } from "../src/errors.ts"; import type { ComponentExpansionPhase, ComponentExpansionRequest } from "../src/component-api.ts"; import { expandSegments } from "../src/expand.ts"; import { renderSegments } from "../src/render.ts"; @@ -131,6 +134,21 @@ function watch( }); } +/** + * The detached report the one element under test completed with. + * + * Throws rather than returning undefined: a case that reaches here expects a + * failed terminal, and a missing one is the case not having happened. + */ +function reportedBy(watched: Watched): Error { + const phases = [...watched.seen.values()][0] ?? []; + const terminal = phases[phases.length - 1]; + if (terminal?.phase !== "complete" || terminal.result.ok) { + throw new Error("the element did not complete with a failure"); + } + return terminal.result.error; +} + describe("Tier CX — what surrounds one expansion", () => { it("CX1: a function component is entered, active, exited and completed, in order", function* () { const { watched, rendered } = yield* watch("", { @@ -425,6 +443,127 @@ describe("Tier CX — what surrounds one expansion", () => { expect(complete.phase === "complete" && complete.result.ok).toBe(false); }); + it("CX3: durability raised while middleware unwinds outranks the body's failure", function* () { + const persistence = new DurablePersistenceError("yield", new Error("journal unavailable")); + const { failure, watched } = yield* watch( + "", + { + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }, + function* (request, next) { + try { + yield* next(request); + } finally { + // Raised on the way out, after the body has already failed: both + // halves of this expansion failed, and only one can be the outcome. + throw persistence; + } + }, + ); + + // The durability failure, by identity, so a fail-stop records the object + // that was thrown. An ordinary body error standing in for it would tell + // enclosing reconciliation the run is merely incorrect rather than unable + // to persist. + expect(durabilityFailure(failure)).toBe(persistence); + const report = reportedBy(watched); + expect([report.name, report.message]).toEqual([ + "DurablePersistenceError", + "Failed to persist durable yield event", + ]); + // The selected diagnostic and its explanation, and no part of the failure + // itself: nothing a reader catches here is the durability failure. + expect(report.cause instanceof Error && report.cause.message).toBe("journal unavailable"); + expect(report).not.toBe(persistence); + expect(durabilityFailure(report)).toBe(undefined); + expect(Object.isFrozen(report)).toBe(true); + }); + + it("CX3: a Files fatal raised while middleware unwinds outranks the body's failure", function* () { + const unavailable = new FilesProviderUnavailableError(); + const { failure, watched } = yield* watch( + "", + { + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }, + function* (request, next) { + try { + yield* next(request); + } finally { + throw unavailable; + } + }, + ); + + expect(filesFatalFailure(failure)).toBe(unavailable); + const report = reportedBy(watched); + expect([report.name, report.message]).toEqual([ + "FilesProviderUnavailableError", + "Files provider is not installed", + ]); + // Detached of the fatal branding too: the report carries the diagnostic, + // not the structural data that makes an infrastructure failure one. + expect(report).not.toBe(unavailable); + expect(filesFatalFailure(report)).toBe(undefined); + expect(Object.isFrozen(report)).toBe(true); + }); + + it("CX3: a later ordinary middleware failure does not displace the body's", function* () { + const { report, failure, watched } = yield* watch( + "", + { + Boom: component("Boom", function* () { + throw new Error("the body said no"); + }), + }, + function* (request, next) { + try { + yield* next(request); + } finally { + throw new Error("the unwind said no"); + } + }, + ); + + // Neither failure is fatal, so the earlier one stays authoritative: + // middleware cannot rescue a canonical failure, and it cannot replace one + // either. + expect(failure instanceof Error && failure.message).toBe("the body said no"); + expect(report).toContain("the body said no"); + expect(report).not.toContain("the unwind said no"); + expect(reportedBy(watched).message).toBe("the body said no"); + }); + + it("CX3: a body that succeeded still fails when middleware's unwind raises", function* () { + const persistence = new DurablePersistenceError("close", new Error("journal unavailable")); + const { failure, rendered, watched } = yield* watch( + "", + { + Hello: component("Hello", function* () { + return "hi"; + }), + }, + function* (request, next) { + try { + yield* next(request); + } finally { + throw persistence; + } + }, + ); + + // The control for the two cases above: there is no competition here, and + // the same failure is the outcome. A body that returned is not an + // expansion that persisted. + expect(durabilityFailure(failure)).toBe(persistence); + expect(rendered).toBe(""); + expect(reportedBy(watched).name).toBe("DurablePersistenceError"); + }); + it("CX3: observing changes neither what rendered nor how it failed", function* () { const source = "\n\n\n"; const definitions = {