Skip to content
Back to skills

Local Dev Onboarding

ASecurity

Reviews how quickly and consistently a new developer can get a full-stack local environment (Angular + .NET API + SQL Server + Azure emulators) running. Flags no single documented clone-and-run quick-start, no docker-compose (or equivalent) bringing up backing services together, local configuration diverging from CI/staging, no seeded local database available out of the box, no documented minimum tool-version matrix, and onboarding docs that go stale silently with no check confirming they sti...

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 6, 2026
developmentrustgosqlangularnodedockerazuregitapidatabase

Works with

  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned September 6, 2026

npx -y skills add AgenticPawan/FullStack-Pilot --skill local-dev-onboarding --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Local Dev Onboarding?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Local Dev Onboarding
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/agenticpawan-local-dev-onboarding/badge)](https://www.skillsdirectory.com/skills/agenticpawan-local-dev-onboarding)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: local-dev-onboarding
description: Reviews how quickly and consistently a new developer can get a full-stack local environment (Angular + .NET API + SQL Server + Azure emulators) running. Flags no single documented clone-and-run quick-start, no docker-compose (or equivalent) bringing up backing services together, local configuration diverging from CI/staging, no seeded local database available out of the box, no documented minimum tool-version matrix, and onboarding docs that go stale silently with no check confirming they still work. Outputs findings with pilot-core local-dev-onboarding standard IDs.
when_to_use: local dev setup, onboarding, clone and run, docker-compose, Azurite, SQL Server emulator, dev environment, works on my machine, tool version matrix, seeded database, quick start, CONTRIBUTING.md, stale onboarding docs
---

## Standard IDs

| ID | Severity | What it checks |
|----|----------|-----------------|
| LDO-001 | P1 | No single documented "clone and run" quick-start path |
| LDO-002 | P1 | No docker-compose (or equivalent) bringing up backing services together |
| LDO-003 | P1 | Local configuration diverges from what CI/staging uses |
| LDO-004 | P2 | No seeded local database/reference data available out of the box |
| LDO-005 | P2 | No documented minimum tool-version matrix |
| LDO-006 | P2 | Onboarding docs go stale silently with no check they still work |

A new developer's first hour on a full-stack Angular + .NET + SQL Server + Azure project
sets the tone for how the whole team experiences the codebase's health. This skill treats
"can someone new get the app running today, without pinging three people" as a governance
concern in its own right, not a nice-to-have.

---

## Check A — No single documented "clone and run" quick-start (LDO-001)

### Detection

Check for a top-level `README.md` or `CONTRIBUTING.md` with an explicit, ordered
quick-start sequence (clone, install, configure, run) that takes a new developer from zero
to a running app. Its absence shows up as tribal knowledge — a new hire pinging three
different people for three different missing steps, each of whom only knows their own
corner of the stack.

### BAD — no consolidated setup doc; steps are scattered or unwritten

```markdown
<!-- README.md -->
# OrdersPlatform

A full-stack app. Ask in #orders-eng if you need help getting set up.
<!-- No steps at all. New developers reconstruct the setup by asking around. -->
```

### GOOD — one ordered quick-start covering the whole stack

```markdown
<!-- README.md -->
## Quick Start

1. `git clone https://github.com/org/orders-platform.git`
2. `cp .env.example .env` (see docs/dev-config.md for what each value means)
3. `docker compose up -d` — brings up SQL Server, Azurite, and Redis (see Check B)
4. `cd api && dotnet ef database update && dotnet run` — seeds and runs the API
5. `cd web && npm install && npm start` — runs the Angular dev server
6. Open http://localhost:4200 — log in with the seeded dev account (see docs/dev-config.md)

Total time from clone to running app: ~10 minutes on a clean machine.
```

---

## Check B — No docker-compose bringing up backing services together (LDO-002)

### Detection

Check for a `docker-compose.yml` (or equivalent) that starts every backing service the app
needs — SQL Server, Azurite (Storage emulator), Redis, a Service Bus emulator — as a single
step. Its absence forces each developer to install and configure every service manually,
which reliably produces environment drift between machines even on the same team.

### BAD — no compose file; each service is a separate manual install

```markdown
<!-- setup notes, tribal knowledge only -->
Install SQL Server Developer Edition locally. Also install Azurite via npm globally.
Configure both to run on startup. Ports may vary by machine.
```

### GOOD — one command brings up every backing service, pinned and consistent

```yaml
# docker-compose.yml
services:
  sql-server:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "${SQL_SA_PASSWORD}"
    ports: ["1433:1433"]

  azurite:
    image: mcr.microsoft.com/azure-storage/azurite:3.30.0
    ports: ["10000:10000", "10001:10001", "10002:10002"]

  redis:
    image: redis:7-alpine
    ports: ["6379:6379"]
```

```
docker compose up -d
# SQL Server, Azurite, and Redis are all running with the same versions
# every developer and CI runner uses.
```

---

## Check C — Local configuration diverges from CI/staging (LDO-003)

### Detection

Compare local `.env`/`appsettings.Development.json` defaults against what CI and staging
actually use (connection string format, port numbers, feature-flag defaults). Divergence
here is the classic source of "works on my machine, fails in CI" — a local SQL Server
running on a nonstandard port, or a local-only feature flag that's off everywhere else.

### BAD — local config uses a different connection-string shape than CI/staging

```json
// appsettings.Development.json
{ "ConnectionStrings": { "Orders": "Server=localhost,14330;Database=Orders;Trusted_Connection=True;" } }
```

```yaml
# CI uses a completely different shape, discovered only when a CI-only bug appears
env:
  ORDERS_CONNECTION: "Server=tcp:sql-server,1433;Database=Orders;User Id=sa;Password=${{ secrets.SQL_PW }};"
```

### GOOD — local config mirrors CI/staging's shape, differing only in the secret value

```json
// appsettings.Development.json — same shape as CI/staging, generated from .env.example
{ "ConnectionStrings": { "Orders": "Server=tcp:localhost,1433;Database=Orders;User Id=sa;Password=${SQL_SA_PASSWORD};" } }
```

```markdown
<!-- docs/dev-config.md -->
Local, CI, and staging all use the same TCP connection-string shape and the same
default port (1433, from docker-compose in Check B). Only the password/secret differs.
```

---

## Check D — No seeded local database out of the box (LDO-004)

### Detection

Check whether running the setup sequence leaves the local database populated with usable
reference data (a few customers, orders, an admin login) versus completely empty. An empty
database means a new developer can't exercise most real features until they either write
data by hand or figure out the seeding step nobody documented. This ties directly into
`test-data-management`'s synthetic-data-seeding guidance (Check B there) — the same
synthetic seed data built for safe lower-environment refreshes is the natural default for
local onboarding too.

### BAD — `dotnet run` starts an API against a schema with zero rows

```
dotnet ef database update
dotnet run
# API starts, but every list screen in the Angular app renders empty.
# New developer has no way to see what a populated order list even looks like
# without manually inserting rows first.
```

### GOOD — the same migration step seeds synthetic reference data automatically

```csharp
// Program.cs (Development environment only)
if (app.Environment.IsDevelopment())
{
    using var scope = app.Services.CreateScope();
    var db = scope.ServiceProvider.GetRequiredService<OrdersDbContext>();
    db.Database.Migrate();
    if (!db.Orders.Any())
    {
        db.Orders.AddRange(OrderSeedData.Generate(50)); // same Faker-based seed as
        db.SaveChanges();                                // test-data-management Check B
    }
}
```

---

## Check E — No documented minimum tool-version matrix (LDO-005)

### Detection

Check for a stated minimum-version table (Node, .NET SDK, Angular CLI, SQL Server edition)
versus letting each developer install whatever version they happen to have. Version
mismatches (Node 18 vs 20, .NET 8 vs 9 SDK) reliably produce bugs that only reproduce on
some machines and waste hours before anyone thinks to check tool versions at all.

### BAD — no version guidance anywhere; everyone installs "whatever's current"

```markdown
<!-- README.md -->
Install Node, .NET, and Angular CLI, then run npm install.
<!-- No versions specified. Two developers on Node 18 and Node 22 respectively
     hit different, unreproducible build errors. -->
```

### GOOD — an explicit, enforced version matrix

```markdown
<!-- docs/dev-config.md -->
| Tool          | Minimum version | Enforced by |
|---------------|-----------------|-------------|
| Node.js       | 20.x LTS        | `.nvmrc`, `engines` in package.json |
| .NET SDK      | 9.0             | `global.json` |
| Angular CLI   | 18.x            | package.json devDependency |
| SQL Server    | 2022 (via docker-compose, Check B) | pinned image tag |
```

```json
// package.json
{ "engines": { "node": ">=20.0.0 <21.0.0" } }
```

---

## Check F — Onboarding docs go stale silently (LDO-006)

### Detection

Check whether there's any mechanism — a CI job that runs the documented quick-start
end-to-end, or a periodic manual review — confirming the onboarding steps still work as
the stack evolves. Without one, a docker-compose version bump or a renamed environment
variable quietly breaks the quick-start, and nobody notices until the next new hire hits
it and assumes they made a mistake.

### BAD — onboarding docs haven't been touched in a year despite three stack upgrades since

```
docs/CONTRIBUTING.md   (last updated 14 months ago)
docker-compose.yml     (SQL Server image bumped twice since; compose file never
                        re-verified against the doc's stated steps)
<!-- No CI job or scheduled review ever re-runs the documented steps from scratch. -->
```

### GOOD — a scheduled CI job proves the quick-start still works, from a clean checkout

```yaml
# .github/workflows/onboarding-check.yml
name: Onboarding quick-start check
on:
  schedule:
    - cron: '0 6 * * 1' # weekly
  pull_request:
    paths: ['docker-compose.yml', 'README.md', 'docs/dev-config.md']
jobs:
  quick-start:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker compose up -d
      - run: cd api && dotnet ef database update && dotnet run &
      - run: cd web && npm install && npm start &
      - run: npx wait-on http://localhost:4200 http://localhost:5000/health
      # If the documented quick-start no longer produces a running app,
      # this job fails before a new developer discovers it the hard way.
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…