When to use
- User says "start a new project", "scaffold a service", "bootstrap a repo".
- User wants to convert a single-file prototype into a proper package.
- User wants to standardise a team repo layout.
Do not use this skill to add a feature to an existing project or to migrate between stacks — those require narrower changes.
Inputs
- Stack: one of
ts-node, py-fastapi, go, rust.
- Project name (used for package name, module path, CLI binary).
- Optional: license (
MIT, Apache-2.0, BSD-3-Clause, proprietary). Default MIT.
- Optional: CI provider (
github default), container target (alpine or distroless).
- Optional: author/org for license and package metadata.
Outputs
A directory tree for the chosen stack with these always present:
- Formatter config (prettier / black+isort / gofmt+goimports / rustfmt).
- Linter config (eslint / ruff / golangci-lint / clippy).
- Test harness and a smoke test.
- Pre-commit hook config (
.pre-commit-config.yaml or equivalent).
- GitHub Actions workflow running lint, type-check, test on PRs.
.gitignore tailored to the stack.
README.md skeleton (see documentation skill).
- License file.
- Dockerfile (multi-stage, non-root, pinned base image).
.editorconfig and .gitattributes.
Tool dependencies
- Write / Edit for file creation.
- Bash for the user to run
git init, npm init -y, etc. Do not invoke tools that mutate their environment unless the user asks.
- See references/stack-templates.md for exact config snippets per stack.
Procedure
Confirm inputs. If the stack is ambiguous, ask. If a target directory exists and is non-empty, refuse to overwrite without explicit confirmation.
Create the directory tree for the stack:
ts-node: src/, src/index.ts, tests/, package.json, tsconfig.json, .eslintrc.cjs, .prettierrc, vitest.config.ts.
py-fastapi: src/<pkg>/, src/<pkg>/__init__.py, src/<pkg>/main.py, tests/, tests/test_smoke.py, pyproject.toml.
go: cmd/<name>/main.go, internal/, go.mod, Makefile.
rust: src/main.rs or src/lib.rs, Cargo.toml, rustfmt.toml, clippy.toml.
Write the files using the exact snippets in references/stack-templates.md, substituting the project name and license.
Add the common files across all stacks: .gitignore, .editorconfig, .gitattributes, LICENSE, README.md, Dockerfile, .github/workflows/ci.yml, .pre-commit-config.yaml, CHANGELOG.md seed.
Add a smoke test that exercises the entry point and is wired into CI. A repo with passing CI on commit #1 is the bar.
Print the next-steps block: init git, install deps, run tests, run lint, install pre-commit hooks, open in the IDE.
Examples
Happy path: TypeScript/Node service named "inv-api"
Tree (abbreviated):
inv-api/
src/
index.ts
server.ts
tests/
server.test.ts
package.json
tsconfig.json
.eslintrc.cjs
.prettierrc
vitest.config.ts
.editorconfig
.gitignore
.gitattributes
LICENSE
README.md
Dockerfile
.github/workflows/ci.yml
.pre-commit-config.yaml
src/index.ts:
import { createServer } from './server';
const port = Number(process.env.PORT ?? 3000);
createServer().listen(port, () => console.log(`listening on :${port}`));
src/server.ts:
import express from 'express';
export function createServer() {
const app = express();
app.get('/healthz', (_req, res) => res.json({ status: 'ok' }));
return app;
}
tests/server.test.ts:
import request from 'supertest';
import { createServer } from '../src/server';
it('GET /healthz returns ok', async () => {
const res = await request(createServer()).get('/healthz');
expect(res.status).toBe(200);
expect(res.body).toEqual({ status: 'ok' });
});
Next-steps block:
git init && git add -A && git commit -m "chore: scaffold inv-api"
pnpm install
pnpm test
pnpm lint
pre-commit install
Edge case: Python FastAPI with a library layout
User asked for py-fastapi with package name reporting_api, Apache-2.0 license, distroless container.
Tree:
reporting-api/
src/reporting_api/
__init__.py
main.py
deps.py
tests/
test_smoke.py
conftest.py
pyproject.toml
ruff.toml
.editorconfig
.gitignore
.gitattributes
LICENSE # Apache-2.0
NOTICE
README.md
Dockerfile # multi-stage, gcr.io/distroless/python3-debian12
.github/workflows/ci.yml
.pre-commit-config.yaml
Smoke test exercises /healthz via httpx.AsyncClient and TestClient; CI runs ruff check, ruff format --check, pyright, pytest -q.
Constraints
- Never scaffold into a non-empty directory without explicit confirmation.
- Never pin tool versions to "latest"; pin to a concrete version and note it.
- Never write secrets into
.env; write .env.example with placeholder values.
- Never commit generated artifacts (
dist/, target/, node_modules/, .venv/, __pycache__/) — .gitignore must exclude them.
- Never drop the license. Default to MIT if the user does not choose.
- Do not add optional dependencies "in case you need them"; start minimal.
- Do not set up CI steps that cannot run on commit #1 (do not require external secrets for the initial workflow).
Quality checks
git init && <install deps> && <test> && <lint> && <build> all succeed on a clean clone.
- CI workflow runs lint, type-check, and tests, and reports green on the initial commit.
- Dockerfile builds and the resulting image passes the smoke test.
- Pre-commit hooks install and run clean against the initial tree.
.gitignore excludes all generated artifacts for the stack.
- License file matches the chosen SPDX identifier exactly.
- README quickstart matches the scripts in the manifest.
Source: tahirraufkeeyu/software-development-agent-stack--sdas — distributed by TomeVault.
1---2name: project-bootstrap-43description: Use when the user asks to scaffold a new project, start a repo from scratch, or set up a greenfield service in TypeScript/Node, Python/FastAPI, Go, or Rust. Produces a working layout with linting, formatting, tests, pre-commit hooks, GitHub Actions CI, a Dockerfile, a .gitignore, a README skeleton, and a license file.4---56## When to use78- User says "start a new project", "scaffold a service", "bootstrap a repo".9- User wants to convert a single-file prototype into a proper package.10- User wants to standardise a team repo layout.1112Do not use this skill to add a feature to an existing project or to migrate between stacks — those require narrower changes.1314## Inputs1516- Stack: one of `ts-node`, `py-fastapi`, `go`, `rust`.17- Project name (used for package name, module path, CLI binary).18- Optional: license (`MIT`, `Apache-2.0`, `BSD-3-Clause`, proprietary). Default `MIT`.19- Optional: CI provider (`github` default), container target (`alpine` or `distroless`).20- Optional: author/org for license and package metadata.2122## Outputs2324A directory tree for the chosen stack with these always present:2526- Formatter config (prettier / black+isort / gofmt+goimports / rustfmt).27- Linter config (eslint / ruff / golangci-lint / clippy).28- Test harness and a smoke test.29- Pre-commit hook config (`.pre-commit-config.yaml` or equivalent).30- GitHub Actions workflow running lint, type-check, test on PRs.31- `.gitignore` tailored to the stack.32- `README.md` skeleton (see `documentation` skill).33- License file.34- Dockerfile (multi-stage, non-root, pinned base image).35- `.editorconfig` and `.gitattributes`.3637## Tool dependencies3839- Write / Edit for file creation.40- Bash for the user to run `git init`, `npm init -y`, etc. Do not invoke tools that mutate their environment unless the user asks.41- See [references/stack-templates.md](references/stack-templates.md) for exact config snippets per stack.4243## Procedure44451. Confirm inputs. If the stack is ambiguous, ask. If a target directory exists and is non-empty, refuse to overwrite without explicit confirmation.462. Create the directory tree for the stack:4748 - `ts-node`: `src/`, `src/index.ts`, `tests/`, `package.json`, `tsconfig.json`, `.eslintrc.cjs`, `.prettierrc`, `vitest.config.ts`.49 - `py-fastapi`: `src/<pkg>/`, `src/<pkg>/__init__.py`, `src/<pkg>/main.py`, `tests/`, `tests/test_smoke.py`, `pyproject.toml`.50 - `go`: `cmd/<name>/main.go`, `internal/`, `go.mod`, `Makefile`.51 - `rust`: `src/main.rs` or `src/lib.rs`, `Cargo.toml`, `rustfmt.toml`, `clippy.toml`.52533. Write the files using the exact snippets in [references/stack-templates.md](references/stack-templates.md), substituting the project name and license.544. Add the common files across all stacks: `.gitignore`, `.editorconfig`, `.gitattributes`, `LICENSE`, `README.md`, `Dockerfile`, `.github/workflows/ci.yml`, `.pre-commit-config.yaml`, `CHANGELOG.md` seed.555. Add a smoke test that exercises the entry point and is wired into CI. A repo with passing CI on commit #1 is the bar.566. Print the next-steps block: init git, install deps, run tests, run lint, install pre-commit hooks, open in the IDE.5758## Examples5960### Happy path: TypeScript/Node service named "inv-api"6162Tree (abbreviated):6364```65inv-api/66 src/67 index.ts68 server.ts69 tests/70 server.test.ts71 package.json72 tsconfig.json73 .eslintrc.cjs74 .prettierrc75 vitest.config.ts76 .editorconfig77 .gitignore78 .gitattributes79 LICENSE80 README.md81 Dockerfile82 .github/workflows/ci.yml83 .pre-commit-config.yaml84```8586`src/index.ts`:8788```ts89import { createServer } from './server';9091const port = Number(process.env.PORT ?? 3000);92createServer().listen(port, () => console.log(`listening on :${port}`));93```9495`src/server.ts`:9697```ts98import express from 'express';99export function createServer() {100 const app = express();101 app.get('/healthz', (_req, res) => res.json({ status: 'ok' }));102 return app;103}104```105106`tests/server.test.ts`:107108```ts109import request from 'supertest';110import { createServer } from '../src/server';111112it('GET /healthz returns ok', async () => {113 const res = await request(createServer()).get('/healthz');114 expect(res.status).toBe(200);115 expect(res.body).toEqual({ status: 'ok' });116});117```118119Next-steps block:120121```122git init && git add -A && git commit -m "chore: scaffold inv-api"123pnpm install124pnpm test125pnpm lint126pre-commit install127```128129### Edge case: Python FastAPI with a library layout130131User asked for `py-fastapi` with package name `reporting_api`, Apache-2.0 license, distroless container.132133Tree:134135```136reporting-api/137 src/reporting_api/138 __init__.py139 main.py140 deps.py141 tests/142 test_smoke.py143 conftest.py144 pyproject.toml145 ruff.toml146 .editorconfig147 .gitignore148 .gitattributes149 LICENSE # Apache-2.0150 NOTICE151 README.md152 Dockerfile # multi-stage, gcr.io/distroless/python3-debian12153 .github/workflows/ci.yml154 .pre-commit-config.yaml155```156157Smoke test exercises `/healthz` via `httpx.AsyncClient` and `TestClient`; CI runs `ruff check`, `ruff format --check`, `pyright`, `pytest -q`.158159## Constraints160161- Never scaffold into a non-empty directory without explicit confirmation.162- Never pin tool versions to "latest"; pin to a concrete version and note it.163- Never write secrets into `.env`; write `.env.example` with placeholder values.164- Never commit generated artifacts (`dist/`, `target/`, `node_modules/`, `.venv/`, `__pycache__/`) — `.gitignore` must exclude them.165- Never drop the license. Default to MIT if the user does not choose.166- Do not add optional dependencies "in case you need them"; start minimal.167- Do not set up CI steps that cannot run on commit #1 (do not require external secrets for the initial workflow).168169## Quality checks170171- `git init && <install deps> && <test> && <lint> && <build>` all succeed on a clean clone.172- CI workflow runs lint, type-check, and tests, and reports green on the initial commit.173- Dockerfile builds and the resulting image passes the smoke test.174- Pre-commit hooks install and run clean against the initial tree.175- `.gitignore` excludes all generated artifacts for the stack.176- License file matches the chosen SPDX identifier exactly.177- README quickstart matches the scripts in the manifest.178179---180> Source: [tahirraufkeeyu/software-development-agent-stack--sdas](https://github.com/tahirraufkeeyu/software-development-agent-stack--sdas) — distributed by [TomeVault](https://tomevault.io).181<!-- tomevault:4.0:skill_md:2026-05-22 -->