Five walkthroughs of things DetentShell does that a stock editor does not. Each one was checked against the app’s actual behavior before it was written down. For the keys behind these flows, see the shortcut reference.
The in-app testing loop (generate, fill, run, save) is powered by PesterForge Editor Edition, the free in-editor slice of PesterForge. Here is the whole loop, from a bare function to a saved test file:
- Put the caret inside a function and right-click → Generate Pester Tests (also on the Tools menu). With the caret inside a single function, generation starts immediately with no dialog. If the file has several functions and the caret sits outside all of them, a small picker lists them; choose one.
- The status bar shows “Generating tests for <Function>…” while the generation runs off the UI thread. Unsaved buffers work. The app sends the live editor text; you will not be told to save first.
- The result opens in a new tab named
<Function>.Tests.ps1, with a slim banner on top: “Testability: High/Medium/Low · N placeholders to fill.” The count is real. Generated stubs are skipped tests, and the banner never presents a stub file as done. - Click Next placeholder ▸ on the banner to jump the caret from stub to stub (it wraps around at the end). Replace each stub’s
Set-ItResult -Skippedbody with a real assertion. - Click Run these tests. Filled tests pass or fail on their merits, and unfilled stubs read skipped/pending rather than red, since a stub you have not written yet is not a failure.
- Save. The file picker opens pre-filled with the default path
Tests\Unit\<Function>.Tests.ps1under your project root, and asks before overwriting an existing test file. - Open the Pester panel’s coverage view to see every function’s covered/missing status, and use Generate for all missing to scaffold the rest in one click. A stub-only file counts as generated, not covered, until real assertions land.
Screenshot of the generated-test tab with its testability banner goes here. It will be captured from the launch build, not mocked up.
The one-click generate path is fully deterministic, always. There's nothing to turn on. No AI setting exists in the app today. More on the PesterForge page.
Quick Fix offers five script-hardening transforms: wrap in try/catch, add strict mode, add parameter validation, guard dangerous commands, and secure error messages. Every fix shows a preview first, and nothing is applied automatically.
- Put the caret inside the function you want to harden and choose Edit → Quick Fix… (or right-click → Quick Fix…).
- The app dry-runs all five fixes against that function’s text (strict mode always considers the whole file, since it belongs in the script preamble) and shows the results in one list.
- Read the list. A fix that would change something is listed by name. A fix that refuses (already present, nothing to guard, no catch blocks to sanitize) stays in the list with its reason stated in plain English.
- Some refusals get a “Do it anyway” row right below them. Picking it re-runs that one fix with its override switch, for the cases where forcing it could plausibly help.
- Pick a fix and click Preview: the before and after text sit side by side in read-only panes.
- Click Apply to splice the change in. Only the enclosing function’s span is touched; the rest of the file is left exactly as it was. Cancel at any point and the buffer stays untouched.
Screenshot of the Quick Fix list with a plain-English refusal and its “Do it anyway” row goes here once there’s a launch build to capture it from.
Quick Fix never writes to disk on its own. The dry-run produces text, the preview shows it, and only your explicit Apply changes the buffer. Saving is still your call.
Plenty of production scripts still have to run on Windows PowerShell 5.1. DetentShell lets you pin a tab to the engine the script actually ships on, and flags compatibility problems in both directions while you type.
- Use the engine dropdown in the toolbar: Auto, PowerShell 7, or Windows PowerShell 5.1. The choice is per tab, and flipping it changes which engine that tab’s next run uses. On Auto, the compatibility classifier chooses.
- Watch the read-only badge next to the dropdown. It classifies the current script Green, Yellow, or Red. Red means the script depends on something that only exists in Windows PowerShell 5.1 (for example
#Requires -PSEdition Desktop, workflows, or transaction cmdlets). - Write 5.1-era commands and the analyzer flags them with a modernization hint:
Get-WmiObjectgets “useGet-CimInstance,” snap-in cmdlets point atImport-Module, and removed features like workflows are marked as unable to run on PowerShell 7 at all. - The squiggles also work the other direction. PowerShell 7-only syntax (the ternary operator,
??and??=,?.and?[], pipeline chains&&/||,ForEach-Object -Parallel,clean {}blocks) is flagged as a break if the script later lands on a 5.1 host. - Guarded code stays quiet: a 5.1-ism inside an
if ($PSVersionTable.PSVersion.Major -lt 6) { … }block is recognized as deliberate and not flagged. - If you prefer 5.1 as your default, set the default engine preference in Settings and every new tab starts there. There is also File → Start Windows PowerShell 5.1 to launch a plain 5.1 console; it tells you if 5.1 is not installed on the machine.
Screenshot of the engine dropdown, the Green/Yellow/Red badge, and a both-directions squiggle pair goes here: same rule as the rest of this page, a real capture, not a mockup.
- Put the caret on a command and press
F1(or right-click → Help on Symbol). The Help pane opens with the fullGet-Helptext for that command, rendered in monospace so syntax and parameter blocks stay aligned. - If a documentation URL is known for the command, the Open online button is enabled, and one click opens the web docs.
- On a fresh PowerShell 7 install, local help is mostly auto-generated stubs. When the pane detects that, it shows a Run Update-Help button. The nudge appears only when the help really is thin, not on every lookup.
- Click it and the download runs in the background at CurrentUser scope (no elevation needed), with a “Downloading help…” indicator while it works. The routine per-module download errors
Update-Helpemits are handled quietly instead of interrupting you. - Help lookups run on a dedicated background runspace, never your session’s, so a slow or broken help subsystem cannot freeze the editor or pollute your variables.
Screenshot of the Help pane with the Run Update-Help nudge visible goes here when the launch build exists to capture it from.
- Press
Ctrl+Shift+Ror choose File → New Remote PowerShell Tab…. - Enter the target computer name. Optionally enter a username and password to connect as a different account; leave them blank to connect as your current Windows account. Connect stays disabled until a computer is named.
- Click Connect. The status bar shows “Connecting to <computer>…” with a Cancel option. The attempt has an enforced timeout, so a hanging target never freezes the window.
- On success you get a session tab titled “PowerShell N (user@computer)”. The remote target stays in the title the whole time, so you always know which machine a tab is talking to.
- If the connection fails, you get a readable message about what went wrong rather than a raw transport stack trace, and nothing half-created is left behind.
Screenshot of the New Remote PowerShell Tab dialog and a connected remote tab title goes here, same as the other slots on this page: real, not staged.
Connections run over WinRM, the same remoting layer Enter-PSSession uses. Credentials are held as a PSCredential (SecureString inside) from the moment you type them and are never written to logs.
The full gesture table is on the keyboard shortcuts page. For a first-run tour, see getting started; for the feature-by-feature view, the features page.
PS> Start-Process "https://detentpoint.com/detentshell/download"
# Coming soon — ships once the installer is code-signed
Coming soon. DetentShell launches at $29.99 in the Microsoft Store for its first two weeks. The regular price that follows is not final yet and will be published here first; volume licensing for teams is handled separately.