一键导入
backend-scaffolding
Scaffolds Node.js/TypeScript backend components with CMDO architecture, driven by component settings.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Scaffolds Node.js/TypeScript backend components with CMDO architecture, driven by component settings.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Orchestrates SDD project initialization — version detection, environment verification, scaffolding, and git setup.
Manage project settings in sdd/sdd-settings.yaml including component settings that drive scaffolding.
Single gateway for all core↔tech-pack interactions. Reads manifests, resolves paths, loads skills/agents, routes commands.
Manage tasks and plans using the .tasks/ directory.
Standards for authoring SDD plugin agents — frontmatter, self-containment, skill references, and no-user-interaction rules.
Standards for authoring SDD plugin commands — frontmatter, user interaction, skill/agent invocation, CLI integration, and output formatting.
| name | backend-scaffolding |
| description | Scaffolds Node.js/TypeScript backend components with CMDO architecture, driven by component settings. |
| user-invocable | false |
Creates a Node.js/TypeScript backend component following the CMDO (Config, Model, DAL, Operator) architecture. Scaffolding is driven by component settings defined in sdd/sdd-settings.yaml. Delegate to the techpack-settings skill for the authoritative server settings schema — it accepts a component type (server) and returns the typed settings object including server_type, databases, provides_contracts, and framework defaults.
Use when creating server components. Supports multiple named instances (e.g., main-server, background-worker).
Server components are scaffolded based on their settings in sdd/sdd-settings.yaml. Delegate to the techpack-settings skill for the complete server settings schema and defaults — it returns server_type (express/fastify/nestjs), databases (array of referenced database component names), provides_contracts (array of contract component names), and framework-specific configuration.
// Pseudocode for settings-driven scaffolding
const scaffoldServer = async (component: ServerComponent): Promise<void> => {
// Always scaffold: core structure, operator lifecycle, model layer
await scaffoldCore(component);
// Conditional: HTTP routes (only if server provides contracts)
if (component.settings.provides_contracts.length > 0) {
await scaffoldRoutes(component, component.settings.provides_contracts);
}
// Conditional: API clients (only if server consumes contracts)
if (component.settings.consumes_contracts.length > 0) {
await scaffoldApiClients(component, component.settings.consumes_contracts);
}
// Conditional: DAL layer per database
for (const db of component.settings.databases) {
await scaffoldDAL(component, db);
}
};
components/servers/<name>/
├── package.json
├── tsconfig.json
├── .gitignore
└── src/
├── index.ts # Entry point
├── config/
│ ├── index.ts
│ └── load_config.ts # Config loading
├── operator/
│ ├── index.ts
│ ├── create_operator.ts # Operator factory
│ ├── lifecycle_probes.ts # Health/ready endpoints (port 9090)
│ ├── logger.ts # Structured logging
│ ├── metrics.ts # Metrics collection
│ └── state_machine.ts # Lifecycle state machine
├── controller/
│ ├── index.ts
│ └── create_controller.ts # Controller factory
└── model/
├── index.ts
├── dependencies.ts # Dependency injection interface
├── definitions/
│ └── index.ts # Empty barrel
└── use-cases/
└── index.ts # Empty barrel
server_type includes api)└── src/
└── operator/
└── create_http_server.ts # HTTP server setup (port 3000)
provides_contracts is non-empty)└── src/
└── controller/
└── http_handlers/
└── index.ts # Route handlers for contracts
databases is non-empty)For each database in databases, creates:
└── src/
└── dal/
└── <database-name>/
└── index.ts # DAL functions for this database
└── operator/
└── create_database_<name>.ts # Database connection setup
consumes_contracts is non-empty)For each contract in consumes_contracts, generates API client from contract spec.
| Layer | Purpose | Location |
|---|---|---|
| Config | Configuration loading and validation | src/config/ |
| Model | Business logic, definitions, use cases | src/model/ |
| DAL | Data Access Layer, database operations | src/dal/ |
| Operator | Application lifecycle, servers, telemetry | src/operator/ |
Plus Controller for HTTP request handling.
Servers live at components/servers/<name>/:
| Component Name | Directory |
|---|---|
main-server | components/servers/main-server/ |
background-worker | components/servers/background-worker/ |
| Variable | Description |
|---|---|
{{PROJECT_NAME}} | Project name |
{{PROJECT_DESCRIPTION}} | Project description |
{{PRIMARY_DOMAIN}} | Primary business domain |
{{SERVER_NAME}} | Server component name |
All templates are colocated in this skill's templates/ directory:
skills/components/backend/backend-scaffolding/templates/
├── package.json
├── tsconfig.json
├── .gitignore
└── src/
├── index.ts
├── config/
├── operator/
├── controller/
├── model/
└── dal/
When scaffolding a server component, the config section is generated based on settings.
Settings:
- name: main-server
type: server
settings:
server_type: api
databases: [primary-db]
provides_contracts: [public-api]
Generated config (components/config/envs/default/config.yaml):
main-server:
port: 3000
probesPort: 9090
logLevel: info
databases:
primary-db:
host: localhost
port: 5432
name: myapp
ssl: false
Settings:
- name: background-worker
type: server
settings:
server_type: worker
databases: []
provides_contracts: []
consumes_contracts: [public-api]
Generated config:
background-worker:
probesPort: 9090
logLevel: info
queue:
url: amqp://localhost:5672
apis:
public-api:
base_url: http://main-server:3000
To scaffold a backend component, build a spec with context flags derived from settings and invoke the engine:
<plugin-root>/fullstack-typescript/system/system-run.sh scaffolding apply --spec spec.json
| Variable | Source |
|---|---|
PROJECT_NAME | From sdd-settings.yaml project name |
SERVER_NAME | Component name |
CONTRACT_PACKAGE | @<project-name>/<contract-name> (from depends_on) |
| Flag | Derived From |
|---|---|
has_databases | settings.databases.length > 0 |
has_provides_contracts | settings.provides_contracts.length > 0 |
has_consumes_contracts | settings.consumes_contracts.length > 0 |
{
"target_dir": "<project-root>",
"base_dir": "<plugin-root>/skills",
"variables": {
"PROJECT_NAME": "<project-name>",
"SERVER_NAME": "<server-name>",
"CONTRACT_PACKAGE": "@<project-name>/<contract-name>"
},
"context": {
"has_databases": true,
"has_provides_contracts": true,
"has_consumes_contracts": false
},
"operations": [
{
"type": "template_dir",
"source": "components/backend/backend-scaffolding/templates",
"dest": "components/servers/<server-name>"
},
{
"type": "mkdir",
"path": "components/servers/<server-name>/src/dal",
"when": { "key": "has_databases", "equals": true }
},
{
"type": "mkdir",
"path": "components/servers/<server-name>/src/controller/http_handlers",
"when": { "key": "has_provides_contracts", "equals": true }
},
{
"type": "package_json_scripts",
"scripts": {
"<server-name>:dev": "npm run dev -w @<project-name>/<server-name>",
"<server-name>:build": "npm run build -w @<project-name>/<server-name>",
"<server-name>:start": "npm run start -w @<project-name>/<server-name>",
"<server-name>:test": "npm run test -w @<project-name>/<server-name>"
}
}
]
}
Schema: schemas/input.schema.json
Accepts component name, server type, and optional settings for databases, contracts, and Helm chart generation.
Schema: schemas/output.schema.json
Returns the scaffolding engine result: created files, directories, and scripts; skipped paths; errors; and a human-readable summary.
techpack-settings — Authoritative source for server component settings schema, defaults, and validation rules.backend-standards — Generated server code must follow these standards. Defines CMDO architecture with handler → orchestrator → repository layering, strict layer separation, and dependency injection.typescript-standards — Generated TypeScript files must follow these coding conventions. Defines strict typing, readonly patterns, branded types, and import standards.unit-testing — Generated test files must follow these patterns. Defines Vitest setup, mocking strategies, and isolation conventions for backend services.