aspire-init
$
npx mdskill add foxminchan/BookWorm/aspire-initBootstraps Aspire AppHost in new or existing repositories
- Scaffolds Aspire applications for greenfield or existing projects
- Uses aspire CLI and aspireify for setup and wiring
- Chooses between init and new based on repository state
- Generates AppHost skeleton and hands off to wiring
SKILL.md
.github/skills/aspire-initView on GitHub ↗
---
name: aspire-init
description: >-
**WORKFLOW SKILL** - First-run flow for adding Aspire to a repo. Picks `aspire new`
(greenfield) or `aspire init` (existing repo), drops the AppHost skeleton, then hands
off to `aspireify` for resource wiring.
USE FOR: aspire init, aspire new, aspire-starter, aspire-ts-starter, aspire-py-starter,
add Aspire to existing repo, scaffold Aspire app, bootstrap Aspire, no AppHost detected,
install aspireify, generated .aspire/modules.
DO NOT USE FOR: AppHost wiring on an existing AppHost (use aspireify), start/stop/wait
(use aspire-orchestration), deploy/publish (use aspire-deployment), logs/traces (use
aspire-monitoring), repo that already has an AppHost.
INVOKES: aspire CLI (init, new, doctor), aspireify (handoff after skeleton drop).
FOR SINGLE OPERATIONS: Run `aspire init` or `aspire new TEMPLATE` directly.
license: MIT
metadata:
author: Microsoft
version: "0.0.1"
---
# Aspire Init
> **First-run only.** This skill owns the skeleton drop and template choice for repositories
> that do not yet have an Aspire AppHost. Once the skeleton is in place, hand off to
> [`aspireify`](../aspireify/SKILL.md) for the actual resource wiring.
## Prerequisites
| Requirement | Install |
| ---------------------------------- | ------------------------------------------------------ |
| .NET 10.0 SDK | https://dotnet.microsoft.com/download |
| Aspire CLI (curl installer) | `curl -sSL https://aspire.dev/install.sh \| bash` |
| Aspire CLI (NativeAOT global tool) | `dotnet tool install -g Aspire.Cli` (.NET 10 required) |
| Diagnose missing prerequisites | `aspire doctor` |
> Aspire ships the CLI as a NativeAOT .NET global tool — instant startup, no JIT warmup.
> The curl/PowerShell installer remains supported for environments without .NET 10.
## Detection
Activate **only** when adding Aspire to a workspace that does not yet have one. Confirm ALL
of the following before running `aspire init`:
| Signal | How to Detect | Meaning |
| --------------------- | ------------------------------------------------------- | ---------- |
| No C# AppHost | No `.csproj` containing `Aspire.AppHost.Sdk` | OK to init |
| No file-based AppHost | No `apphost.cs` with `#:sdk Aspire.AppHost.Sdk` | OK to init |
| No TypeScript AppHost | No `apphost.ts` in repo root | OK to init |
| No Aspire config | No `aspire.config.json` in repo root | OK to init |
| User intent | Explicit "add Aspire", "scaffold Aspire", "aspire init" | OK to init |
If **any** AppHost signal is already present, **do not run `aspire init`**. Route to
[`aspireify`](../aspireify/SKILL.md) (re-wire) or
[`aspire-orchestration`](../aspire-orchestration/SKILL.md) (lifecycle).
## Decision: `aspire new` vs `aspire init`
| Situation | Command | Why |
| ----------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- |
| Empty directory or brand-new project | `aspire new <template>` | Generates a full starter solution |
| Existing repo with services to model | `aspire init` | Drops minimal skeleton + `aspire.config.json` next to existing code |
| User wants a sample to learn from | `aspire new aspire-starter` | Includes ApiService + Web + ServiceDefaults |
| User wants the smallest possible scaffold | `aspire new aspire-empty` (C#) or `aspire new aspire-ts-empty` (TS) | No resources pre-wired |
| User wants Python services | `aspire new aspire-py-starter` (TypeScript AppHost drives Python) | **Not** `dotnet new` — that template was removed in 13.3 |
See [references/templates.md](references/templates.md) for the complete template list and
options.
## Workflow A — `aspire new <template>` (new project)
For brand-new projects in an empty or non-existent directory:
1. Confirm prerequisites with `aspire doctor` if the CLI install is uncertain.
2. Pick a template from [references/templates.md](references/templates.md).
3. Run the template, append `--non-interactive` for agent flows:
```bash
aspire new aspire-starter --name MyApp --output ./MyApp --non-interactive
```
4. The new directory is fully wired by the template — **no aspireify handoff needed**.
5. Route to [`aspire-orchestration`](../aspire-orchestration/SKILL.md) for first run
(`aspire start`).
## Workflow B — `aspire init` (existing repo)
For repositories that already contain services (Express API, .NET API, Python service, etc.)
and need an AppHost added alongside them:
1. Verify the [Detection](#detection) table — confirm **no** AppHost is present.
2. Run `aspire init`, choosing language explicitly for non-interactive flows:
```bash
aspire init --language csharp --non-interactive
# or
aspire init --language typescript --non-interactive
```
3. `aspire init` drops:
- The AppHost skeleton (`apphost.cs` with `#:sdk` directives, **or** `apphost.ts` with the
generated `.aspire/modules/` folder)
- AppHost configuration describing language + AppHost path
- The **`aspireify`** agent skill into the project's skill directory (same one
`aspire agent init` uses)
4. **Hand off to `aspireify`** — `aspire init` does **not** wire resources, projects, or
integrations on its own.
5. After `aspireify` finishes wiring, validate via `aspire start`
([`aspire-orchestration`](../aspire-orchestration/SKILL.md)).
See [references/init-workflow.md](references/init-workflow.md) for the full sequence
including what `aspire.config.json` contains and what to do if `aspire init` fails partway.
## Handoff Rules
| After `aspire init` / `aspire new` finishes... | Route To |
| ---------------------------------------------- | ------------------------------------------------------------- |
| Skeleton dropped, resources need wiring | → `aspireify` skill (in-plugin or project-local) |
| Skeleton dropped, validate it starts | → `aspire-orchestration` (run `aspire start`) |
| New project from template, ready to run | → `aspire-orchestration` |
| User asks to deploy after init | → `aspire-deployment` |
| User asks for logs/traces after init | → `aspire-monitoring` |
| Existing AppHost detected — do NOT run init | → `aspireify` (re-wire) or `aspire-orchestration` (lifecycle) |
## Project-Local Skill Override
If `.agents/skills/aspire-init/SKILL.md` exists project-locally (legacy install from an
older `aspire init` run), **warn the user and defer to it**. The legacy project-local skill
may carry repo-specific guidance that should not be overridden by this in-plugin skill.
The project-local `aspireify` skill (installed by `aspire init`) takes precedence
over this plugin's in-plugin `aspireify` for the same reason — defer to the project-local
copy and warn.
## Error Handling
| Symptom | Cause | Action |
| ---------------------------------------------------------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------- |
| `aspire init` reports AppHost already exists | Repo already has an AppHost | Stop. Route to `aspireify` (re-wire) or `aspire-orchestration` (lifecycle) |
| `aspire init` fails in non-interactive mode without `--language` | Multiple language paths available | Re-run with `--language csharp` or `--language typescript` |
| `aspire new` rejects `--output` path | Path exists and is non-empty | Use a different `--output` or empty the directory |
| `aspire` command not found | CLI not installed | `dotnet tool install -g Aspire.Cli` (.NET 10) or `curl -sSL https://aspire.dev/install.sh \| bash` |
| `aspire doctor` reports missing .NET 10 | SDK missing | Install .NET 10 SDK before retrying |
| `aspire init` succeeded but no `aspireify` skill installed | Agent skill directory not detected | Run `aspire agent init` to install `aspireify`, then continue wiring |
| Skeleton dropped but resources not wired | Expected — `aspire init` does not wire | Hand off to `aspireify` |
## References
- [templates.md](references/templates.md) — `aspire new` templates and options
- [init-workflow.md](references/init-workflow.md) — `aspire init` flow, `aspire.config.json`
layout, and `aspireify` handoff