Package Exports
- @vyuhlabs/create-devstack
- @vyuhlabs/create-devstack/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@vyuhlabs/create-devstack) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
@vyuhlabs/create-devstack
Scaffold production-ready development environments for any project. Generates devcontainers, then delegates to @vyuhlabs/dxkit for Makefiles, quality presets, CI workflows, and AI DX.
Quick Start
# New project (greenfield)
npm create @vyuhlabs/devstack my-project
# Existing project (brownfield)
cd existing-project
npx @vyuhlabs/create-devstack initWhat It Does
An interactive wizard asks you to choose:
- Languages — Python, Go, Node.js, Next.js, Rust, C#
- Infrastructure — PostgreSQL, Redis
- Quality preset — Strict (95%), Standard (80%), Relaxed (60%)
- Tools — Devcontainer, GitHub Actions, Pre-commit, Claude Code, gcloud, Pulumi, Infisical
Then generates:
| What | Owner | Description |
|---|---|---|
.project.yaml |
create-devstack | Your choices as config-as-code |
.devcontainer/ |
create-devstack | Dockerfile, docker-compose, devcontainer.json, post-create.sh |
Makefile |
dxkit | ~45 targets (test, quality, build, deploy, etc.) |
.project/ |
dxkit | Runtime scripts (quality, test, setup, session) |
| Language configs | dxkit | pyproject.toml, go.mod, tsconfig.json, etc. |
.github/workflows/ |
dxkit | CI and quality workflows |
.pre-commit-config.yaml |
dxkit | Language-conditional hooks |
.claude/ |
dxkit | AI agents, commands, skills, rules |
How It Works
create-devstack
│
├─ Interactive wizard → .project.yaml
├─ Devcontainer generator → .devcontainer/
│
└─ Calls: dxkit init --full
│
├─ Reads .project.yaml
└─ Generates everything elsecreate-devstack handles the dev environment (containers). dxkit handles everything else (build system, quality, CI, AI DX). The handoff is via .project.yaml — create-devstack writes it, dxkit reads it.
.project.yaml
The generated config file looks like:
project:
name: my-project
description: A web API for managing inventory
languages:
python:
enabled: true
version: '3.12'
quality:
coverage: 80
lint: true
typecheck: true
go:
enabled: true
version: '1.24.0'
quality:
coverage: 80
lint: true
infrastructure:
postgres:
enabled: true
version: '16'
tools:
claude_code: true
docker: true
precommit: true
gcloud: falseBrownfield (Existing Projects)
cd existing-project
npx @vyuhlabs/create-devstack initThe brownfield flow:
- Scans your project — detects languages, versions, frameworks, test runners, infrastructure, and tools
- Shows what it found and lets you confirm or adjust
- Respects existing files — won't overwrite your
.devcontainer/,.claude/, or configs - Generates only what's missing (
.project.yaml, devcontainer, then delegates to dxkit)
If .project.yaml already exists, you can keep it or reconfigure. If it's malformed, create-devstack falls back to detection.
Devcontainer
The generated .devcontainer/ is fully conditional:
- Dockerfile.dev — Only installs languages you selected (Python, Go, Node, Rust)
- docker-compose.yml — Only includes services you need (PostgreSQL, Redis)
- devcontainer.json — VS Code extensions matched to your stack
- post-create.sh — Setup scripts for selected languages and tools
Works in GitHub Codespaces, local Docker, VS Code Remote Containers, JetBrains Gateway, or the devcontainer CLI.
CLI Options
| Flag | Description |
|---|---|
--yes, -y |
Accept defaults, no prompts |
--lang <languages> |
Languages: python, go, node, nextjs, rust, csharp (comma-separated) |
--infra <services> |
Infrastructure: postgres, redis (comma-separated) |
--preset <name> |
Quality preset: strict, standard (default), relaxed |
--stealth |
Gitignore generated files (local-only, not committed) |
-d, --description |
Project description |
--version, -v |
Show version |
--help, -h |
Show help |
For greenfield, --yes requires --lang to specify at least one language. For brownfield (init), --yes auto-detects from the filesystem.
Stealth Mode
Use --stealth to keep generated files local — they're added to .gitignore so they won't be committed. Only files actually created in this run are gitignored (existing files are never touched). Consistent with dxkit's /stealth-mode.
npx @vyuhlabs/create-devstack init --yes --stealthExamples
# Interactive
npm create @vyuhlabs/devstack my-app
# Python project, standard quality
npm create @vyuhlabs/devstack my-app --yes --lang python
# Multi-language with postgres
npm create @vyuhlabs/devstack my-app --yes --lang python,go --infra postgres
# Node project with strict quality
npm create @vyuhlabs/devstack my-app --yes --lang node --preset strict
# Brownfield — auto-detect, accept all
npx @vyuhlabs/create-devstack init --yes
# Brownfield — local-only (stealth)
npx @vyuhlabs/create-devstack init --yes --stealthRequirements
- Node.js >= 18
- npm >= 9
Development
git clone https://github.com/vyuh-labs/create-devstack.git
cd create-devstack
npm install
npm run build
npm testScripts
| Script | Description |
|---|---|
npm run build |
Compile TypeScript |
npm run typecheck |
Type-check without emitting |
npm run lint |
ESLint |
npm run format |
Prettier |
npm test |
Vitest (watch mode) |
npm run test:run |
Vitest (single run) |
Git Hooks
- Pre-commit: lint + format staged files + typecheck
- Pre-push: run tests affected by changes (
vitest --changed)
Related
- @vyuhlabs/dxkit — AI-native developer experience toolkit
- codespaces-ai-template-v2 — Legacy template (being replaced by this package)
License
MIT