Add standard-input programs to xmd run #723

Description

@taras

Story

As a command-line user, I want xmd run - to execute a complete XMD program
from standard input, so a program-producing command can compose with xmd run
without a temporary file.

Common path

xmd plan "Prepare the release program."| xmd run -

xmd run - reads standard input completely, admits it as one complete root,
and then executes it through the ordinary run profile.

Current gap

Today the run grammar treats - as a file reference. The shared CLI also has
no host-supplied operation for acquiring standard input, and the subprocess
test launcher can send input but cannot close it to deliver EOF. The documented
composition therefore cannot run, and the proposed focused test cannot prove
that it does.

Command grammar

The literal document argument - selects standard input only when the caller
explicitly names the run command. Both xmd run - and xmd run -- - select
stdin. The selection happens from the original command form, not merely from a
parsed configuration that also represents the shorthand run command.

No other spelling acquires standard input:

  • bare xmd - retains the shorthand run grammar and treats - as a file
    reference;
  • xmd run --eval - and xmd -e - keep their existing refusal and never read
    stdin;
  • - is not an alias for another command; and
  • a reference such as -#Section is not the literal stdin argument.

xmd run --help remains generic and reads no input. xmd run - --help selects
and inspects the supplied document, as the existing file and --eval help
forms do, but never executes it.

Host input and root identity

Standard input is a private CLI-host dependency. Each supported runtime
entrypoint supplies one cancellable Effection operation that reads stdin to EOF
once and returns a Result<string>. The shared CLI neither detects a runtime
nor reaches a host stdin global. This operation is not a public component,
syntax form, document capability, or contextual authority that an authored
program can replace.

After a successful read, the CLI constructs the existing
retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
source positions and diagnostics. The exact supplied source remains part of
the ordinary root binding and durable root import. Do not add a digest member,
a stdin-specific root variant, or another public root-source form: the existing
origin-plus-source identity already distinguishes two supplied programs.

Relative imports and every other relative document operation resolve from the
invocation's contextual working directory. Stdin never pretends to be a file in
that directory. File and --eval roots keep their existing identities and
selection behavior.

Lifecycle and failures

Fixed command grammar selects stdin before the host input operation is called.
The complete input is acquired before document inspection, root-property
resolution, Agent or provider setup, secret-detection announcement, journal
creation, root admission, or document execution. The reader is called exactly
once for one selected stdin root.

A read failure returns this approved diagnostic and exits nonzero:

xmd run could not read a complete document from standard input

It performs none of the later actions above. Cancellation while the reader is
waiting for bytes or EOF tears the reader down completely and admits no root,
creates no journal, and performs no document effect. Cancellation is not
converted into a read failure.

Once acquired, stdin follows the ordinary run lifecycle. Complete structural
preflight finishes before the first document effect, so a malformed construct
after an otherwise valid effect causes no document effect at all. Empty stdin
is the ordinary empty text root: it emits nothing and performs no document
effect.

All ordinary xmd run options, root props, output and return behavior,
journaling, timeout behavior, permission mode, cancellation, and providers
apply after source selection exactly as they do for file and --eval roots.
The run timeout begins at its existing boundary; it does not turn source
acquisition into a second execution lifecycle.

Approved command wording

Generic run help says:

Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.

A run with no root says:

xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`

The stdin read-failure wording is the fixed sentence in the lifecycle section.
No raw host error, input content, or substituted path is included in it.

Acceptance ownership

This story exclusively owns the Quest's Stdin run case:

  • a deterministic producer piped to xmd run - supplies one complete root,
    which executes once;
  • a later malformed construct prevents an earlier negative-control effect;
  • empty stdin emits nothing and performs no document effect;
  • a source position reports <stdin>, and a journaled root import retains the
    exact supplied source under that origin;
  • relative imports resolve from the invocation working directory;
  • read failure and actual cancellation reach no inspection, provider, journal,
    root admission, or document effect;
  • explicit and shorthand file roots and --eval remain unchanged;
  • bare xmd -, --eval -, another command's -, and -#Section do not select
    stdin; and
  • generic help does not read stdin, while selected-root help reads and
    describes it without execution.

#723 proves the pipe boundary with a deterministic producer and lands before
#724. #724 supplies the source-only xmd plan producer; once both stories are
delivered, their contracts establish the common path without additional #723
work. #723 is not held open for a test that can run only after #724.

Documentation and focused evidence

Update the root-source and CLI execution sections of architecture.md and
specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
command examples that enumerate root inputs, without adding a <Run>
component.

Extend packages/test-support/launch.ts with bounded stdin input that writes
the supplied text and closes stdin, so subprocess tests observe real EOF and
still tear down the child on cancellation. Add the stdin matrix in
packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
failure and cancellation paths with a controlled provider, and use real CLI
subprocess input for the public pipe, EOF, preflight, empty-input, identity,
working-directory, option, and grammar cases.

Focused feedback evidence:

deno task test \
packages/cli/tests/stdin-cli.test.ts \
packages/cli/tests/inline-cli.test.ts \
packages/cli/tests/cli-help.test.ts \
packages/cli/tests/syntax-cli.test.ts

packages/core/tests/source-position.test.ts is not focused evidence unless
the implementation changes core's canonical source-position shape, which this
contract does not require.

After a feedback commit, run deno task test --changed. Delivery adds a real
stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
after deno task build, and waits for required CI. Because this change touches
every runtime entrypoint and the shared subprocess launcher, the ordinary
delivery runtime matrices remain authoritative for Deno, Node, and Bun.

Dependencies and delivery order

Implementation starts from a clean worktree at current main, not from the
unrelated dirty checkout used for this architecture review.

Out of scope

  • A <Run> component or an independent child execution.
  • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
  • Treating stdin as a saved file origin.
  • A new public stdin API, root-source variant, or digest protocol.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Add standard-input programs to xmd run #723

      Description

      @taras

      Story

      As a command-line user, I want xmd run - to execute a complete XMD program
      from standard input, so a program-producing command can compose with xmd run
      without a temporary file.

      Common path

      xmd plan "Prepare the release program."| xmd run -

      xmd run - reads standard input completely, admits it as one complete root,
      and then executes it through the ordinary run profile.

      Current gap

      Today the run grammar treats - as a file reference. The shared CLI also has
      no host-supplied operation for acquiring standard input, and the subprocess
      test launcher can send input but cannot close it to deliver EOF. The documented
      composition therefore cannot run, and the proposed focused test cannot prove
      that it does.

      Command grammar

      The literal document argument - selects standard input only when the caller
      explicitly names the run command. Both xmd run - and xmd run -- - select
      stdin. The selection happens from the original command form, not merely from a
      parsed configuration that also represents the shorthand run command.

      No other spelling acquires standard input:

      • bare xmd - retains the shorthand run grammar and treats - as a file
        reference;
      • xmd run --eval - and xmd -e - keep their existing refusal and never read
        stdin;
      • - is not an alias for another command; and
      • a reference such as -#Section is not the literal stdin argument.

      xmd run --help remains generic and reads no input. xmd run - --help selects
      and inspects the supplied document, as the existing file and --eval help
      forms do, but never executes it.

      Host input and root identity

      Standard input is a private CLI-host dependency. Each supported runtime
      entrypoint supplies one cancellable Effection operation that reads stdin to EOF
      once and returns a Result<string>. The shared CLI neither detects a runtime
      nor reaches a host stdin global. This operation is not a public component,
      syntax form, document capability, or contextual authority that an authored
      program can replace.

      After a successful read, the CLI constructs the existing
      retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
      source positions and diagnostics. The exact supplied source remains part of
      the ordinary root binding and durable root import. Do not add a digest member,
      a stdin-specific root variant, or another public root-source form: the existing
      origin-plus-source identity already distinguishes two supplied programs.

      Relative imports and every other relative document operation resolve from the
      invocation's contextual working directory. Stdin never pretends to be a file in
      that directory. File and --eval roots keep their existing identities and
      selection behavior.

      Lifecycle and failures

      Fixed command grammar selects stdin before the host input operation is called.
      The complete input is acquired before document inspection, root-property
      resolution, Agent or provider setup, secret-detection announcement, journal
      creation, root admission, or document execution. The reader is called exactly
      once for one selected stdin root.

      A read failure returns this approved diagnostic and exits nonzero:

      xmd run could not read a complete document from standard input
      

      It performs none of the later actions above. Cancellation while the reader is
      waiting for bytes or EOF tears the reader down completely and admits no root,
      creates no journal, and performs no document effect. Cancellation is not
      converted into a read failure.

      Once acquired, stdin follows the ordinary run lifecycle. Complete structural
      preflight finishes before the first document effect, so a malformed construct
      after an otherwise valid effect causes no document effect at all. Empty stdin
      is the ordinary empty text root: it emits nothing and performs no document
      effect.

      All ordinary xmd run options, root props, output and return behavior,
      journaling, timeout behavior, permission mode, cancellation, and providers
      apply after source selection exactly as they do for file and --eval roots.
      The run timeout begins at its existing boundary; it does not turn source
      acquisition into a second execution lifecycle.

      Approved command wording

      Generic run help says:

      Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
      

      A run with no root says:

      xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
      

      The stdin read-failure wording is the fixed sentence in the lifecycle section.
      No raw host error, input content, or substituted path is included in it.

      Acceptance ownership

      This story exclusively owns the Quest's Stdin run case:

      • a deterministic producer piped to xmd run - supplies one complete root,
        which executes once;
      • a later malformed construct prevents an earlier negative-control effect;
      • empty stdin emits nothing and performs no document effect;
      • a source position reports <stdin>, and a journaled root import retains the
        exact supplied source under that origin;
      • relative imports resolve from the invocation working directory;
      • read failure and actual cancellation reach no inspection, provider, journal,
        root admission, or document effect;
      • explicit and shorthand file roots and --eval remain unchanged;
      • bare xmd -, --eval -, another command's -, and -#Section do not select
        stdin; and
      • generic help does not read stdin, while selected-root help reads and
        describes it without execution.

      #723 proves the pipe boundary with a deterministic producer and lands before
      #724. #724 supplies the source-only xmd plan producer; once both stories are
      delivered, their contracts establish the common path without additional #723
      work. #723 is not held open for a test that can run only after #724.

      Documentation and focused evidence

      Update the root-source and CLI execution sections of architecture.md and
      specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
      command examples that enumerate root inputs, without adding a <Run>
      component.

      Extend packages/test-support/launch.ts with bounded stdin input that writes
      the supplied text and closes stdin, so subprocess tests observe real EOF and
      still tear down the child on cancellation. Add the stdin matrix in
      packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
      in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
      failure and cancellation paths with a controlled provider, and use real CLI
      subprocess input for the public pipe, EOF, preflight, empty-input, identity,
      working-directory, option, and grammar cases.

      Focused feedback evidence:

      deno task test \
      packages/cli/tests/stdin-cli.test.ts \
      packages/cli/tests/inline-cli.test.ts \
      packages/cli/tests/cli-help.test.ts \
      packages/cli/tests/syntax-cli.test.ts

      packages/core/tests/source-position.test.ts is not focused evidence unless
      the implementation changes core's canonical source-position shape, which this
      contract does not require.

      After a feedback commit, run deno task test --changed. Delivery adds a real
      stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
      after deno task build, and waits for required CI. Because this change touches
      every runtime entrypoint and the shared subprocess launcher, the ordinary
      delivery runtime matrices remain authoritative for Deno, Node, and Bun.

      Dependencies and delivery order

      Implementation starts from a clean worktree at current main, not from the
      unrelated dirty checkout used for this architecture review.

      Out of scope

      • A <Run> component or an independent child execution.
      • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
      • Treating stdin as a saved file origin.
      • A new public stdin API, root-source variant, or digest protocol.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        enhancementNew feature or request

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Add standard-input programs to xmd run #723

          Description

          @taras

          Story

          As a command-line user, I want xmd run - to execute a complete XMD program
          from standard input, so a program-producing command can compose with xmd run
          without a temporary file.

          Common path

          xmd plan "Prepare the release program."| xmd run -

          xmd run - reads standard input completely, admits it as one complete root,
          and then executes it through the ordinary run profile.

          Current gap

          Today the run grammar treats - as a file reference. The shared CLI also has
          no host-supplied operation for acquiring standard input, and the subprocess
          test launcher can send input but cannot close it to deliver EOF. The documented
          composition therefore cannot run, and the proposed focused test cannot prove
          that it does.

          Command grammar

          The literal document argument - selects standard input only when the caller
          explicitly names the run command. Both xmd run - and xmd run -- - select
          stdin. The selection happens from the original command form, not merely from a
          parsed configuration that also represents the shorthand run command.

          No other spelling acquires standard input:

          • bare xmd - retains the shorthand run grammar and treats - as a file
            reference;
          • xmd run --eval - and xmd -e - keep their existing refusal and never read
            stdin;
          • - is not an alias for another command; and
          • a reference such as -#Section is not the literal stdin argument.

          xmd run --help remains generic and reads no input. xmd run - --help selects
          and inspects the supplied document, as the existing file and --eval help
          forms do, but never executes it.

          Host input and root identity

          Standard input is a private CLI-host dependency. Each supported runtime
          entrypoint supplies one cancellable Effection operation that reads stdin to EOF
          once and returns a Result<string>. The shared CLI neither detects a runtime
          nor reaches a host stdin global. This operation is not a public component,
          syntax form, document capability, or contextual authority that an authored
          program can replace.

          After a successful read, the CLI constructs the existing
          retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
          source positions and diagnostics. The exact supplied source remains part of
          the ordinary root binding and durable root import. Do not add a digest member,
          a stdin-specific root variant, or another public root-source form: the existing
          origin-plus-source identity already distinguishes two supplied programs.

          Relative imports and every other relative document operation resolve from the
          invocation's contextual working directory. Stdin never pretends to be a file in
          that directory. File and --eval roots keep their existing identities and
          selection behavior.

          Lifecycle and failures

          Fixed command grammar selects stdin before the host input operation is called.
          The complete input is acquired before document inspection, root-property
          resolution, Agent or provider setup, secret-detection announcement, journal
          creation, root admission, or document execution. The reader is called exactly
          once for one selected stdin root.

          A read failure returns this approved diagnostic and exits nonzero:

          xmd run could not read a complete document from standard input
          

          It performs none of the later actions above. Cancellation while the reader is
          waiting for bytes or EOF tears the reader down completely and admits no root,
          creates no journal, and performs no document effect. Cancellation is not
          converted into a read failure.

          Once acquired, stdin follows the ordinary run lifecycle. Complete structural
          preflight finishes before the first document effect, so a malformed construct
          after an otherwise valid effect causes no document effect at all. Empty stdin
          is the ordinary empty text root: it emits nothing and performs no document
          effect.

          All ordinary xmd run options, root props, output and return behavior,
          journaling, timeout behavior, permission mode, cancellation, and providers
          apply after source selection exactly as they do for file and --eval roots.
          The run timeout begins at its existing boundary; it does not turn source
          acquisition into a second execution lifecycle.

          Approved command wording

          Generic run help says:

          Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
          

          A run with no root says:

          xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
          

          The stdin read-failure wording is the fixed sentence in the lifecycle section.
          No raw host error, input content, or substituted path is included in it.

          Acceptance ownership

          This story exclusively owns the Quest's Stdin run case:

          • a deterministic producer piped to xmd run - supplies one complete root,
            which executes once;
          • a later malformed construct prevents an earlier negative-control effect;
          • empty stdin emits nothing and performs no document effect;
          • a source position reports <stdin>, and a journaled root import retains the
            exact supplied source under that origin;
          • relative imports resolve from the invocation working directory;
          • read failure and actual cancellation reach no inspection, provider, journal,
            root admission, or document effect;
          • explicit and shorthand file roots and --eval remain unchanged;
          • bare xmd -, --eval -, another command's -, and -#Section do not select
            stdin; and
          • generic help does not read stdin, while selected-root help reads and
            describes it without execution.

          #723 proves the pipe boundary with a deterministic producer and lands before
          #724. #724 supplies the source-only xmd plan producer; once both stories are
          delivered, their contracts establish the common path without additional #723
          work. #723 is not held open for a test that can run only after #724.

          Documentation and focused evidence

          Update the root-source and CLI execution sections of architecture.md and
          specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
          command examples that enumerate root inputs, without adding a <Run>
          component.

          Extend packages/test-support/launch.ts with bounded stdin input that writes
          the supplied text and closes stdin, so subprocess tests observe real EOF and
          still tear down the child on cancellation. Add the stdin matrix in
          packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
          in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
          failure and cancellation paths with a controlled provider, and use real CLI
          subprocess input for the public pipe, EOF, preflight, empty-input, identity,
          working-directory, option, and grammar cases.

          Focused feedback evidence:

          deno task test \
          packages/cli/tests/stdin-cli.test.ts \
          packages/cli/tests/inline-cli.test.ts \
          packages/cli/tests/cli-help.test.ts \
          packages/cli/tests/syntax-cli.test.ts

          packages/core/tests/source-position.test.ts is not focused evidence unless
          the implementation changes core's canonical source-position shape, which this
          contract does not require.

          After a feedback commit, run deno task test --changed. Delivery adds a real
          stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
          after deno task build, and waits for required CI. Because this change touches
          every runtime entrypoint and the shared subprocess launcher, the ordinary
          delivery runtime matrices remain authoritative for Deno, Node, and Bun.

          Dependencies and delivery order

          Implementation starts from a clean worktree at current main, not from the
          unrelated dirty checkout used for this architecture review.

          Out of scope

          • A <Run> component or an independent child execution.
          • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
          • Treating stdin as a saved file origin.
          • A new public stdin API, root-source variant, or digest protocol.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            enhancementNew feature or request

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Add standard-input programs to xmd run #723

              Description

              @taras

              Story

              As a command-line user, I want xmd run - to execute a complete XMD program
              from standard input, so a program-producing command can compose with xmd run
              without a temporary file.

              Common path

              xmd plan "Prepare the release program."| xmd run -

              xmd run - reads standard input completely, admits it as one complete root,
              and then executes it through the ordinary run profile.

              Current gap

              Today the run grammar treats - as a file reference. The shared CLI also has
              no host-supplied operation for acquiring standard input, and the subprocess
              test launcher can send input but cannot close it to deliver EOF. The documented
              composition therefore cannot run, and the proposed focused test cannot prove
              that it does.

              Command grammar

              The literal document argument - selects standard input only when the caller
              explicitly names the run command. Both xmd run - and xmd run -- - select
              stdin. The selection happens from the original command form, not merely from a
              parsed configuration that also represents the shorthand run command.

              No other spelling acquires standard input:

              • bare xmd - retains the shorthand run grammar and treats - as a file
                reference;
              • xmd run --eval - and xmd -e - keep their existing refusal and never read
                stdin;
              • - is not an alias for another command; and
              • a reference such as -#Section is not the literal stdin argument.

              xmd run --help remains generic and reads no input. xmd run - --help selects
              and inspects the supplied document, as the existing file and --eval help
              forms do, but never executes it.

              Host input and root identity

              Standard input is a private CLI-host dependency. Each supported runtime
              entrypoint supplies one cancellable Effection operation that reads stdin to EOF
              once and returns a Result<string>. The shared CLI neither detects a runtime
              nor reaches a host stdin global. This operation is not a public component,
              syntax form, document capability, or contextual authority that an authored
              program can replace.

              After a successful read, the CLI constructs the existing
              retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
              source positions and diagnostics. The exact supplied source remains part of
              the ordinary root binding and durable root import. Do not add a digest member,
              a stdin-specific root variant, or another public root-source form: the existing
              origin-plus-source identity already distinguishes two supplied programs.

              Relative imports and every other relative document operation resolve from the
              invocation's contextual working directory. Stdin never pretends to be a file in
              that directory. File and --eval roots keep their existing identities and
              selection behavior.

              Lifecycle and failures

              Fixed command grammar selects stdin before the host input operation is called.
              The complete input is acquired before document inspection, root-property
              resolution, Agent or provider setup, secret-detection announcement, journal
              creation, root admission, or document execution. The reader is called exactly
              once for one selected stdin root.

              A read failure returns this approved diagnostic and exits nonzero:

              xmd run could not read a complete document from standard input
              

              It performs none of the later actions above. Cancellation while the reader is
              waiting for bytes or EOF tears the reader down completely and admits no root,
              creates no journal, and performs no document effect. Cancellation is not
              converted into a read failure.

              Once acquired, stdin follows the ordinary run lifecycle. Complete structural
              preflight finishes before the first document effect, so a malformed construct
              after an otherwise valid effect causes no document effect at all. Empty stdin
              is the ordinary empty text root: it emits nothing and performs no document
              effect.

              All ordinary xmd run options, root props, output and return behavior,
              journaling, timeout behavior, permission mode, cancellation, and providers
              apply after source selection exactly as they do for file and --eval roots.
              The run timeout begins at its existing boundary; it does not turn source
              acquisition into a second execution lifecycle.

              Approved command wording

              Generic run help says:

              Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
              

              A run with no root says:

              xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
              

              The stdin read-failure wording is the fixed sentence in the lifecycle section.
              No raw host error, input content, or substituted path is included in it.

              Acceptance ownership

              This story exclusively owns the Quest's Stdin run case:

              • a deterministic producer piped to xmd run - supplies one complete root,
                which executes once;
              • a later malformed construct prevents an earlier negative-control effect;
              • empty stdin emits nothing and performs no document effect;
              • a source position reports <stdin>, and a journaled root import retains the
                exact supplied source under that origin;
              • relative imports resolve from the invocation working directory;
              • read failure and actual cancellation reach no inspection, provider, journal,
                root admission, or document effect;
              • explicit and shorthand file roots and --eval remain unchanged;
              • bare xmd -, --eval -, another command's -, and -#Section do not select
                stdin; and
              • generic help does not read stdin, while selected-root help reads and
                describes it without execution.

              #723 proves the pipe boundary with a deterministic producer and lands before
              #724. #724 supplies the source-only xmd plan producer; once both stories are
              delivered, their contracts establish the common path without additional #723
              work. #723 is not held open for a test that can run only after #724.

              Documentation and focused evidence

              Update the root-source and CLI execution sections of architecture.md and
              specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
              command examples that enumerate root inputs, without adding a <Run>
              component.

              Extend packages/test-support/launch.ts with bounded stdin input that writes
              the supplied text and closes stdin, so subprocess tests observe real EOF and
              still tear down the child on cancellation. Add the stdin matrix in
              packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
              in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
              failure and cancellation paths with a controlled provider, and use real CLI
              subprocess input for the public pipe, EOF, preflight, empty-input, identity,
              working-directory, option, and grammar cases.

              Focused feedback evidence:

              deno task test \
              packages/cli/tests/stdin-cli.test.ts \
              packages/cli/tests/inline-cli.test.ts \
              packages/cli/tests/cli-help.test.ts \
              packages/cli/tests/syntax-cli.test.ts

              packages/core/tests/source-position.test.ts is not focused evidence unless
              the implementation changes core's canonical source-position shape, which this
              contract does not require.

              After a feedback commit, run deno task test --changed. Delivery adds a real
              stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
              after deno task build, and waits for required CI. Because this change touches
              every runtime entrypoint and the shared subprocess launcher, the ordinary
              delivery runtime matrices remain authoritative for Deno, Node, and Bun.

              Dependencies and delivery order

              Implementation starts from a clean worktree at current main, not from the
              unrelated dirty checkout used for this architecture review.

              Out of scope

              • A <Run> component or an independent child execution.
              • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
              • Treating stdin as a saved file origin.
              • A new public stdin API, root-source variant, or digest protocol.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                enhancementNew feature or request

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Add standard-input programs to xmd run #723

                  Description

                  @taras

                  Story

                  As a command-line user, I want xmd run - to execute a complete XMD program
                  from standard input, so a program-producing command can compose with xmd run
                  without a temporary file.

                  Common path

                  xmd plan "Prepare the release program."| xmd run -

                  xmd run - reads standard input completely, admits it as one complete root,
                  and then executes it through the ordinary run profile.

                  Current gap

                  Today the run grammar treats - as a file reference. The shared CLI also has
                  no host-supplied operation for acquiring standard input, and the subprocess
                  test launcher can send input but cannot close it to deliver EOF. The documented
                  composition therefore cannot run, and the proposed focused test cannot prove
                  that it does.

                  Command grammar

                  The literal document argument - selects standard input only when the caller
                  explicitly names the run command. Both xmd run - and xmd run -- - select
                  stdin. The selection happens from the original command form, not merely from a
                  parsed configuration that also represents the shorthand run command.

                  No other spelling acquires standard input:

                  • bare xmd - retains the shorthand run grammar and treats - as a file
                    reference;
                  • xmd run --eval - and xmd -e - keep their existing refusal and never read
                    stdin;
                  • - is not an alias for another command; and
                  • a reference such as -#Section is not the literal stdin argument.

                  xmd run --help remains generic and reads no input. xmd run - --help selects
                  and inspects the supplied document, as the existing file and --eval help
                  forms do, but never executes it.

                  Host input and root identity

                  Standard input is a private CLI-host dependency. Each supported runtime
                  entrypoint supplies one cancellable Effection operation that reads stdin to EOF
                  once and returns a Result<string>. The shared CLI neither detects a runtime
                  nor reaches a host stdin global. This operation is not a public component,
                  syntax form, document capability, or contextual authority that an authored
                  program can replace.

                  After a successful read, the CLI constructs the existing
                  retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
                  source positions and diagnostics. The exact supplied source remains part of
                  the ordinary root binding and durable root import. Do not add a digest member,
                  a stdin-specific root variant, or another public root-source form: the existing
                  origin-plus-source identity already distinguishes two supplied programs.

                  Relative imports and every other relative document operation resolve from the
                  invocation's contextual working directory. Stdin never pretends to be a file in
                  that directory. File and --eval roots keep their existing identities and
                  selection behavior.

                  Lifecycle and failures

                  Fixed command grammar selects stdin before the host input operation is called.
                  The complete input is acquired before document inspection, root-property
                  resolution, Agent or provider setup, secret-detection announcement, journal
                  creation, root admission, or document execution. The reader is called exactly
                  once for one selected stdin root.

                  A read failure returns this approved diagnostic and exits nonzero:

                  xmd run could not read a complete document from standard input
                  

                  It performs none of the later actions above. Cancellation while the reader is
                  waiting for bytes or EOF tears the reader down completely and admits no root,
                  creates no journal, and performs no document effect. Cancellation is not
                  converted into a read failure.

                  Once acquired, stdin follows the ordinary run lifecycle. Complete structural
                  preflight finishes before the first document effect, so a malformed construct
                  after an otherwise valid effect causes no document effect at all. Empty stdin
                  is the ordinary empty text root: it emits nothing and performs no document
                  effect.

                  All ordinary xmd run options, root props, output and return behavior,
                  journaling, timeout behavior, permission mode, cancellation, and providers
                  apply after source selection exactly as they do for file and --eval roots.
                  The run timeout begins at its existing boundary; it does not turn source
                  acquisition into a second execution lifecycle.

                  Approved command wording

                  Generic run help says:

                  Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
                  

                  A run with no root says:

                  xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
                  

                  The stdin read-failure wording is the fixed sentence in the lifecycle section.
                  No raw host error, input content, or substituted path is included in it.

                  Acceptance ownership

                  This story exclusively owns the Quest's Stdin run case:

                  • a deterministic producer piped to xmd run - supplies one complete root,
                    which executes once;
                  • a later malformed construct prevents an earlier negative-control effect;
                  • empty stdin emits nothing and performs no document effect;
                  • a source position reports <stdin>, and a journaled root import retains the
                    exact supplied source under that origin;
                  • relative imports resolve from the invocation working directory;
                  • read failure and actual cancellation reach no inspection, provider, journal,
                    root admission, or document effect;
                  • explicit and shorthand file roots and --eval remain unchanged;
                  • bare xmd -, --eval -, another command's -, and -#Section do not select
                    stdin; and
                  • generic help does not read stdin, while selected-root help reads and
                    describes it without execution.

                  #723 proves the pipe boundary with a deterministic producer and lands before
                  #724. #724 supplies the source-only xmd plan producer; once both stories are
                  delivered, their contracts establish the common path without additional #723
                  work. #723 is not held open for a test that can run only after #724.

                  Documentation and focused evidence

                  Update the root-source and CLI execution sections of architecture.md and
                  specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
                  command examples that enumerate root inputs, without adding a <Run>
                  component.

                  Extend packages/test-support/launch.ts with bounded stdin input that writes
                  the supplied text and closes stdin, so subprocess tests observe real EOF and
                  still tear down the child on cancellation. Add the stdin matrix in
                  packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
                  in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
                  failure and cancellation paths with a controlled provider, and use real CLI
                  subprocess input for the public pipe, EOF, preflight, empty-input, identity,
                  working-directory, option, and grammar cases.

                  Focused feedback evidence:

                  deno task test \
                  packages/cli/tests/stdin-cli.test.ts \
                  packages/cli/tests/inline-cli.test.ts \
                  packages/cli/tests/cli-help.test.ts \
                  packages/cli/tests/syntax-cli.test.ts

                  packages/core/tests/source-position.test.ts is not focused evidence unless
                  the implementation changes core's canonical source-position shape, which this
                  contract does not require.

                  After a feedback commit, run deno task test --changed. Delivery adds a real
                  stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
                  after deno task build, and waits for required CI. Because this change touches
                  every runtime entrypoint and the shared subprocess launcher, the ordinary
                  delivery runtime matrices remain authoritative for Deno, Node, and Bun.

                  Dependencies and delivery order

                  Implementation starts from a clean worktree at current main, not from the
                  unrelated dirty checkout used for this architecture review.

                  Out of scope

                  • A <Run> component or an independent child execution.
                  • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
                  • Treating stdin as a saved file origin.
                  • A new public stdin API, root-source variant, or digest protocol.

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    enhancementNew feature or request

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Add standard-input programs to xmd run #723

                      Description

                      @taras

                      Story

                      As a command-line user, I want xmd run - to execute a complete XMD program
                      from standard input, so a program-producing command can compose with xmd run
                      without a temporary file.

                      Common path

                      xmd plan "Prepare the release program."| xmd run -

                      xmd run - reads standard input completely, admits it as one complete root,
                      and then executes it through the ordinary run profile.

                      Current gap

                      Today the run grammar treats - as a file reference. The shared CLI also has
                      no host-supplied operation for acquiring standard input, and the subprocess
                      test launcher can send input but cannot close it to deliver EOF. The documented
                      composition therefore cannot run, and the proposed focused test cannot prove
                      that it does.

                      Command grammar

                      The literal document argument - selects standard input only when the caller
                      explicitly names the run command. Both xmd run - and xmd run -- - select
                      stdin. The selection happens from the original command form, not merely from a
                      parsed configuration that also represents the shorthand run command.

                      No other spelling acquires standard input:

                      • bare xmd - retains the shorthand run grammar and treats - as a file
                        reference;
                      • xmd run --eval - and xmd -e - keep their existing refusal and never read
                        stdin;
                      • - is not an alias for another command; and
                      • a reference such as -#Section is not the literal stdin argument.

                      xmd run --help remains generic and reads no input. xmd run - --help selects
                      and inspects the supplied document, as the existing file and --eval help
                      forms do, but never executes it.

                      Host input and root identity

                      Standard input is a private CLI-host dependency. Each supported runtime
                      entrypoint supplies one cancellable Effection operation that reads stdin to EOF
                      once and returns a Result<string>. The shared CLI neither detects a runtime
                      nor reaches a host stdin global. This operation is not a public component,
                      syntax form, document capability, or contextual authority that an authored
                      program can replace.

                      After a successful read, the CLI constructs the existing
                      retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
                      source positions and diagnostics. The exact supplied source remains part of
                      the ordinary root binding and durable root import. Do not add a digest member,
                      a stdin-specific root variant, or another public root-source form: the existing
                      origin-plus-source identity already distinguishes two supplied programs.

                      Relative imports and every other relative document operation resolve from the
                      invocation's contextual working directory. Stdin never pretends to be a file in
                      that directory. File and --eval roots keep their existing identities and
                      selection behavior.

                      Lifecycle and failures

                      Fixed command grammar selects stdin before the host input operation is called.
                      The complete input is acquired before document inspection, root-property
                      resolution, Agent or provider setup, secret-detection announcement, journal
                      creation, root admission, or document execution. The reader is called exactly
                      once for one selected stdin root.

                      A read failure returns this approved diagnostic and exits nonzero:

                      xmd run could not read a complete document from standard input
                      

                      It performs none of the later actions above. Cancellation while the reader is
                      waiting for bytes or EOF tears the reader down completely and admits no root,
                      creates no journal, and performs no document effect. Cancellation is not
                      converted into a read failure.

                      Once acquired, stdin follows the ordinary run lifecycle. Complete structural
                      preflight finishes before the first document effect, so a malformed construct
                      after an otherwise valid effect causes no document effect at all. Empty stdin
                      is the ordinary empty text root: it emits nothing and performs no document
                      effect.

                      All ordinary xmd run options, root props, output and return behavior,
                      journaling, timeout behavior, permission mode, cancellation, and providers
                      apply after source selection exactly as they do for file and --eval roots.
                      The run timeout begins at its existing boundary; it does not turn source
                      acquisition into a second execution lifecycle.

                      Approved command wording

                      Generic run help says:

                      Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
                      

                      A run with no root says:

                      xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
                      

                      The stdin read-failure wording is the fixed sentence in the lifecycle section.
                      No raw host error, input content, or substituted path is included in it.

                      Acceptance ownership

                      This story exclusively owns the Quest's Stdin run case:

                      • a deterministic producer piped to xmd run - supplies one complete root,
                        which executes once;
                      • a later malformed construct prevents an earlier negative-control effect;
                      • empty stdin emits nothing and performs no document effect;
                      • a source position reports <stdin>, and a journaled root import retains the
                        exact supplied source under that origin;
                      • relative imports resolve from the invocation working directory;
                      • read failure and actual cancellation reach no inspection, provider, journal,
                        root admission, or document effect;
                      • explicit and shorthand file roots and --eval remain unchanged;
                      • bare xmd -, --eval -, another command's -, and -#Section do not select
                        stdin; and
                      • generic help does not read stdin, while selected-root help reads and
                        describes it without execution.

                      #723 proves the pipe boundary with a deterministic producer and lands before
                      #724. #724 supplies the source-only xmd plan producer; once both stories are
                      delivered, their contracts establish the common path without additional #723
                      work. #723 is not held open for a test that can run only after #724.

                      Documentation and focused evidence

                      Update the root-source and CLI execution sections of architecture.md and
                      specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
                      command examples that enumerate root inputs, without adding a <Run>
                      component.

                      Extend packages/test-support/launch.ts with bounded stdin input that writes
                      the supplied text and closes stdin, so subprocess tests observe real EOF and
                      still tear down the child on cancellation. Add the stdin matrix in
                      packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
                      in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
                      failure and cancellation paths with a controlled provider, and use real CLI
                      subprocess input for the public pipe, EOF, preflight, empty-input, identity,
                      working-directory, option, and grammar cases.

                      Focused feedback evidence:

                      deno task test \
                      packages/cli/tests/stdin-cli.test.ts \
                      packages/cli/tests/inline-cli.test.ts \
                      packages/cli/tests/cli-help.test.ts \
                      packages/cli/tests/syntax-cli.test.ts

                      packages/core/tests/source-position.test.ts is not focused evidence unless
                      the implementation changes core's canonical source-position shape, which this
                      contract does not require.

                      After a feedback commit, run deno task test --changed. Delivery adds a real
                      stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
                      after deno task build, and waits for required CI. Because this change touches
                      every runtime entrypoint and the shared subprocess launcher, the ordinary
                      delivery runtime matrices remain authoritative for Deno, Node, and Bun.

                      Dependencies and delivery order

                      Implementation starts from a clean worktree at current main, not from the
                      unrelated dirty checkout used for this architecture review.

                      Out of scope

                      • A <Run> component or an independent child execution.
                      • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
                      • Treating stdin as a saved file origin.
                      • A new public stdin API, root-source variant, or digest protocol.

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        enhancementNew feature or request

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Add standard-input programs to xmd run #723

                          Description

                          @taras

                          Story

                          As a command-line user, I want xmd run - to execute a complete XMD program
                          from standard input, so a program-producing command can compose with xmd run
                          without a temporary file.

                          Common path

                          xmd plan "Prepare the release program."| xmd run -

                          xmd run - reads standard input completely, admits it as one complete root,
                          and then executes it through the ordinary run profile.

                          Current gap

                          Today the run grammar treats - as a file reference. The shared CLI also has
                          no host-supplied operation for acquiring standard input, and the subprocess
                          test launcher can send input but cannot close it to deliver EOF. The documented
                          composition therefore cannot run, and the proposed focused test cannot prove
                          that it does.

                          Command grammar

                          The literal document argument - selects standard input only when the caller
                          explicitly names the run command. Both xmd run - and xmd run -- - select
                          stdin. The selection happens from the original command form, not merely from a
                          parsed configuration that also represents the shorthand run command.

                          No other spelling acquires standard input:

                          • bare xmd - retains the shorthand run grammar and treats - as a file
                            reference;
                          • xmd run --eval - and xmd -e - keep their existing refusal and never read
                            stdin;
                          • - is not an alias for another command; and
                          • a reference such as -#Section is not the literal stdin argument.

                          xmd run --help remains generic and reads no input. xmd run - --help selects
                          and inspects the supplied document, as the existing file and --eval help
                          forms do, but never executes it.

                          Host input and root identity

                          Standard input is a private CLI-host dependency. Each supported runtime
                          entrypoint supplies one cancellable Effection operation that reads stdin to EOF
                          once and returns a Result<string>. The shared CLI neither detects a runtime
                          nor reaches a host stdin global. This operation is not a public component,
                          syntax form, document capability, or contextual authority that an authored
                          program can replace.

                          After a successful read, the CLI constructs the existing
                          retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
                          source positions and diagnostics. The exact supplied source remains part of
                          the ordinary root binding and durable root import. Do not add a digest member,
                          a stdin-specific root variant, or another public root-source form: the existing
                          origin-plus-source identity already distinguishes two supplied programs.

                          Relative imports and every other relative document operation resolve from the
                          invocation's contextual working directory. Stdin never pretends to be a file in
                          that directory. File and --eval roots keep their existing identities and
                          selection behavior.

                          Lifecycle and failures

                          Fixed command grammar selects stdin before the host input operation is called.
                          The complete input is acquired before document inspection, root-property
                          resolution, Agent or provider setup, secret-detection announcement, journal
                          creation, root admission, or document execution. The reader is called exactly
                          once for one selected stdin root.

                          A read failure returns this approved diagnostic and exits nonzero:

                          xmd run could not read a complete document from standard input
                          

                          It performs none of the later actions above. Cancellation while the reader is
                          waiting for bytes or EOF tears the reader down completely and admits no root,
                          creates no journal, and performs no document effect. Cancellation is not
                          converted into a read failure.

                          Once acquired, stdin follows the ordinary run lifecycle. Complete structural
                          preflight finishes before the first document effect, so a malformed construct
                          after an otherwise valid effect causes no document effect at all. Empty stdin
                          is the ordinary empty text root: it emits nothing and performs no document
                          effect.

                          All ordinary xmd run options, root props, output and return behavior,
                          journaling, timeout behavior, permission mode, cancellation, and providers
                          apply after source selection exactly as they do for file and --eval roots.
                          The run timeout begins at its existing boundary; it does not turn source
                          acquisition into a second execution lifecycle.

                          Approved command wording

                          Generic run help says:

                          Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
                          

                          A run with no root says:

                          xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
                          

                          The stdin read-failure wording is the fixed sentence in the lifecycle section.
                          No raw host error, input content, or substituted path is included in it.

                          Acceptance ownership

                          This story exclusively owns the Quest's Stdin run case:

                          • a deterministic producer piped to xmd run - supplies one complete root,
                            which executes once;
                          • a later malformed construct prevents an earlier negative-control effect;
                          • empty stdin emits nothing and performs no document effect;
                          • a source position reports <stdin>, and a journaled root import retains the
                            exact supplied source under that origin;
                          • relative imports resolve from the invocation working directory;
                          • read failure and actual cancellation reach no inspection, provider, journal,
                            root admission, or document effect;
                          • explicit and shorthand file roots and --eval remain unchanged;
                          • bare xmd -, --eval -, another command's -, and -#Section do not select
                            stdin; and
                          • generic help does not read stdin, while selected-root help reads and
                            describes it without execution.

                          #723 proves the pipe boundary with a deterministic producer and lands before
                          #724. #724 supplies the source-only xmd plan producer; once both stories are
                          delivered, their contracts establish the common path without additional #723
                          work. #723 is not held open for a test that can run only after #724.

                          Documentation and focused evidence

                          Update the root-source and CLI execution sections of architecture.md and
                          specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
                          command examples that enumerate root inputs, without adding a <Run>
                          component.

                          Extend packages/test-support/launch.ts with bounded stdin input that writes
                          the supplied text and closes stdin, so subprocess tests observe real EOF and
                          still tear down the child on cancellation. Add the stdin matrix in
                          packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
                          in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
                          failure and cancellation paths with a controlled provider, and use real CLI
                          subprocess input for the public pipe, EOF, preflight, empty-input, identity,
                          working-directory, option, and grammar cases.

                          Focused feedback evidence:

                          deno task test \
                          packages/cli/tests/stdin-cli.test.ts \
                          packages/cli/tests/inline-cli.test.ts \
                          packages/cli/tests/cli-help.test.ts \
                          packages/cli/tests/syntax-cli.test.ts

                          packages/core/tests/source-position.test.ts is not focused evidence unless
                          the implementation changes core's canonical source-position shape, which this
                          contract does not require.

                          After a feedback commit, run deno task test --changed. Delivery adds a real
                          stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
                          after deno task build, and waits for required CI. Because this change touches
                          every runtime entrypoint and the shared subprocess launcher, the ordinary
                          delivery runtime matrices remain authoritative for Deno, Node, and Bun.

                          Dependencies and delivery order

                          Implementation starts from a clean worktree at current main, not from the
                          unrelated dirty checkout used for this architecture review.

                          Out of scope

                          • A <Run> component or an independent child execution.
                          • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
                          • Treating stdin as a saved file origin.
                          • A new public stdin API, root-source variant, or digest protocol.

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            enhancementNew feature or request

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Add standard-input programs to xmd run #723

                              Description

                              @taras

                              Story

                              As a command-line user, I want xmd run - to execute a complete XMD program
                              from standard input, so a program-producing command can compose with xmd run
                              without a temporary file.

                              Common path

                              xmd plan "Prepare the release program."| xmd run -

                              xmd run - reads standard input completely, admits it as one complete root,
                              and then executes it through the ordinary run profile.

                              Current gap

                              Today the run grammar treats - as a file reference. The shared CLI also has
                              no host-supplied operation for acquiring standard input, and the subprocess
                              test launcher can send input but cannot close it to deliver EOF. The documented
                              composition therefore cannot run, and the proposed focused test cannot prove
                              that it does.

                              Command grammar

                              The literal document argument - selects standard input only when the caller
                              explicitly names the run command. Both xmd run - and xmd run -- - select
                              stdin. The selection happens from the original command form, not merely from a
                              parsed configuration that also represents the shorthand run command.

                              No other spelling acquires standard input:

                              • bare xmd - retains the shorthand run grammar and treats - as a file
                                reference;
                              • xmd run --eval - and xmd -e - keep their existing refusal and never read
                                stdin;
                              • - is not an alias for another command; and
                              • a reference such as -#Section is not the literal stdin argument.

                              xmd run --help remains generic and reads no input. xmd run - --help selects
                              and inspects the supplied document, as the existing file and --eval help
                              forms do, but never executes it.

                              Host input and root identity

                              Standard input is a private CLI-host dependency. Each supported runtime
                              entrypoint supplies one cancellable Effection operation that reads stdin to EOF
                              once and returns a Result<string>. The shared CLI neither detects a runtime
                              nor reaches a host stdin global. This operation is not a public component,
                              syntax form, document capability, or contextual authority that an authored
                              program can replace.

                              After a successful read, the CLI constructs the existing
                              retainedSource("<stdin>", source) root. <stdin> is the stable origin shown in
                              source positions and diagnostics. The exact supplied source remains part of
                              the ordinary root binding and durable root import. Do not add a digest member,
                              a stdin-specific root variant, or another public root-source form: the existing
                              origin-plus-source identity already distinguishes two supplied programs.

                              Relative imports and every other relative document operation resolve from the
                              invocation's contextual working directory. Stdin never pretends to be a file in
                              that directory. File and --eval roots keep their existing identities and
                              selection behavior.

                              Lifecycle and failures

                              Fixed command grammar selects stdin before the host input operation is called.
                              The complete input is acquired before document inspection, root-property
                              resolution, Agent or provider setup, secret-detection announcement, journal
                              creation, root admission, or document execution. The reader is called exactly
                              once for one selected stdin root.

                              A read failure returns this approved diagnostic and exits nonzero:

                              xmd run could not read a complete document from standard input
                              

                              It performs none of the later actions above. Cancellation while the reader is
                              waiting for bytes or EOF tears the reader down completely and admits no root,
                              creates no journal, and performs no document effect. Cancellation is not
                              converted into a read failure.

                              Once acquired, stdin follows the ordinary run lifecycle. Complete structural
                              preflight finishes before the first document effect, so a malformed construct
                              after an otherwise valid effect causes no document effect at all. Empty stdin
                              is the ordinary empty text root: it emits nothing and performs no document
                              effect.

                              All ordinary xmd run options, root props, output and return behavior,
                              journaling, timeout behavior, permission mode, cancellation, and providers
                              apply after source selection exactly as they do for file and --eval roots.
                              The run timeout begins at its existing boundary; it does not turn source
                              acquisition into a second execution lifecycle.

                              Approved command wording

                              Generic run help says:

                              Exactly one root document is required: a path, standard input through `xmd run -`, or one --eval value.
                              

                              A run with no root says:

                              xmd run requires a root document — `xmd run <document.md>`, `xmd run -`, or `xmd run --eval '<markdown>'`
                              

                              The stdin read-failure wording is the fixed sentence in the lifecycle section.
                              No raw host error, input content, or substituted path is included in it.

                              Acceptance ownership

                              This story exclusively owns the Quest's Stdin run case:

                              • a deterministic producer piped to xmd run - supplies one complete root,
                                which executes once;
                              • a later malformed construct prevents an earlier negative-control effect;
                              • empty stdin emits nothing and performs no document effect;
                              • a source position reports <stdin>, and a journaled root import retains the
                                exact supplied source under that origin;
                              • relative imports resolve from the invocation working directory;
                              • read failure and actual cancellation reach no inspection, provider, journal,
                                root admission, or document effect;
                              • explicit and shorthand file roots and --eval remain unchanged;
                              • bare xmd -, --eval -, another command's -, and -#Section do not select
                                stdin; and
                              • generic help does not read stdin, while selected-root help reads and
                                describes it without execution.

                              #723 proves the pipe boundary with a deterministic producer and lands before
                              #724. #724 supplies the source-only xmd plan producer; once both stories are
                              delivered, their contracts establish the common path without additional #723
                              work. #723 is not held open for a test that can run only after #724.

                              Documentation and focused evidence

                              Update the root-source and CLI execution sections of architecture.md and
                              specs/executable-mdx-spec.md. Update xmd run --help and README/homepage
                              command examples that enumerate root inputs, without adding a <Run>
                              component.

                              Extend packages/test-support/launch.ts with bounded stdin input that writes
                              the supplied text and closes stdin, so subprocess tests observe real EOF and
                              still tear down the child on cancellation. Add the stdin matrix in
                              packages/cli/tests/stdin-cli.test.ts; keep file and --eval negative controls
                              in packages/cli/tests/inline-cli.test.ts. Exercise the private host-input
                              failure and cancellation paths with a controlled provider, and use real CLI
                              subprocess input for the public pipe, EOF, preflight, empty-input, identity,
                              working-directory, option, and grammar cases.

                              Focused feedback evidence:

                              deno task test \
                              packages/cli/tests/stdin-cli.test.ts \
                              packages/cli/tests/inline-cli.test.ts \
                              packages/cli/tests/cli-help.test.ts \
                              packages/cli/tests/syntax-cli.test.ts

                              packages/core/tests/source-position.test.ts is not focused evidence unless
                              the implementation changes core's canonical source-position shape, which this
                              contract does not require.

                              After a feedback commit, run deno task test --changed. Delivery adds a real
                              stdin/EOF probe to scripts/tests/cli-npm-bin.test.ts, proves the compiled CLI
                              after deno task build, and waits for required CI. Because this change touches
                              every runtime entrypoint and the shared subprocess launcher, the ordinary
                              delivery runtime matrices remain authoritative for Deno, Node, and Bun.

                              Dependencies and delivery order

                              Implementation starts from a clean worktree at current main, not from the
                              unrelated dirty checkout used for this architecture review.

                              Out of scope

                              • A <Run> component or an independent child execution.
                              • Reading stdin through --eval, a bare xmd - alias, or xmd plan itself.
                              • Treating stdin as a saved file origin.
                              • A new public stdin API, root-source variant, or digest protocol.

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                enhancementNew feature or request

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions