Aspireify logo

Aspireify

Organization
microsoft
aspireify

**WORKFLOW SKILL** - Wire Aspire AppHosts or repair TypeScript AppHost toolchains. Scans the repo, proposes a resource graph, edits C#, file-based C#, or TypeScript AppHosts, wires ServiceDefaults + OTel, validates with `aspire start`, then stops. USE FOR: wire/scaffold AppHost, add Postgres/Redis/Rabbit/Mongo, connect frontend to API, after `aspire init`, AddNextJsApp, AddViteApp, WithBrowserLogs, WithTerminal, Interaction Service, command arguments, apphost.cs, apphost.mts, unified withEnvironment, .aspire/modules refusal, config/secrets, TS dependency restore, pnpm/yarn/bun, or Yarn Classic. DO NOT USE FOR: skeleton drop (aspire-init), lifecycle-only start/stop/wait/restart or `aspire update --migrate` (aspire-orchestration), publish/deploy/destroy (aspire-deployment), logs/traces (aspire-monitoring). INVOKES: aspire CLI, AppHost source edits, ServiceDefaults wiring. FOR SINGLE OPERATIONS: Run `aspire add PACKAGE` directly for a one-off integration.

Overview

Publishermicrosoft
Repositoryaspire-skills
Skill nameaspireify
Stars
93
Forks
12
Bundled files
11
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 11 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by microsoft on GitHub. Read the source before you install it.

Installation

Install the Aspireify AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/microsoft/aspire-skills/tree/main/skills/aspireify
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/microsoft/aspire-skills.git /tmp/aspire-skills
mkdir -p .claude/skills
cp -r /tmp/aspire-skills/skills/aspireify .claude/skills/aspireify
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Aspireify in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Aspireify on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Aspireify is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Aspireify

One-time wiring skill. aspire init drops a skeleton; aspireify turns that skeleton into a working AppHost by scanning the repo, proposing a resource graph, editing the AppHost, wiring Aspire.ServiceDefaults, and validating end to end. Self-deactivates after a clean aspire start.

🚫 Hard Refusal: Never Edit .aspire/modules/

⛔ REFUSE any request to edit, modify, change, open-for-edit, or "tweak" files inside .aspire/modules/ of a TypeScript AppHost. This directory is generated from the installed Aspire integration package graph. It is regenerated by aspire add, aspire restore, and startup when package changes require it.

If a user asks to edit something in .aspire/modules/ (e.g., .aspire/modules/postgres.module.ts), the correct response is:

  1. Refuse the edit with a clear "I won't edit .aspire/modules/" statement.
  2. Explain that .aspire/modules/ is generated and any changes are clobbered.
  3. Redirect the requested change to the configured AppHost entry point: current apphost.mts, or legacy apphost.ts.
  4. If the user wants a new integration, suggest aspire add <package>; if they want to change configuration, show the equivalent edit in the AppHost entry point.
❌ Wrong✅ Right
Open .aspire/modules/postgres.module.ts and tweak the connection optionsEdit apphost.mts and change addPostgres('pg', { ... }) options there
Modify a generated .aspire/modules/* file directlyRe-run aspire add <package> after updating apphost.mts
Comment out a line in .aspire/modules/ to disable a resourceRemove or guard the resource declaration in apphost.mts

This rule applies even if the user insists, even for "one-line" changes, even for "just to test something." The TS AppHost regenerates .aspire/modules/ deterministically; edits are unrecoverable noise.

Guiding Principles

Minimize changes to the user's code

Adapt the AppHost to fit the app, not the other way around. Prefer WithEnvironment() to match existing environment variable names, Aspire-managed ports over fixed ports, and 1:1 Docker Compose mapping before optimizing. Do not restructure directories, rename files, or change build scripts unless the user explicitly chooses that tradeoff.

Surface tradeoffs; do not decide silently

When a small code change unlocks better Aspire integration, present both options: the zero-code-change mapping and the small-change version that enables WithReference, health checks, service discovery, dynamic ports, or dashboard telemetry. Ask which approach the user wants, then implement that choice without complaint.

Verify APIs before writing AppHost code

Use aspire docs search <topic> and aspire docs get <slug> for workflow guidance. Use aspire docs api search <query> --language csharp|typescript and aspire docs api get <id> for API shape. Use aspire integration list/search to find integrations before aspire add. Do not invent packages, methods, overloads, or command shapes; C# and TypeScript AppHost APIs differ.

Keep configuration visible in the AppHost

Scan .env, .env.local, .env.development, secrets.json.example, <UserSecretsId>, and setup scripts. Propose migrating values into AppHost parameters: connection strings become Aspire resources, API keys/tokens become secret parameters, and non-secret config becomes plain parameters or WithEnvironment() values. Never delete .env files or remove existing UserSecretsId entries without explicit user approval because non-Aspire workflows may still depend on them.

Local development first

This skill optimizes local development, not production deployment. Prefer persistent container lifetimes and data volumes for databases/caches, use HTTPS endpoints by default, pass endpoint references instead of hardcoded URLs, and model external SaaS URLs/API keys as parameters so they are visible in the dashboard.

Redis TLS edge case

Aspire can automatically provision TLS certificates for container resources. If Redis health checks fail with SSL/TLS handshake errors, do not fall back to AddContainer(). Use WithoutHttpsCertificate() on the Redis resource when the consuming app expects plain Redis.

Project-Local Override

If .agents/skills/aspireify/SKILL.md exists (installed by aspire init or aspire agent init --skills aspireify), warn the user that a project-local copy is present and defer to it. The plugin version is the fallback.

⚠️ Project-local .agents/skills/aspireify/SKILL.md detected — deferring to it.

Prerequisites

RequirementInstall
.NET 10.0 SDK (C# AppHost)https://dotnet.microsoft.com/download
Node.js ^20.19.0, ^22.13.0, or >=24 (TS AppHost)https://nodejs.org
Aspire CLInpm install -g @microsoft/aspire-cli, install script, or dotnet tool install -g Aspire.Cli
Skeleton already droppedaspire init produced aspire.config.json + AppHost stub

Detection — When to Activate

Activate when ANY signal is present AND the AppHost is unwired (no resources declared beyond the stub):

SignalHow to DetectConfidence
Skeleton just droppedaspire init just ran in this session✅ Definitive
Empty AppHost stubapphost.cs / Program.cs / current apphost.mts (or legacy apphost.ts) only contains Build().Run()✅ Definitive
aspire.config.json without resourcesConfig present, AppHost has no AddProject/addProjectHigh
User asks to "wire" / "scaffold resource graph"Verb match: wire, scaffold, integrate, hook up, add Postgres/Redis/etc.High
User asks "what next after aspire init"Direct handoff request✅ Definitive
Existing repo with services + new AppHostRepo has .csproj/package.json projects but AppHost references noneHigh

If the AppHost already has wired resources and the user wants to start/stop the app → aspire-orchestration. If the user wants to deploy → aspire-deployment.

Language Support

AppHost StyleDetectionEdit Target
C# SDK-style.csproj containing <Sdk Name="Aspire.AppHost.Sdk" />Program.cs (top-level statements)
File-based C#apphost.cs with #:sdk Aspire.AppHost.Sdk and #:package directivesapphost.cs itself
TypeScriptCurrent apphost.mts or legacy apphost.ts with generated .aspire/modules/Configured AppHost entry point only — never edit .aspire/modules/

See references/csharp-authoring.md and references/typescript-authoring.md.

aspire-orchestration owns the CLI-driven migration from legacy apphost.ts. After it updates packages and migration artifacts, return to aspireify only when the user still needs AppHost source wiring or authoring.

TypeScript AppHost package managers

Dependency and toolchain failures belong to this skill. Before recommending a command, inspect the AppHost directory and then its immediate eligible parent. Within each directory, the first recognized marker wins in this order:

  1. packageManager in package.json (npm, pnpm, yarn, or bun, optionally versioned)
  2. bun.lock
  3. bun.lockb
  4. pnpm-lock.yaml
  5. yarn.lock
  6. .yarnrc.yml
  7. package-lock.json

An AppHost-local marker takes precedence over every parent marker. If neither directory has a recognized marker, Aspire defaults to npm. Report the selected manager and marker.

Use the selected manager only to repair dependencies or diagnose the toolchain. The resolver commands are npm install, bun install, and yarn install; a generated brownfield pnpm AppHost uses pnpm install --ignore-workspace, while other pnpm dependency installs use pnpm install. Yarn Classic (yarn@1... or a v1 lockfile) is unsupported: stop and ask the user to upgrade to Yarn 4+ or explicitly migrate to npm, pnpm, or Bun.

Do not change packageManager or create, replace, or regenerate a lockfile merely to influence detection or switch managers. Preserve existing files until the user explicitly chooses an upgrade or migration. Start the AppHost with aspire start --non-interactive, not a raw package-manager launcher. See references/typescript-authoring.md for the full command matrix and resolver details.

Workflow Phases

1. SCAN     → discover projects, services, dependencies, integration candidates
2. PROPOSE  → resource graph + integration list, confirm with user
3. EDIT     → wire AppHost, add ServiceDefaults + OTel + health checks
4. VALIDATE → aspire start --non-interactive → aspire wait <each resource>
5. DEACTIVATE → confirm clean start, hand off to aspire-orchestration

For the detailed, upstream-parity workflow, load these references before editing:

  • apphost-wiring.md — full AppHost wiring workflow, API lookup, endpoint/parameter patterns, validation, solution updates, and cleanup.
  • docker-compose.md — docker-compose migration, profiles, image mapping, ports, volumes, and depends_on.
  • full-solution-apphosts.md — large solution triage, mixed SDK boundaries, solution membership, ServiceDefaults placement, and legacy host migration.
  • javascript-apps.md — JavaScript resource selection, workspace/monorepo package-manager handling, ports, scripts, and TS AppHost package config.
  • opentelemetry.md — optional Node.js, Python, and Go OpenTelemetry wiring for non-.NET services.

1. Scan

Walk the repo and inventory:

WhatHow
.NET projectsfind . -name '*.csproj' -not -path '*/bin/*' -not -path '*/obj/*'
Node servicesfind . -name 'package.json' -not -path '*/node_modules/*'
Python servicesfind . -name 'pyproject.toml' -o -name 'requirements.txt'
Container deps in composedocker-compose.yml, compose.yaml (Postgres? Redis? Rabbit?)
Connection stringsgrep appsettings*.json, .env*, config/* for Postgres, Redis, Mongo, RabbitMQ, Cosmos, ServiceBus
Integration packagesdotnet list package per project; package.json dependencies
Existing endpointshardcoded ports in launchSettings.json, next.config.js, vite.config.ts

Full heuristics in references/scan-and-propose.md.

2. Propose

Present a resource graph before editing. Ask clarifying questions:

  • "I see Postgres in docker-compose.yml — should I model it as AddPostgres('db') or use Azure Database for PostgreSQL?"
  • "Your React app hardcodes http://localhost:5000 — replace with Aspire service discovery (endpoint.url)?"
  • "Your API has an /admin endpoint — exclude it from WithReference() so consumers don't see it?"

3. Edit

Apply the proposed graph. Use the right authoring style for the AppHost language.

4. Validate

bash
aspire start --non-interactive --format Json
aspire wait <resource>          # repeat for each declared resource
aspire describe --format Json   # sanity check graph

Full validation flow + recovery in references/validation.md.

5. Self-Deactivate

After a clean aspire start, announce:

✅ AppHost wired and validated. Handing off to aspire-orchestration for
   day-to-day start/stop/wait. Aspireify is done.

Integration Discovery Catalog

Map detected services → Aspire integrations. See references/scan-and-propose.md for the full catalog.

DetectedC#TS
Postgres in compose / Npgsql packageAddPostgres("pg").AddDatabase("db")addPostgres('pg').addDatabase('db')
Redis in compose / StackExchange.RedisAddRedis("cache")addRedis('cache')
RabbitMQAddRabbitMQ("mq") (v7 client w/ pub-sub tracing)addRabbitMQ('mq')
MongoDBAddMongoDB("mongo")addMongoDB('mongo')
Cosmos DBAddAzureCosmosDB("cosmos")addAzureCosmosDB('cosmos')
Azure Service BusAddAzureServiceBus("sb")addAzureServiceBus('sb')
Azure Cache for Redis (Entra)AddAzureRedis("cache") (now GA)addAzureRedis('cache')
Next.js frontendAddNextJsApp("web", "./web")addNextJsApp('web', '../web')
Vite SPAAddViteApp("web", "./web")addViteApp('web', '../web')
Plain Node appAddNodeApp("api", "server.js")addNodeApp('api', 'server.js')

Current Authoring Rules

RuleWhy
Use unified withEnvironment(name, value) in TS — never the deprecated per-kind helpers (withEnvironmentEndpoint, withEnvironmentParameter, etc.)Single API handles all value kinds; per-kind helpers are deprecated
Use AddNextJsApp / AddViteApp over hand-rolled Dockerfiles for JS frontendsFirst-class lifecycle + PublishAs* integration
Use PublishAsStaticWebsite / PublishAsNodeServer / PublishAsPackageScript for JS publishReplaces hand-rolled Dockerfiles; SPA → static, SSR Node → NodeServer, package-script SSR → PackageScript
Add WithBrowserLogs() to frontend resources for browser console + screenshots in dashboardAspire.Hosting.Browsers surfaces browser telemetry in the dashboard
Bind every resource to a compute environment with WithComputeEnvironment(env) when multiple environments existMulti-environment deploys require explicit binding
Never edit .aspire/modules/ in TS AppHostsGenerated; edits get clobbered. Edit the configured apphost.mts (or legacy apphost.ts) only
Use WithEndpoint("name", e => ...) to update endpointsEndpoint callbacks update existing endpoints rather than throwing on duplicates
Mark admin endpoints with ExcludeReferenceEndpoint = truePrevents consumers from receiving admin URLs via WithReference()
Look up unfamiliar API: aspire docs api search <query> --language csharp|typescriptDon't guess overloads or builder chains
Use context .Services / await ctx.services().getInteractionService().ServiceProvider is obsolete, and ctx.services() alone returns a services accessor
Use AddConnectionString for external connection stringsPublishAsConnectionString is obsolete
Check IInteractionService.IsAvailable before promptingCLI-invoked commands may be noninteractive; prefer command arguments for dashboard + CLI input
Treat WithTerminal() as experimentalSuppress ASPIRETERMINAL001; do not generate removed TerminalOptions.Shell or TypeScript dimension options
Keep all Aspire SDK and Aspire.Hosting.* packages on the same release familyMixed release families can fail at startup
Migrate GitHub Models integrations to Azure AI FoundryAspire.Hosting.GitHub.Models is deprecated and absent from integration discovery
Use WithModule(RedisModules.*) for Redis 8 modulesPrefer typed JSON, Search, Bloom Filter, and TimeSeries constants over raw module paths
Use Foundry AsHostedAgent(...) for hosted executable/container agentsCurrent Azure AI Foundry path replaces deprecated GitHub Models

C# vs TS Quick Reference

ConceptC#TypeScript
Buildervar builder = DistributedApplication.CreateBuilder(args);const builder = await createBuilder();
Add projectbuilder.AddProject<Projects.Api>("api") (SDK) or AddProject("api", "../Api/Api.csproj")await builder.addProject('api', '../Api/Api.csproj')
Wire env var (any value type).WithEnvironment("KEY", value).withEnvironment('KEY', value) ← unified API
Wait for dependency.WaitFor(db).waitFor(db)
Pass connection.WithReference(db).withReference(db)
External HTTP.WithExternalHttpEndpoints().withExternalHttpEndpoints()
Endpoint expressionapi.GetEndpoint("http")api.getEndpoint('http').url / .host / .port
Build + runbuilder.Build().Run();await builder.build().run();

ServiceDefaults Wiring

Each project should call builder.AddServiceDefaults(); to opt into OpenTelemetry, health checks, and service discovery. Add the Aspire.ServiceDefaults project reference (or NuGet for non-monorepo). See references/service-defaults.md.

Endpoint & Reference Conventions

csharp
// Public-facing API. Mark "admin" endpoint as not-for-consumers.
var api = builder.AddProject<Projects.Api>("api")
    .WithExternalHttpEndpoints()
    .WithEndpoint("admin", e => e.ExcludeReferenceEndpoint = true);

// Frontend wires the API via service discovery.
builder.AddNextJsApp("web", "./web")
    .WithReference(api)        // injects services__api__http and __https
    .WaitFor(api)
    .WithBrowserLogs();        // browser console + screenshots

Validation & Recovery

SymptomAction
aspire start fails with build errorFix code, re-run aspire start
File-lock errors during editHand off to aspire-orchestration → aspire stop → retry
Resource missing from aspire describeRe-run aspire describe --include-hidden; aspire ps is AppHost-level
TS AppHost change ignoredConfirm you edited the configured apphost.mts (or legacy apphost.ts), not .aspire/modules/
Mixed JSON output from aspire startStrip non-JSON lines before parsing (#15843)

Full flow in references/validation.md.

Handoff Rules

ScenarioRoute To
AppHost skeleton not yet dropped→ aspire-init skill
Day-to-day start/stop/wait/restart→ aspire-orchestration skill
Publish, deploy, destroy, pipeline steps→ aspire-deployment skill
Logs, traces, metrics, dashboard, browser log inspection→ aspire-monitoring skill
Deployed (Azure/AKS) app diagnostics→ azure-diagnostics skill (azure-skills)

Key Rules

  • Never overwrite existing files — always augment or merge.
  • Ask before modifying service code, especially OpenTelemetry and ServiceDefaults injection.
  • Respect existing project structure — do not reorganize the repo.
  • If stuck, use aspire doctor to diagnose environment issues.
  • Never hardcode URLs in WithEnvironment / withEnvironment — pass endpoint references such as api.GetEndpoint("http") or api.getEndpoint('http') instead of string literals.
  • Never use WithUrlForEndpoint / withUrlForEndpoint to set dev.localhost URLs — that API is only for dashboard display labels; dev.localhost belongs in AppHost launch/profile configuration.

References

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Aspireify AI skill do?

**WORKFLOW SKILL** - Wire Aspire AppHosts or repair TypeScript AppHost toolchains. Scans the repo, proposes a resource graph, edits C#, file-based C#, or TypeScript AppHosts, wires ServiceDefaults + OTel, validates with `aspire start`, then stops. USE FOR: wire/scaffold AppHost, add Postgres/Redis/Rabbit/Mongo, connect frontend to API, after `aspire init`, AddNextJsApp, AddViteApp, WithBrowserLogs, WithTerminal, Interaction Service, command arguments, apphost.cs, apphost.mts, unified withEnvironment, .aspire/modules refusal, config/secrets, TS dependency restore, pnpm/yarn/bun, or Yarn Clas...

Why use Aspireify on TypingMind?

Because you install it once and use it with any model. Aspireify is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Aspireify in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/microsoft/aspire-skills/tree/main/skills/aspireify. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Aspireify?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Aspireify?

As many as you like. As long as a model supports skills, you can use Aspireify with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Aspireify AI skill free?

Yes. It is published on GitHub by microsoft under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇