VS Command Center
An Activity Bar panel for the commands you run all the time — Salesforce CLI (sf / sfdx), Python automation, shell scripts, and one-off command lines — with output validation so a bad step stops the rest.
Open a folder, then open Command Center in the Activity Bar. A .vscc data folder is created only when you add your first command, batch, or suite.
In a multi-root workspace, only folders that already have Command Center data appear as collapsible sections. The title bar Add / Import / Export asks which folder to use; a folder without .vscc shows up after you save the first item there.
Features
- + to add a command, batch, or suite
- Each item has play, pencil (manage), and copy (clone). Delete is on the right-click menu, with confirmation.
- Clone duplicates the item with new script files so you can edit the copy without changing the original
- Export / Import (⋯ menu on the view title): zip selected suites, batches, and workspace-root commands. Import can overwrite matching ids or create clones
- Suite and batch parameters: name them on a suite or a batch, capture from a command's output with
(?<orgId>…), then use {{orgId}} in later scripts. Suite values are visible to every command under the suite; a batch parameter with the same name overrides. Templates stay on disk; values are inserted at run time.
- Batch — ordered commands. Play runs them in sequence
- Suite — ordered batches. Play runs every batch in order; each batch runs its commands. The first failed validation stops the suite
- Drag a batch onto a suite to nest it; drag it back to the root to ungroup
- Drag and drop, or Move Up / Move Down, to reorder
- Manage Command is a dialog with name, batch, type, validation regex, and a code box. Open in editor opens the script in a VS Code tab (full highlighting)
- Built-in types: Python, Command Line, Node.js, PowerShell, Free Command
- Add more languages in settings (
vsCommandCenter.languages)
- Command output appears in the Command Center output channel
Command types
| Type |
What you write |
How it runs |
| Python |
A .py script |
${python} ${file} (uses vsCommandCenter.pythonPath or the Python extension interpreter) |
| Command Line |
A shell script |
bash/sh when available; on Windows, Git Bash or a temporary .cmd |
| Node.js |
A .js script |
node ${file} |
| PowerShell |
A .ps1 script |
powershell -File |
| Free Command |
The full command line |
Run as-is through the platform shell, e.g. python -c "print(1+1)" or sf org list |
To add another language, edit Command Center: Languages in settings. Example Ruby:
{
"id": "ruby",
"label": "Ruby",
"kind": "file",
"fileExtension": ".rb",
"editorLanguage": "ruby",
"argv": ["ruby", "${file}"]
}
kind is file (save and execute a script) or free (editor text is the command line). Argv tokens: ${file}, ${workspaceFolder}, ${python}.
Suite and batch parameters
Define named parameters on a suite or a batch (pencil on that item). Example: orgId, default empty.
Suite parameters are available to every command in every batch under that suite. If a batch also defines the same name, that batch uses its own value while it runs — it does not overwrite the suite value. The next batch that does not define the name still sees the suite value.
- A command that produces the value uses Capture regex with a named group, e.g.
(?<orgId>\w+). Add a label in front (OrgId=(?<orgId>\w+)) only if you need to pick that occurrence out of a larger output.
- Later commands in the same suite or batch use
{{orgId}} in the script or free command line.
- A suite/batch run starts from each parameter's default (suite first, then batch), then fills values as captures succeed. A capture updates the batch parameter if that batch defines the name; otherwise it updates the suite parameter. Playing a single command also uses the last captured values from
state.json.
Numbered regex groups are not mapped automatically — name the group the same as the parameter.
Validation
- Leave the regex empty to accept any output (exit code still applies if “Require exit code 0” is on)
- Use a raw pattern (
Connected) or a literal (/ok/i)
- The pattern is tested against combined stdout and stderr
- Failure marks the command and stops a batch or suite at that command
- A new batch/suite run clears previous pass/fail icons first
Where commands are stored
Scripts live as real files in the workspace, not as strings stuffed into one JSON blob.
On first use the extension creates .vscc (or another name if that folder already exists and is not ours):
.vscc/
order.json # top-level mix of suites, batches, and ungrouped commands
__root__/batch.json # ungrouped commands
<batch-id>/batch.json # command order + validation
<batch-id>/<command-id>.py
<suite-id>/suite.json # batch order + suite parameters
The chosen folder name is stored as vsCommandCenter.dataFolder in .vscode/settings.json. Commit the data folder (except state.json) so the team shares the same command library. Older group.json files are still read and rewritten as batch.json.
Settings
| Setting |
Purpose |
vsCommandCenter.dataFolder |
Workspace-relative data folder (auto-filled) |
vsCommandCenter.pythonPath |
Python executable override |
vsCommandCenter.timeoutMs |
Per-command timeout (default 5 minutes) |
vsCommandCenter.languages |
Runtime list shown in the type dropdown |
Requirements
- Visual Studio Code 1.85 or later
- A local workspace folder (not an untrusted or virtual workspace)
- Interpreters on
PATH for the runtimes you use (python, node, sf, …)
License
MIT. Source: github.com/esancaro/vsCommandCenter.