Create initial commits with <Git.Commit> under xmd run #750

Description

@taras

Story

As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

Example

Given a directory containing README.md:

git init --initial-branch=main
xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

Current gap

Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.

The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

Contract

Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

<Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

When the index contains staged changes, <Git.Commit> in an unborn checkout:

  • creates a commit with zero parents;
  • updates the checkout's symbolic branch to that commit;
  • binds the full object ID through as;
  • preserves the existing author, committer, signing, hook, index, and read-back behavior.

An empty index retains the existing no-empty-commit refusal and creates no commit.

The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

  • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
  • the pre-operation checkout commit and headTree are null;
  • the initial commit's parent is null;
  • successful post-operation state contains the real commit and tree object IDs.

Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

A directory that is not a Git checkout retains the existing outside-a-repository refusal.

Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

Workflow <Repositories> behavior also does not change:

  • every workflow Repository still has a real pinned creationCommit;
  • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
  • replay rejects a retained record that substitutes null for those required workflow values;
  • an empty remote or unborn checkout does not become a valid workflow base.

This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

Acceptance

  • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
  • commitId equals the resulting HEAD object ID.
  • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
  • The ambient Repository selection does not change after the commit.
  • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
  • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
  • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
  • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
  • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
  • Ordinary diagnostic journals continue to contain no repository effects.
  • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
  • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
  • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

Evidence

Run the focused integration and contract suites:

deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

Related

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

    No labels
    No labels

    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

      Create initial commits with <Git.Commit> under xmd run #750

      Description

      @taras

      Story

      As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

      Example

      Given a directory containing README.md:

      git init --initial-branch=main
      xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

      The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

      An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

      Current gap

      Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

      this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
      

      The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

      Contract

      Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

      <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

      When the index contains staged changes, <Git.Commit> in an unborn checkout:

      • creates a commit with zero parents;
      • updates the checkout's symbolic branch to that commit;
      • binds the full object ID through as;
      • preserves the existing author, committer, signing, hook, index, and read-back behavior.

      An empty index retains the existing no-empty-commit refusal and creates no commit.

      The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

      • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
      • the pre-operation checkout commit and headTree are null;
      • the initial commit's parent is null;
      • successful post-operation state contains the real commit and tree object IDs.

      Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

      Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

      A directory that is not a Git checkout retains the existing outside-a-repository refusal.

      Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

      Workflow <Repositories> behavior also does not change:

      • every workflow Repository still has a real pinned creationCommit;
      • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
      • replay rejects a retained record that substitutes null for those required workflow values;
      • an empty remote or unborn checkout does not become a valid workflow base.

      This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

      Acceptance

      • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
      • commitId equals the resulting HEAD object ID.
      • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
      • The ambient Repository selection does not change after the commit.
      • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
      • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
      • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
      • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
      • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
      • Ordinary diagnostic journals continue to contain no repository effects.
      • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
      • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
      • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

      Evidence

      Run the focused integration and contract suites:

      deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

      The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

      Related

      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

        No labels
        No labels

        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

          Create initial commits with <Git.Commit> under xmd run #750

          Description

          @taras

          Story

          As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

          Example

          Given a directory containing README.md:

          git init --initial-branch=main
          xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

          The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

          An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

          Current gap

          Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

          this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
          

          The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

          Contract

          Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

          <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

          When the index contains staged changes, <Git.Commit> in an unborn checkout:

          • creates a commit with zero parents;
          • updates the checkout's symbolic branch to that commit;
          • binds the full object ID through as;
          • preserves the existing author, committer, signing, hook, index, and read-back behavior.

          An empty index retains the existing no-empty-commit refusal and creates no commit.

          The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

          • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
          • the pre-operation checkout commit and headTree are null;
          • the initial commit's parent is null;
          • successful post-operation state contains the real commit and tree object IDs.

          Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

          Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

          A directory that is not a Git checkout retains the existing outside-a-repository refusal.

          Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

          Workflow <Repositories> behavior also does not change:

          • every workflow Repository still has a real pinned creationCommit;
          • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
          • replay rejects a retained record that substitutes null for those required workflow values;
          • an empty remote or unborn checkout does not become a valid workflow base.

          This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

          Acceptance

          • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
          • commitId equals the resulting HEAD object ID.
          • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
          • The ambient Repository selection does not change after the commit.
          • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
          • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
          • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
          • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
          • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
          • Ordinary diagnostic journals continue to contain no repository effects.
          • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
          • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
          • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

          Evidence

          Run the focused integration and contract suites:

          deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

          The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

          Related

          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

            No labels
            No labels

            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

              Create initial commits with <Git.Commit> under xmd run #750

              Description

              @taras

              Story

              As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

              Example

              Given a directory containing README.md:

              git init --initial-branch=main
              xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

              The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

              An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

              Current gap

              Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

              this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
              

              The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

              Contract

              Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

              <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

              When the index contains staged changes, <Git.Commit> in an unborn checkout:

              • creates a commit with zero parents;
              • updates the checkout's symbolic branch to that commit;
              • binds the full object ID through as;
              • preserves the existing author, committer, signing, hook, index, and read-back behavior.

              An empty index retains the existing no-empty-commit refusal and creates no commit.

              The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

              • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
              • the pre-operation checkout commit and headTree are null;
              • the initial commit's parent is null;
              • successful post-operation state contains the real commit and tree object IDs.

              Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

              Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

              A directory that is not a Git checkout retains the existing outside-a-repository refusal.

              Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

              Workflow <Repositories> behavior also does not change:

              • every workflow Repository still has a real pinned creationCommit;
              • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
              • replay rejects a retained record that substitutes null for those required workflow values;
              • an empty remote or unborn checkout does not become a valid workflow base.

              This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

              Acceptance

              • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
              • commitId equals the resulting HEAD object ID.
              • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
              • The ambient Repository selection does not change after the commit.
              • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
              • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
              • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
              • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
              • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
              • Ordinary diagnostic journals continue to contain no repository effects.
              • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
              • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
              • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

              Evidence

              Run the focused integration and contract suites:

              deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

              The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

              Related

              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

                No labels
                No labels

                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

                  Create initial commits with <Git.Commit> under xmd run #750

                  Description

                  @taras

                  Story

                  As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

                  Example

                  Given a directory containing README.md:

                  git init --initial-branch=main
                  xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

                  The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

                  An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

                  Current gap

                  Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

                  this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
                  

                  The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

                  Contract

                  Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

                  <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

                  When the index contains staged changes, <Git.Commit> in an unborn checkout:

                  • creates a commit with zero parents;
                  • updates the checkout's symbolic branch to that commit;
                  • binds the full object ID through as;
                  • preserves the existing author, committer, signing, hook, index, and read-back behavior.

                  An empty index retains the existing no-empty-commit refusal and creates no commit.

                  The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

                  • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
                  • the pre-operation checkout commit and headTree are null;
                  • the initial commit's parent is null;
                  • successful post-operation state contains the real commit and tree object IDs.

                  Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

                  Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

                  A directory that is not a Git checkout retains the existing outside-a-repository refusal.

                  Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

                  Workflow <Repositories> behavior also does not change:

                  • every workflow Repository still has a real pinned creationCommit;
                  • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
                  • replay rejects a retained record that substitutes null for those required workflow values;
                  • an empty remote or unborn checkout does not become a valid workflow base.

                  This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

                  Acceptance

                  • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
                  • commitId equals the resulting HEAD object ID.
                  • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
                  • The ambient Repository selection does not change after the commit.
                  • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
                  • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
                  • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
                  • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
                  • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
                  • Ordinary diagnostic journals continue to contain no repository effects.
                  • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
                  • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
                  • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

                  Evidence

                  Run the focused integration and contract suites:

                  deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

                  The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

                  Related

                  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

                    No labels
                    No labels

                    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

                      Create initial commits with <Git.Commit> under xmd run #750

                      Description

                      @taras

                      Story

                      As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

                      Example

                      Given a directory containing README.md:

                      git init --initial-branch=main
                      xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

                      The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

                      An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

                      Current gap

                      Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

                      this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
                      

                      The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

                      Contract

                      Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

                      <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

                      When the index contains staged changes, <Git.Commit> in an unborn checkout:

                      • creates a commit with zero parents;
                      • updates the checkout's symbolic branch to that commit;
                      • binds the full object ID through as;
                      • preserves the existing author, committer, signing, hook, index, and read-back behavior.

                      An empty index retains the existing no-empty-commit refusal and creates no commit.

                      The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

                      • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
                      • the pre-operation checkout commit and headTree are null;
                      • the initial commit's parent is null;
                      • successful post-operation state contains the real commit and tree object IDs.

                      Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

                      Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

                      A directory that is not a Git checkout retains the existing outside-a-repository refusal.

                      Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

                      Workflow <Repositories> behavior also does not change:

                      • every workflow Repository still has a real pinned creationCommit;
                      • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
                      • replay rejects a retained record that substitutes null for those required workflow values;
                      • an empty remote or unborn checkout does not become a valid workflow base.

                      This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

                      Acceptance

                      • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
                      • commitId equals the resulting HEAD object ID.
                      • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
                      • The ambient Repository selection does not change after the commit.
                      • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
                      • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
                      • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
                      • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
                      • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
                      • Ordinary diagnostic journals continue to contain no repository effects.
                      • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
                      • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
                      • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

                      Evidence

                      Run the focused integration and contract suites:

                      deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

                      The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

                      Related

                      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

                        No labels
                        No labels

                        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

                          Create initial commits with <Git.Commit> under xmd run #750

                          Description

                          @taras

                          Story

                          As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

                          Example

                          Given a directory containing README.md:

                          git init --initial-branch=main
                          xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

                          The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

                          An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

                          Current gap

                          Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

                          this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
                          

                          The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

                          Contract

                          Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

                          <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

                          When the index contains staged changes, <Git.Commit> in an unborn checkout:

                          • creates a commit with zero parents;
                          • updates the checkout's symbolic branch to that commit;
                          • binds the full object ID through as;
                          • preserves the existing author, committer, signing, hook, index, and read-back behavior.

                          An empty index retains the existing no-empty-commit refusal and creates no commit.

                          The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

                          • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
                          • the pre-operation checkout commit and headTree are null;
                          • the initial commit's parent is null;
                          • successful post-operation state contains the real commit and tree object IDs.

                          Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

                          Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

                          A directory that is not a Git checkout retains the existing outside-a-repository refusal.

                          Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

                          Workflow <Repositories> behavior also does not change:

                          • every workflow Repository still has a real pinned creationCommit;
                          • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
                          • replay rejects a retained record that substitutes null for those required workflow values;
                          • an empty remote or unborn checkout does not become a valid workflow base.

                          This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

                          Acceptance

                          • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
                          • commitId equals the resulting HEAD object ID.
                          • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
                          • The ambient Repository selection does not change after the commit.
                          • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
                          • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
                          • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
                          • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
                          • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
                          • Ordinary diagnostic journals continue to contain no repository effects.
                          • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
                          • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
                          • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

                          Evidence

                          Run the focused integration and contract suites:

                          deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

                          The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

                          Related

                          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

                            No labels
                            No labels

                            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

                              Create initial commits with <Git.Commit> under xmd run #750

                              Description

                              @taras

                              Story

                              As someone starting a Git repository, I want <Git.Add> and <Git.Commit> in an ordinary xmd run document to create its first commit, so I do not need a separate native Git bootstrap step.

                              Example

                              Given a directory containing README.md:

                              git init --initial-branch=main
                              xmd run -e '# Commit README.md with the initial commit messageStage `README.md` for the commit.<Git.Add paths="README.md" />Commit the staged file with the message `Initial commit`.<Git.Commit message="Initial commit" as="commitId" />'

                              The run stages README.md, creates a zero-parent commit on main, and binds that commit's full object ID to commitId.

                              An unborn repository is a valid Git checkout whose initial branch exists symbolically but does not have a HEAD commit yet.

                              Current gap

                              Ambient repository discovery finds the checkout root and common Git directory, but treats failure to resolve HEAD as if the invocation were outside Git:

                              this element needs a repository, and it is written outside a <Repository> in a directory that is not inside a Git checkout.
                              

                              The live Git operation contract also assumes that every checkout has a commit and HEAD tree, and that every new commit has exactly one parent. Relaxing discovery alone therefore cannot support an initial commit safely.

                              Contract

                              Where ordinary repository operations are supported—the Deno source CLI and compiled xmd—a valid unborn checkout is selected as the ambient Repository.

                              <Git.Add> keeps its existing path validation, index behavior, output, and failure semantics.

                              When the index contains staged changes, <Git.Commit> in an unborn checkout:

                              • creates a commit with zero parents;
                              • updates the checkout's symbolic branch to that commit;
                              • binds the full object ID through as;
                              • preserves the existing author, committer, signing, hook, index, and read-back behavior.

                              An empty index retains the existing no-empty-commit refusal and creates no commit.

                              The live ordinary-run state represents unavailable pre-commit values with null, never a sentinel or invented object ID:

                              • the ambient RepositoryIdentity.creationCommit is null when the checkout is selected before its first commit;
                              • the pre-operation checkout commit and headTree are null;
                              • the initial commit's parent is null;
                              • successful post-operation state contains the real commit and tree object IDs.

                              Repository selection and identity remain stable for the whole execution. The identity's creationCommit therefore stays null; it is not rewritten after <Git.Commit>. Operations later in the same execution read the repository's live state and observe the newly created commit.

                              Before the initial commit, an operation that requires an existing commit—such as creating a worktree or pushing a branch—refuses with an actionable unborn-repository diagnosis. After <Git.Commit> succeeds, the same operation uses the new commit under the already selected Repository. With the usual origin and Git-host configuration, this includes <Git.Push> and <PullRequest>.

                              A directory that is not a Git checkout retains the existing outside-a-repository refusal.

                              Ordinary --journal behavior does not change: ordinary repository effects remain live and are not retained or replayed as workflow effects.

                              Workflow <Repositories> behavior also does not change:

                              • every workflow Repository still has a real pinned creationCommit;
                              • retained workflow checkout and commit records still require real commit, HEAD-tree, and parent object IDs;
                              • replay rejects a retained record that substitutes null for those required workflow values;
                              • an empty remote or unborn checkout does not become a valid workflow base.

                              This issue does not add ordinary repository-operation providers to the Node or Bun source CLIs.

                              Acceptance

                              • In a fresh git init --initial-branch=main checkout, <Git.Add paths="README.md" /> followed by <Git.Commit message="Initial commit" as="commitId" /> creates a zero-parent commit containing README.md.
                              • commitId equals the resulting HEAD object ID.
                              • Live pre-operation results use null for the absent commit, HEAD tree, and parent; successful post-operation results contain valid object IDs.
                              • The ambient Repository selection does not change after the commit.
                              • A later <Git.Push> in the same execution can push the new branch to a configured empty origin, and subsequent Git-host composition consumes that pushed commit without reselecting the Repository.
                              • Attempting <Git.Commit> with an empty index refuses and leaves the checkout unborn.
                              • An operation requiring an existing commit refuses actionably before the initial commit and succeeds under its existing contract after the commit.
                              • A file-backed document and an inline xmd run -e document resolve the same ambient checkout.
                              • A non-Git directory retains the existing outside-a-repository error, while an unborn checkout does not receive it.
                              • Ordinary diagnostic journals continue to contain no repository effects.
                              • Retained workflow parsers reject absent creation commits, checkout commits, HEAD trees, and commit parents.
                              • Existing ordinary, linked-worktree, managed-worktree, and workflow Repository behavior remains unchanged.
                              • architecture.md, specs/workflow-workspace-spec.md, and the ordinary-run requirements in specs/executable-mdx-spec.md describe the resulting boundary.

                              Evidence

                              Run the focused integration and contract suites:

                              deno task test packages/workflow/tests/run-composition-ambient.test.ts packages/workflow/tests/run-composition-remote.test.ts packages/workflow/tests/git-add.test.ts packages/workflow/tests/git-commit.test.ts packages/cli/tests/run-composition-deno.test.ts packages/cli/tests/inline-cli.test.ts

                              The evidence includes the successful initial-commit path, empty-index refusal, pre-commit refusal for operations that need HEAD, same-execution post-commit behavior, outside-Git behavior, unchanged ordinary journaling, and strict workflow parsing.

                              Related

                              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

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions