feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1
, '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

feat(cli): agent templates with spawn export and --repo - #3350

Closed
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates
Closed

feat(cli): agent templates with spawn export and --repo#3350
AhmedTMM wants to merge 4 commits into
OpenRouterLabs:mainfrom
AhmedTMM:feat/agent-templates

Conversation

@AhmedTMM

Copy link
Copy Markdown
Collaborator

Summary

  • spawn export — SSHes into a running spawn, scans installed MCP servers, CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to GitHub, and prints a shareable one-liner
  • spawn <agent> <cloud> --repo user/repo — clones the template repo onto the VM, reads spawn.md, merges built-in steps, guides through custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup commands, and launches in the project directory
  • spawn.md format supports built-in steps (github, auto-update, browser) and custom setup steps (oauth, cli_auth, api_key, command)

New files

  • packages/cli/src/shared/spawn-md.ts — YAML frontmatter parser, valibot schemas, spawn.md generation/application
  • packages/cli/src/commands/export.ts — export command (VM scan, repo creation, shareable link)

Modified files

  • packages/cli/src/index.ts--repo flag extraction, export command dispatch
  • packages/cli/src/shared/orchestrate.ts — repo clone + spawn.md application in postInstall
  • packages/cli/src/flags.ts — added --repo to KNOWN_FLAGS
  • packages/cli/src/commands/help.ts — updated help text
  • packages/cli/src/commands/index.ts — barrel export
  • packages/cli/package.json — version bump to 0.28.0

Test plan

  • bunx @biomejs/biome check src/ — zero errors
  • bun test — 1951 pass (1 pre-existing failure unrelated)
  • Manual: create a repo with spawn.md, run spawn claude digitalocean --repo user/repo
  • Manual: run spawn export on a running spawn

🤖 Generated with Claude Code

AhmedTMMand others added 2 commits April 23, 2026 23:24
Adds the ability to share agent setups as templates:
- `spawn export` — SSHes into a running spawn, scans installed MCP servers,
CLI auths, and tools, generates a spawn.md recipe (no secrets), pushes to
GitHub, and prints a shareable one-liner command
- `spawn <agent> <cloud> --repo user/repo` — clones the template repo onto the
provisioned VM, reads spawn.md, merges built-in steps, guides the user through
custom auth (OAuth, CLI login, API keys), installs MCP servers, runs setup
commands, and launches the agent in the project directory
- spawn.md format supports built-in steps (github, auto-update, browser) and
custom setup steps (oauth, cli_auth, api_key, command)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Steps like github, auto-update, browser belong in the shareable
--steps flag, not in spawn.md. spawn.md now only handles custom
setup (OAuth, CLI auth, API keys, MCP servers, setup commands).
The exported command now looks like:
spawn claude digitalocean --repo user/repo --steps github,auto-update
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main and resolved merge conflicts:

  1. packages/cli/package.json — version conflict: took main's 1.0.21 and bumped to 1.0.22 for this feature
  2. packages/cli/src/shared/orchestrate.ts (2 conflicts):
    • Skill installation block (from main) + spawn.md application (from this branch) — kept both, placed spawn.md setup after skill installation
    • Funnel tracking trackFunnel("funnel_handoff") (from main) + repo-aware launch command cd ~/project && (from this branch) — kept both

Verification:

-- refactor/pr-maintainer

AhmedTMMand others added 2 commits April 24, 2026 22:29
# Conflicts:
#	packages/cli/package.json
#	packages/cli/src/shared/orchestrate.ts
`spawn export` now publishes ~/project as a real working-folder snapshot
of a running spawn:
- MCP scan reads from ~/.claude/settings.json, ~/.claude.json,
~/.cursor/mcp.json, ~/.codex/config.toml, and ~/.openclaw/openclaw.json
(with hand-rolled Codex TOML parsing); entries are deduped by name and
env values are replaced with ${NAME} placeholders.
- CLI auth scan covers GitHub, GitLab, AWS, gcloud, Azure, DO, Hetzner,
Vercel, Netlify, Fly, Heroku, Railway, Render, Shopify, Stripe,
Firebase, Supabase, Cloudflare, Pulumi, Docker, npm, Turso, Neon,
PlanetScale, 1Password, ngrok. One batched SSH probe replaces
N round-trips.
- rsync exclude list expanded to filter common secret/key files
(.ssh, .aws, .gnupg, *.pem, *.key, terraform state, etc.) and a
post-rsync content scan flags inline secrets (PEM keys, GitHub PATs,
Slack/Stripe/AWS/Google API keys) before push.
- Repo visibility prompt defaults to private.
Replay-side fixes:
- installMcpServersFromTemplate routes through skills.ts helpers (no
more `node -e` injection); adds Codex TOML support.
- launchCmd `cd ~/project` now gates on actual clone success, not the
--repo flag — invalid slugs no longer break agent boot.
- api_key var name regex no longer strips lowercase letters.
Bumps CLI to 1.0.23.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@la14-1
la14-1 marked this pull request as ready for review April 27, 2026 06:56
@la14-1

Copy link
Copy Markdown
Collaborator

Rebased onto main (3e6c876) and resolved merge conflicts:

  1. packages/cli/src/shared/orchestrate.ts (3 conflicts):

    • Kept main's repoCloned flag pattern (gates launch cd ~/project on actual clone success, not just env var)
    • Kept main's getErrorMessage() for clone failure logging
    • Preserved repoCloned = true; assignment from main
  2. packages/cli/src/shared/spawn-md.ts (5 conflicts):

    • Header: merged branch's "generate" mention with main's detailed comment
    • Schema: kept branch's steps field (then correctly removed by commit 2, matching main's approach)
    • generateSpawnMd(): kept branch's new function (feature addition)
    • escapedName regex: took main's [^A-Za-z0-9_] (more permissive, handles lowercase env var names)
    • MCP installation: took main's extracted helpers (installClaudeMcpServers etc. from skills.js) over branch's inline require() approach

Verification:

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
Collaborator

Rebased on main — merge conflict resolved. Lint clean, tests pass (2 pre-existing failures unrelated to this PR).

-- refactor/pr-maintainer

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AhmedTMM@la14-1