VS Code-native AI engineering workflow system for microservices, libraries, and backend systems.
Project description
The VS Code-native AI workflow system for backend engineering.
vstack installs structured agents, skills, instructions, and prompts into .github/ so GitHub Copilot Agent Mode can run repeatable backend workflows with clear role boundaries.
It provides six delivery roles for end-to-end software work: product, architect, designer, engineer, tester, and release, coordinated by planner.
Best for
- Backend and API teams using GitHub Copilot Agent Mode in VS Code
- Repositories that want consistent planning, implementation, verification, and release flow
- Teams that want reusable AI workflows instead of one-off prompt crafting
What you get
- Fixed role model: six delivery roles plus a planner coordinator
- Template-driven install model from
src/vstack/_templates/ - Backend-first verification, security, and release discipline
- One runtime dependency: PyYAML
Building blocks
| Artifact type | Purpose | Typical invocation |
|---|---|---|
| Agents | Main operating interface for role-based work | @product, @tester |
| Skills | Reusable task procedures | /verify, /security |
| Instructions | Baseline policy and repository guardrails | auto-loaded by context |
| Prompts | Reusable prompt artifacts where direct prompting is useful | explicit prompt use |
Prompt catalog
Prompts are .prompt.md files installed to .github/prompts/. Invoke them via the
VS Code command palette (Chat: Run Prompt File) or the Copilot Chat attach button.
| Prompt | Purpose |
|---|---|
api-design-review |
Review an API design or OpenAPI spec for correctness |
architecture-risk |
Identify architectural risks and mitigation priorities |
code-review |
Review a change for bugs, regressions, and missing tests |
dependency-audit |
Audit dependencies for vulnerabilities and licence risks |
incident-timeline |
Build an evidence-based incident timeline and post-mortem |
migration-safety |
Review DB migration safety, rollback, and zero-downtime |
release-readiness |
Evaluate release readiness from reports and open blockers |
Quickstart — fresh install
Install with pipx, then install vstack artifacts into your repository:
# Install the CLI once, globally
pipx install vstack
# Move to your repository root and run install — no --target needed
cd /path/to/your/project
vstack install # seeds .vstack/config.yaml and generates .github/ in the current directory
vstack validate # confirm no errors
When you omit --target, vstack uses the current working directory. The equivalent
explicit form is vstack install --target /path/to/your/project.
Run a first task in Copilot Agent Mode:
@tester /verify Check this repository and summarize findings
Expected result:
vstack validatereports no unresolved template tokens- Agent command returns a concrete verification summary for your repository
Quick upgrade
Patch or minor version (e.g. v3.1 → v3.2, same major)
Docs paths never change within a major version. Only .github/ artifacts are updated.
pipx upgrade vstack
cd /path/to/your/project
vstack init # idempotent — safe to run in CI
Major version (e.g. v2 → v3)
Docs paths may change on a major version bump. Run vstack migrate before vstack init.
pipx upgrade vstack
cd /path/to/your/project
vstack migrate # moves docs files to their new paths (auto-detects installed version)
vstack init # regenerates .github/ artifacts
# Only if you see "Legacy manifest schema detected" in the output above:
vstack manifest upgrade
vstack init
Preview the docs moves without touching any files:
vstack migrate --dry-run
For upgrades spanning multiple major versions (e.g. v1 → v3), vstack migrate chains
all intermediate steps automatically. Use --from and --to to specify the range
explicitly if auto-detection from the manifest fails:
vstack migrate --from 1 --to 3
vstack init
Force reinstall (overwrite local edits)
vstack install --force # overwrite all managed artifacts
vstack install --force-name agent/engineer # overwrite one specific artifact
Why this helps
- Consistent role boundaries for planning, implementation, validation, and release
- Reusable skills and instructions instead of ad hoc prompts
- Better release hygiene with documented workflows and CI alignment
Core commands
vstack --version
vstack validate
# Run from your repository root (--target defaults to the current directory)
vstack install
vstack init
vstack migrate
vstack manifest verify
vstack manifest status
vstack manifest upgrade
# Or specify a path explicitly
vstack install --target /path/to/your/project
Common usage patterns
Repository-scoped install (recommended for teams):
# Move to your repository root and install there
cd /path/to/your/project
vstack install
# Or specify a path explicitly from any directory
vstack install --target /path/to/your/project
Profile-wide install (optional defaults for all projects):
vstack install --global
vstack install is the first-run command: it seeds .vstack/config.yaml in your project (never overwrites), then generates .github/ artifacts from templates. vstack init re-runs generation idempotently — safe to use in CI after upgrading vstack.
By default, vstack install preserves existing unmanaged files and local edits to tracked files by comparing the current file contents with the SHA-256 checksum recorded in .vstack/vstack.json. Use --adopt-name <name> to start tracking one existing unmanaged file without overwriting it. vstack uninstall also preserves locally modified tracked files unless you explicitly pass --force or --force-name <name>. Use vstack manifest status --target ... (or vstack status --target ...) to see what still matches the manifest. If a legacy manifest schema is detected, run vstack manifest upgrade --target ... first.
To skip artifact types or individual artifacts you do not need, edit .vstack/config.yaml:
exclude:
skills:
- terraform
- helm
instructions: all # skip the entire type
If you already have agents, skills, or other files in .github/, run a dry-run first to see what would be preserved before committing:
# Run from your repository root
vstack install --dry-run
The summary lists preserved files as type/name selectors (e.g. agent/engineer). Resolve each conflict with --force-name type/name to overwrite, --adopt-name type/name to take ownership without overwriting, or --force to overwrite everything.
Reading .vstack/config.yaml
- Lines starting with
#are comments, explanation, or example configuration and are not active. - Only uncommented YAML keys are active configuration.
- To enable an example block, remove
#from that block and keep valid YAML indentation. - After any config change, run
vstack initto apply it to generated.github/artifacts.
Workflow modes
vstack supports three workflow modes via .vstack/config.yaml:
workflow:
mode: agentic # default
After changing workflow.mode, regenerate artifacts:
vstack init
| Mode | Behavior | Planner file | Worker handoff buttons |
|---|---|---|---|
agentic |
Planner orchestrates stage progression using subagents | generated | omitted |
manual |
User progresses stage-by-stage manually | not generated | shown |
hybrid |
Both planner orchestration and manual handoffs are available | generated | shown |
Execution semantics:
workflow.stagesorder is the canonical progression order.agenticis stage-sequential by default: planner advances one stage at a time in configured order.- Set
depends_onto unlock a DAG topology and let planner run independent branches in parallel.
Parallel stages with depends_on: By default each stage implicitly depends on the previous one. Add depends_on to declare explicit predecessors. The canonical vstack DAG (seeded automatically by vstack install):
workflow:
mode: agentic
version: 1
stages:
- role: product
gate: required
hitl: always
- role: architect
gate: required
hitl: always
depends_on: [product]
- role: designer
gate: optional
hitl: on-change
depends_on: [product] # runs in parallel with architect
- role: engineer
gate: required
hitl: always
depends_on: [architect, designer] # waits for both
- role: tester
gate: required
hitl: always
depends_on: [engineer]
- role: release
gate: required
hitl: always
depends_on: [tester]
depends_on: [] marks a root stage. Absent depends_on falls back to sequential. Circular dependencies are caught at install/init time.
Handoff target semantics:
handoffs.promptis the transition prompt text.- If
handoffs.agentis omitted, the target defaults to the next role inworkflow.stages. - You can set
handoffs.agentexplicitly to override that default target inmanual/hybrid. - In
agentic, worker handoff buttons are hidden; planner controls progression.
Mode quickstart in Copilot Agent Mode:
In agentic mode, @planner is the primary entry point. Start every session with @planner and let it drive all stage transitions automatically.
| Mode | Start here | First prompt example |
|---|---|---|
agentic |
@planner |
@planner Run the workflow for this repository change. |
manual |
@product |
@product Define requirements for this change. |
hybrid |
@planner or @product |
@planner Run the workflow for this repository change. |
What planner does: reads workflow.stages and depends_on, invokes each role agent as a subagent at the right time, runs independent branches in parallel when depends_on permits, pauses at each gate for human approval, and reports a structured stage outcome after each step. Valid role names: product, architect, designer, engineer, tester, release.
Agentic runbook (copy/paste):
@planner Run the workflow for this repository change.
@planner Show current stage status, ready stages, blocked stages, and next action.
@planner Continue with all ready stages in parallel where workflow.depends_on allows it.
@planner Pause at required HITL gates and ask for approval before advancing.
@planner Finalize with a release-readiness summary and list changed artifacts.
Troubleshooting: why planner is not running stages in parallel
- Check
workflow.modein.vstack/config.yaml: parallel orchestration requiresagentic(or planner-ledhybrid). - Validate stage dependencies: run
vstack validateto catch invalid roles, self-dependencies, and cycles. - Inspect
depends_onshape: a stage runs only when all listed predecessors arereadyorskipped. - Check implicit sequential fallback: if
depends_onis omitted, the stage depends on the previous stage. - Check optional stage behavior:
gate: optionalcan be skipped when unaffected, reducing apparent parallel fan-out. - Check blockers in stage report: any
blockedpredecessor prevents dependent stages from becoming ready. - Check mixed execution path: in
hybrid, mixing manual handoffs and planner in one session can mask parallel readiness. - Confirm you started with planner: in
agentic, begin with@planner, not a worker role agent.
Usage guidance:
- Use
agenticwhen you want one deterministic orchestration path. - Use
manualwhen your team prefers explicit user-controlled stage transitions. - Use
hybridonly when your team intentionally wants both options.
Hybrid operating rule:
- Choose one path per session (planner-led or manual handoffs) and stay on it.
- Mixing both paths in one session increases the chance of duplicate stage transitions.
Hybrid warning:
- In
hybrid, users can click handoff buttons while a planner-led flow is also available. - This can cause unintended progression jumps or duplicated transitions if your process assumes one strict path.
Fast troubleshooting
- Command not found after install: ensure your
pipxbinary path is inPATH - Validation error: rerun
vstack installfrom your repository root and thenvstack validate - Agent results look generic: explicitly invoke a role (for example
@tester) before a skill
Full documentation
For complete documentation (including architecture details, workflow diagrams, and contributor guides), use GitHub:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vstack-3.3.0.tar.gz.
File metadata
- Download URL: vstack-3.3.0.tar.gz
- Upload date:
- Size: 214.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3ef932d875c3dfd005a7924385c29c24382b8385f2c139f580b946b6a63e828
|
|
| MD5 |
f7927041fb20e5a14d3f284b3d209b26
|
|
| BLAKE2b-256 |
e6362c31d49a9962a7a78c65abdf59a1089d8b9b274b2bf75d4f59f4183e7ff8
|
Provenance
The following attestation bundles were made for vstack-3.3.0.tar.gz:
Publisher:
publish.yml on eschaar/vstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vstack-3.3.0.tar.gz -
Subject digest:
e3ef932d875c3dfd005a7924385c29c24382b8385f2c139f580b946b6a63e828 - Sigstore transparency entry: 1520968524
- Sigstore integration time:
-
Permalink:
eschaar/vstack@d928ff3e69c8dcba52ecc619a56fc1aba1efeb93 -
Branch / Tag:
refs/tags/3.3.0 - Owner: https://github.com/eschaar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d928ff3e69c8dcba52ecc619a56fc1aba1efeb93 -
Trigger Event:
release
-
Statement type:
File details
Details for the file vstack-3.3.0-py3-none-any.whl.
File metadata
- Download URL: vstack-3.3.0-py3-none-any.whl
- Upload date:
- Size: 318.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28a827337474e47e9fd012b18344dc8a043b6f209cdc99a3699bfe013844bb7a
|
|
| MD5 |
2be2cdb27ae41b6e7703ab7081532223
|
|
| BLAKE2b-256 |
f982a9dc0c6f590249e2232fadf6d6c76ffeee4f5f859c64471b5627e5c7d3f8
|
Provenance
The following attestation bundles were made for vstack-3.3.0-py3-none-any.whl:
Publisher:
publish.yml on eschaar/vstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vstack-3.3.0-py3-none-any.whl -
Subject digest:
28a827337474e47e9fd012b18344dc8a043b6f209cdc99a3699bfe013844bb7a - Sigstore transparency entry: 1520968614
- Sigstore integration time:
-
Permalink:
eschaar/vstack@d928ff3e69c8dcba52ecc619a56fc1aba1efeb93 -
Branch / Tag:
refs/tags/3.3.0 - Owner: https://github.com/eschaar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d928ff3e69c8dcba52ecc619a56fc1aba1efeb93 -
Trigger Event:
release
-
Statement type: