aspire-terminals
Skill93 starsChanged 28 days agoMITView on GitHub
**WORKFLOW SKILL** - Author and automate Aspire terminals. USE FOR: WithTerminal, withTerminal, TerminalService, TerminalLaunchOptions, docked terminals, terminal prompts, PromptTerminalAsync, TerminalPlacement, AspireTerminalKey, WithRepl, withRepl, aspire terminal ps/attach/tape play, VHS tapes for Aspire, or terminal screen/input automation. DO NOT USE FOR: generic shell commands, ordinary AppHost resource wiring (aspireify), start/stop/wait (aspire-orchestration), logs/traces or browser telemetry (aspire-monitoring), deployment (aspire-deployment), or nonterminal Interaction Service prompts (aspireify). INVOKES: Aspire docs/API lookup, AppHost edits, Aspire terminal CLI; aspire-orchestration for lifecycle validation. FOR SINGLE OPERATIONS: Choose the terminal owner and lifetime first, then read the matching reference.
In this repository16 other files it gives its agents.
- pr-reviewSkill
- aspire-deploymentSkill
- aspireifySkill
- aspire-initSkill
- aspire-monitoringSkill
- aspire-orchestrationSkill
- aspire-project-v2-migrationSkill
- aspireSkill
- aspire-deploymentSkill
- aspireifySkill
- aspire-initSkill
- aspire-monitoringSkill
- aspire-orchestrationSkill
- aspire-project-v2-migrationSkill
- aspireSkill
- aspire-terminalsSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. About 0 are common, 8 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 31
Before answering or editing, open the reference for the requested surface, including for read-only questions.
- Distinctive: line 60
When comparing terminal models, explicitly state cleanup for each model you recommend, including headless alternatives:
- Distinctive: line 77
If docs lag a preview, inspect that exact package's public API/source.
- Distinctive: line 82
Verify the installed build contains them.
- Very specific: line 91
Check aspire --version and aspire terminal --help for the installed CLI.
- Very specific: line 109
Read resource terminals for WithTerminal and built-in REPLs.
- Very specific: line 112
Keep terminal-specific edits separate from unrelated resource/dependency changes.
- Very specific: line 113
Use aspireify for new general resource wiring and aspire-init if no AppHost exists.
- Distinctive: line 116
Use argument lists, not concatenated untrusted shell input.
- Distinctive: line 119
Do not launch tools at model-construction time or during publish/deploy.
- Distinctive: line 121
Use the exact AppHost, worktree isolation and bounded resource readiness.
- Very specific: line 137
Check IInteractionService.IsAvailable before launching a prompt-owned process.
- Very specific: line 146
No public ExitCode or WaitForExitAsync is available on AspireTerminal.
- Very specific: line 147
Do not infer success from Start(), delivered keystrokes, prompt visibility, or disappearance of a process.
- Very specific: line 151
Treat screen output and tapes as sensitive.
- Distinctive: line 156
Read automation and CLI for C# screen/key operations, owner-aware discovery and interactive attach.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Aspire Terminals
Teach an agent to use the right terminal, not to replace every process with a shell.
Honor a project-local .agents/skills/aspire-terminals/SKILL.md when present;
retain the safety and ownership rules below.
Required reference lookup
Before answering or editing, open the reference for the requested surface, including for read-only questions. This overview is not enough to write correct terminal code or tape syntax.
- Resource PTYs or REPLs: read resource terminals.
- Dock, prompts, cancellation or headless tools: read AppHost terminals.
- Any tape question: read tapes and automation and CLI. Use the actual syntax and output contracts there, not pseudo-VHS or memory of upstream VHS behavior.
- Include the applicable package/build capability boundary in recommendations. Source availability and installed-package availability are different facts.
Choose the model before writing code
| Intent | Pattern | Owner and lifetime |
| Make an existing orchestrated executable, project or container interactive | WithTerminal() / withTerminal() | Resource process and replicas; resource lifecycle owns stop/restart |
| Open an auxiliary shell/tool that remains available after its command returns | TerminalService + TerminalPlacement.Dock | AppHost-owned; closing its tab or stopping AppHost disposes it |
| Guide a person through a focused setup/authentication operation | TerminalService + Dialog + PromptTerminalAsync | Caller owns the terminal; prompt borrows it; explicit completion/cancellation |
| Drive a terminal-only tool without a dashboard interaction | TerminalService + None | Caller owns and disposes the headless process |
| Open an authenticated database/cache client | Integration WithRepl() / withRepl() | Built-in command opens a dock terminal; prefer over custom container exec |
WithTerminal changes the resource's actual process execution. It is not an
on-demand side shell. TerminalService launches a separate AppHost-owned process;
it does not implicitly enter a container or become a modeled resource.
Lifecycle checklist for recommendations
When comparing terminal models, explicitly state cleanup for each model you recommend, including headless alternatives:
- Dock: survives the opening command; do not scope the handle with
await usingin that command. Closing the tab or AppHost shutdown disposes it. - Dialog and None: the caller disposes both, normally with
await using. Headless placement does not transfer cleanup responsibility to the service. - Prompt completion is not terminal disposal: successful
Workcloses the prompt, but the caller still disposes its terminal. WithoutWork, process exit does not close the prompt; explicit completion/cancellation is required.
Capability check
- Locate the exact AppHost and inspect its SDK, hosting and integration package versions. Do not upgrade the project just to make an example compile.
- Use
aspire docs search terminal --non-interactive, thenaspire docs api search <API> --language csharp|typescript --non-interactive. If docs lag a preview, inspect that exact package's public API/source. A newer CLI alone does not add hosting APIs to an older AppHost. WithTerminal/parameterless TSwithTerminalexist in Aspire 13.5.TerminalService, terminal prompts, headless automation, tape playback and the six integration REPLs below are in the inspected 13.6 development source. Verify the installed build contains them; do not promise all previews do.- Direct C# terminal APIs are experimental (
ASPIRETERMINAL001): narrowly pair#pragma warning disable ASPIRETERMINAL001with#pragma warning restore ASPIRETERMINAL001. The examined integrationWithReplmethods themselves do not require this suppression. - General
TerminalServiceand terminal-prompt APIs are not exported to TypeScript in this baseline. Do not invent TS equivalents or edit generated.aspire/modules/. Supported TS entry points arewithTerminal()and the applicable integration'swithRepl(). - Check
aspire --versionandaspire terminal --helpfor the installed CLI. Aspire 13.5 keeps terminal commands behind a feature flag; enable them only for that CLI line withaspire config set features.terminalCommandsEnabled true --non-interactive. Newer CLIs no longer require or support that flag. If a command remains absent, treat it as unavailable rather than guessing alternative syntax.
The references are qualified against Aspire release/13.6 commit
34db30a7d3733229da64a403dfc4e4e4d7a1a43b (terminal code also present in main
22bee5e1266b7b66ff53008957dde86efb370c79), compared with shipped v13.5.0.
Terminal-command availability guidance also reflects the subsequent
feature-flag removal.
Recheck capabilities against the user's actual build.
Authoring workflow
- Identify which process needs the PTY and whether it should remain visible, block a focused workflow, or run headlessly. Ask if the lifetime is unclear.
- Read resource terminals for
WithTerminaland built-in REPLs; read AppHost terminals for complete dock, manual prompt, automated prompt and headless recipes. - Keep terminal-specific edits separate from unrelated resource/dependency changes.
Use
aspireifyfor new general resource wiring andaspire-initif no AppHost exists. Do not turn a terminal request into a migration or version upgrade. - Resolve actual executable paths, working directories and OS shell choices. Use argument lists, not concatenated untrusted shell input. Children inherit the AppHost environment; add only the necessary overrides.
- Guard AppHost-owned terminal commands with
builder.ExecutionContext.IsRunMode. Do not launch tools at model-construction time or during publish/deploy. - Validate the changed code, then route lifecycle work to
aspire-orchestration. Use the exact AppHost, worktree isolation and bounded resource readiness. Validate the requested lifetime, cancellation and visible result, not merely that the AppHost compiled.
Non-negotiable ownership and completion rules
- Terminal types are in
Aspire.Hosting.ApplicationModel, not the oldAspire.Hosting.Terminalsnamespace.TerminalServiceis already registered; resolve it from built services or commandcontext.Services. Do not construct it or register another singleton. - A dock command that should leave a terminal open must not use
await usingfor its handle.Start()is nonblocking/idempotent;Show()activates the dock. Command success means "opened", not "process exited successfully". - Dialog and headless terminals normally use
await using. Disposing an AppHost-owned handle stops its process;PromptTerminalAsyncdoes not dispose it for you. - Check
IInteractionService.IsAvailablebefore launching a prompt-owned process. Noninteractive resource commands can make it false. Do not silently replace human interaction/approval with headless success. - A prompt needs the exact registered instance from the same AppHost, with
TerminalPlacement.Dialog.ResourceViewis not valid forCreateTerminal. - With
Work, successful callback completion closes the dialog; observeTerminalContext.CancellationTokenon every wait/input. Cancellation signals and joins Work; unrelated errors propagate. Without Work, process exit does not close the prompt: explicitly define completion/cancellation. - No public
ExitCodeorWaitForExitAsyncis available onAspireTerminal. Do not infer success fromStart(), delivered keystrokes, prompt visibility, or disappearance of a process. Assert a meaningful fresh output marker. - Viewers and automation share input.
--vieweraffects sizing ownership, not read-only authorization. Do not blindly retry non-idempotent input. - Treat screen output and tapes as sensitive. Do not commit credentials or
capture tokens in transcripts. Tape
Hideis not redaction.
Driving terminals
Read automation and CLI for C# screen/key
operations, owner-aware discovery and interactive attach. Use
tapes for unattended resource-terminal playback: supported
VHS syntax, explicit examples, stdout versus .txt/.ascii checkpoints, and
unsupported output formats. Do not install VHS or assume its whole feature set.
For missing/disconnected terminals, inspect resource state and terminal discovery;
route console logs/traces to aspire-monitoring. Terminal views supplement logs,
not replace them. Publishing a resource does not publish a development PTY or
grant production shell access.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

