원클릭으로
init-template
Create a cloud-init template for MPS sandboxes (personal or project-shared).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Create a cloud-init template for MPS sandboxes (personal or project-shared).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | init-template |
| description | Create a cloud-init template for MPS sandboxes (personal or project-shared). |
| allowed-tools | Read, Write, Edit, Glob, Grep, Bash |
Interactive skill that guides developers through creating a cloud-init template and sandbox configuration for MPS. Templates are always based on the shipped default template (templates/cloud-init/default.yaml).
AskUserQuestion tool for questions. Never ask questions as inline text — the developer expects interactive menus they can navigate.multiSelect: true when the developer can pick multiple options (e.g., plugins).AskUserQuestion call when they're independent (up to 4 questions per call).Follow these steps in order.
Use AskUserQuestion to ask:
Question 1 — "What scope should this template have?"
~/mps/cloud-init/<name>.yaml, applies to all your sandboxes unless overridden per-project. Not checked into any repo.<project>/.mps/<name>.yaml, checked into git and shared with the team.If project scope, use AskUserQuestion to ask two follow-up questions:
<project>-<template>), so pick something descriptive." Suggest a sensible default based on the project (e.g., dev, audit, testnet).[INTERNAL] Do NOT assume CWD is the target project — the developer may be running this skill from the MPS repo while configuring a different project.
The template name becomes the filename (
<project>/.mps/<name>.yaml) and the value forMPS_CLOUD_INITin.mps.env(e.g.,MPS_CLOUD_INIT=.mps/dev.yaml). It flows into the sandbox auto-naming as the template component. Suggest short, lowercase, descriptive names without spaces or special characters. IMPORTANT: Never include themps-prefix in user-facing output — the prefix is an internal implementation detail that users never see.
If personal scope, use AskUserQuestion to ask for a template name (e.g., personal, security, web-dev) with the same note about auto-naming.
[INTERNAL] The name becomes the filename (
~/mps/cloud-init/<name>.yaml) and the value forMPS_DEFAULT_CLOUD_INITin~/mps/config.
Use AskUserQuestion:
Question — "Which pre-built image flavor should this sandbox use?"
base — Ubuntu 24.04 + Docker + Node.js + Python + dev tools + AI assistants (min: micro)protocol-dev — base + C/C++ toolchain + Go + Rust (min: lite)smart-contract-dev — protocol-dev + Solana/Anchor (amd64) + Foundry + Hardhat (min: lite)smart-contract-audit — smart-contract-dev + Slither + Echidna + Medusa + more (min: standard)[INTERNAL] After the developer chooses, silently read the corresponding layer file(s) from
images/layers/to build awareness of pre-installed packages. Each flavor includes everything from its parent:
base→ readimages/layers/base.yamlprotocol-dev→ readimages/layers/base.yaml+images/layers/protocol-dev.yamlsmart-contract-dev→ read all three above +images/layers/smart-contract-dev.yamlsmart-contract-audit→ read all four layer filesExtract the
packages:lists and review the corresponding install scripts inimages/scripts/install-*.shfor tool installations. Use this knowledge to warn if the developer tries to install something already baked in.
[INTERNAL] Read
templates/cloud-init/default.yaml. This is the starting base for every generated template. Parse its structure to understand:
- The active
runcmd:section with HorizenLabs plugin installs (enabled by default)- The commented-out sections: Trail of Bits, GSD, SuperClaude, Superpowers, BMAD, GitHub Spec Kit
- The commented-out
packages:,write_files:,hostname:,timezone:sectionsDo not tell the developer you're reading this — just proceed to step 4 with the knowledge.
[INTERNAL]
AskUserQuestionsupports max 4 options per question and max 4 questions per call. Free-text "Other" answers conflict withmultiSelect— avoid combining them. Split plugins/frameworks across multiple single-select questions instead.The install commands for each framework are in the default template's commented-out
runcmd:blocks. Copy them exactly when enabling — do not paraphrase or rewrite. The commands, paths, and flags are tested and correct.
Use AskUserQuestion with up to 4 questions in a single call (all single-select, no multiSelect):
Question 1 — "Enable HorizenLabs product ideation skills?" (discovery workflow, market research, PRD generator, tech specs, personas, user flows, stakeholder decks, mockup briefs)
hl-product-ideationQuestion 2 — "Enable zkVerify development skills?" (proof submission, SDK, smart contracts, RPC, pallet dev, Groth16/FFLONK/SP1/Noir/RISC Zero/Plonky2/EZKL builders)
zkverify-product-developmentQuestion 3 — "Enable zkVerify verifier assessment skills?" (Rust stable toolchain compat, no_std support, verifier pallet integration feasibility)
zkverify-verifier-assessmentQuestion 4 — "Enable context handoff utilities?" (save/resume work across sessions)
context-utilsThen a second AskUserQuestion call for third-party plugins and frameworks:
Question 1 — "Enable Trail of Bits security skills?" (~20 security-focused plugins)
Question 2 — "Enable GSD framework?" (meta-prompting and spec-driven development)
Question 3 — "Enable SuperClaude framework?" (slash commands and MCP servers)
Question 4 — "Enable Superpowers?" (plugin marketplace skills)
Then a third AskUserQuestion call for remaining frameworks:
Question 1 — "Enable BMAD Method?" (spec-driven development methodology)
Question 2 — "Enable GitHub Spec Kit?" (spec-driven CLI for AI coding agents)
[INTERNAL] If the developer selected "Pick a subset" for Trail of Bits, list all ~20 plugin names from the default template and ask them to specify which ones they want. Use a follow-up text question for this since there are too many options for
AskUserQuestion.
Use AskUserQuestion with 4 single-select questions in one call:
Question 1 — "Need extra apt packages?" (e.g., postgresql-client, redis-tools, nmap)
Question 2 — "Need custom first-boot commands?" (e.g., install pip/npm packages, clone repos, run setup scripts)
Question 3 — "Need config files dropped into the VM?" (e.g., .env files, tool configs)
Question 4 — "Set a timezone for the sandbox?"
[INTERNAL] For each "Yes" answer, follow up with a text-based
AskUserQuestion(single question, let them type via "Other"):
- Packages: Ask which packages. If any are already in the target image layer (from step 2), tell them it's pre-installed and skip it.
- Run commands: Ask what commands to run.
- Config files: Ask for paths and content. Remind about
owner: ubuntu:ubuntuandpermissions: '0600'for sensitive files.- Timezone Q4: For project templates, make "UTC" the first/recommended option. For personal templates, make "Inherit from host" the first/recommended option.
If the developer answers "No" to all, skip straight to step 5.
[INTERNAL] Build the template starting from the default template's structure:
- Always start with
#cloud-configheader- Add a comment identifying it as generated (e.g.,
# Generated by /init-template — based on default.yaml)- If packages were requested, add an active
packages:section (uncommented)- Build the
runcmd:section:
- Include enabled plugins/frameworks (uncommented from the default template — copy the exact
sudo -u ubuntu bash -c '...'blocks)- Do NOT include commented-out sections the developer didn't select
- Add any custom runcmd entries
- If write_files were requested, add an active
write_files:section- Add hostname/timezone if requested
Important: Copy the exact command blocks from the default template for plugins/frameworks — do not paraphrase or rewrite them.
[INTERNAL]
- Personal: Write to
~/mps/cloud-init/<name>.yaml. Create the directory if it doesn't exist (mkdir -p).- Project: Write to
<project-dir>/.mps/<name>.yaml. Create the.mps/directory if it doesn't exist (mkdir -p).
Use AskUserQuestion to ask about sandbox settings for .mps.env:
Question 1 — "Which resource profile should this project use?"
micro — 1/8 CPU, 1/16 mem (lightweight tasks)lite — 1/4 CPU, 1/6 mem (default, most development)standard — 1/3 CPU, 1/4 mem (recommended for smart-contract-audit)custom — Set CPU, memory, and disk manually[INTERNAL] Suggest the minimum profile from the image metadata as the recommended option.
heavy(1/2 CPU, 1/3 mem) is available too — if there are only 4 slots, dropmicroand keepheavywhen the image min profile isliteor higher.If the developer selects custom, follow up with
AskUserQuestionasking 3 questions:
- "How many vCPUs?" — options:
2,4,8,Custom(type a number)- "How much memory?" — options:
4G,8G,16G,Custom(type a value like12G)- "How much disk?" — options:
20G,40G,75G,Custom(type a value like100G)Write the custom values as
MPS_CPUS,MPS_MEMORY,MPS_DISKin.mps.env(no profile needed).
Question 2 — "Do you need port forwarding? If so, which host:guest pairs?" (use AskUserQuestion with an "Other" option so they can type ports, or offer common presets like 3000:3000, 8080:8080)
Question 3 — "Do you need extra mounts beyond the auto-mount?" (CWD is mounted automatically)
Question 4 — "Do you want a fixed sandbox name or auto-naming?"
[INTERNAL] Always set these in
.mps.env(they ensure all developers use the same sandbox configuration):
MPS_CLOUD_INIT=.mps/<name>.yaml(using the template name from step 1)MPS_PROFILE=<chosen profile>— ALWAYS set this, even if it'slite. Personal~/mps/configdefaults could override a missing profile, causing different devs to get different instance specs. Pinning the profile in.mps.envprevents "works on my machine" issues.MPS_IMAGE=<flavor>— ALWAYS set this, even if it'sbase. Same reason as profile — a developer's personal config could override the default, putting them on a different image than the rest of the team.Only write other settings (ports, mounts, name) if they differ from defaults. Comment out optional settings with explanations.
Mention: if
.mps.envcontains developer-specific overrides (likeMPS_NAME), consider adding it to.gitignoreand committing only.mps/<name>.yaml. Alternatively, commit.mps.envwith shared defaults and let developers override via~/mps/config.
Use AskUserQuestion:
Question — "Set this as your default template? It will apply to all new sandboxes unless a project overrides it with its own .mps.env."
~/mps/config--cloud-init <name>.[INTERNAL] If yes, update
~/mps/config(create if needed) to setMPS_DEFAULT_CLOUD_INIT=<name>. If the file already has aMPS_DEFAULT_CLOUD_INITline, replace it. Mention what the previous default was (if any) so the developer knows what changed.If no, just confirm the template was saved and remind them how to use it:
mps create --cloud-init <name>orMPS_DEFAULT_CLOUD_INIT=<name>in~/mps/configlater.
Then ask if they want to configure other personal defaults in ~/mps/config:
Question — "Want to set any other personal defaults in ~/mps/config? These apply to all sandboxes unless overridden per-project."
[INTERNAL] If yes, use
AskUserQuestioncalls to walk through the same settings as the project.mps.envflow — but framed as personal defaults:Question 1 — "Default image flavor?"
base(current default)protocol-devsmart-contract-devsmart-contract-auditQuestion 2 — "Default resource profile?"
micro,lite(current default),standard,heavyQuestion 3 — "Default port forwarding?" (e.g.,
3000:3000 8080:8080)
- None (Recommended) — No default ports
- Yes — Specify ports (let them type via "Other")
Question 4 — "Disable CLI update checks?"
- No (Recommended) — Keep update checks enabled
- Yes — Set
MPS_CHECK_UPDATES=falseOnly write settings that differ from defaults. If
~/mps/configalready exists, read it first and preserve existing values the developer doesn't change. Add comments for each setting.
Show what was created:
mps up (project) or mps create (any directory, for personal)mps create --profile micro --name test-template && mps destroy --force --name test-template