@eskoubar95/spec 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/copy-template.js +6 -6
- package/dist/lib/copy-template.js.map +1 -1
- package/package.json +2 -2
- package/template/.cursor/MCP-SETUP.md +16 -0
- package/template/.cursor/agents/batch-runner.md +52 -0
- package/template/.cursor/agents/verifier.md +40 -0
- package/template/.cursor/commands/_shared/branch-detection.md +78 -0
- package/template/.cursor/commands/_shared/git-workflow.md +3 -1
- package/template/.cursor/commands/_shared/github-workflows.md +7 -5
- package/template/.cursor/commands/_shared/helper-metadata.md +20 -0
- package/template/.cursor/commands/_shared/linear-automation.md +14 -6
- package/template/.cursor/commands/_shared/linear-helpers.md +26 -14
- package/template/.cursor/commands/_shared/pr-description.md +11 -2
- package/template/.cursor/commands/spec/init.md +249 -15
- package/template/.cursor/commands/spec/plan.md +302 -7
- package/template/.cursor/commands/spec/refine.md +80 -2
- package/template/.cursor/commands/task/batch.md +112 -0
- package/template/.cursor/commands/task/start.md +318 -5
- package/template/.cursor/commands/task/validate.md +396 -1
- package/template/.cursor/rules/02-work-mode.mdc +71 -0
- package/template/.cursor/rules/openmemory.mdc +1 -1
- package/template/.cursor/scripts/{validate-helpers.js → validate-helpers.cjs} +30 -32
- package/template/.cursor/skills/sdd-commit-unit/SKILL.md +42 -0
- package/template/.cursor/skills/sdd-design-system-bootstrap/SKILL.md +35 -0
- package/template/.cursor/skills/sdd-git-default-branch/SKILL.md +49 -0
- package/template/.cursor/skills/sdd-pr-create-or-update/SKILL.md +41 -0
- package/template/.cursor/skills/sdd-task-preflight/SKILL.md +47 -0
- package/template/.cursor/skills/sdd-validation-suite/SKILL.md +47 -0
- package/template/spec/00-root-spec.md +9 -0
- package/template/spec/templates/02-architecture.md +64 -0
- package/template/spec/templates/06-acceptance.md +59 -0
- package/template/spec/templates/07-design-system.md +145 -0
- package/template/spec/templates/08-infrastructure.md +76 -0
- package/template/spec/templates/09-sitemap.md +50 -0
- package/template/work/backlog/tasks.local.md +6 -0
- package/template/work/linear/FALLBACK-STRATEGY.md +84 -0
- package/template/work/linear/LABEL-MAPPING-GUIDE.md +72 -0
- package/template/work/linear/SETUP.md +75 -0
- package/template/work/linear/sync-config.md +86 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Helper Metadata Validation Script
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* Validates helper metadata for consistency and correctness:
|
|
7
7
|
* - All helpers have YAML frontmatter
|
|
8
8
|
* - Section line ranges match actual section markers
|
|
@@ -33,17 +33,17 @@ function log(message, color = 'reset') {
|
|
|
33
33
|
function parseYAMLFrontmatter(content) {
|
|
34
34
|
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
35
35
|
if (!frontmatterMatch) return null;
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
const frontmatter = {};
|
|
38
38
|
const lines = frontmatterMatch[1].split('\n');
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
let currentKey = null;
|
|
41
41
|
let currentValue = [];
|
|
42
42
|
let inArray = false;
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
for (const line of lines) {
|
|
45
45
|
if (line.trim() === '') continue;
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
// Check for array start
|
|
48
48
|
if (line.match(/^(\s*)([a-z_]+):\s*$/)) {
|
|
49
49
|
if (currentKey) {
|
|
@@ -54,13 +54,13 @@ function parseYAMLFrontmatter(content) {
|
|
|
54
54
|
inArray = true;
|
|
55
55
|
continue;
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
// Check for array item
|
|
59
59
|
if (inArray && line.match(/^\s*-\s*(.+)$/)) {
|
|
60
60
|
currentValue.push(line.match(/^\s*-\s*(.+)$/)[1]);
|
|
61
61
|
continue;
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
// Check for key-value
|
|
65
65
|
if (line.match(/^(\s*)([a-z_]+):\s*(.+)$/)) {
|
|
66
66
|
if (currentKey) {
|
|
@@ -72,25 +72,25 @@ function parseYAMLFrontmatter(content) {
|
|
|
72
72
|
inArray = false;
|
|
73
73
|
continue;
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
// Check for nested structure (sections)
|
|
77
77
|
if (line.match(/^\s+([a-z_]+):/)) {
|
|
78
78
|
// This is a nested key, skip for now (simplified parsing)
|
|
79
79
|
continue;
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
if (currentKey) {
|
|
84
84
|
frontmatter[currentKey] = currentValue.length === 1 ? currentValue[0] : currentValue;
|
|
85
85
|
}
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
return frontmatter;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function findSectionMarkers(content) {
|
|
91
91
|
const sections = [];
|
|
92
92
|
const lines = content.split('\n');
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
for (let i = 0; i < lines.length; i++) {
|
|
95
95
|
const line = lines[i];
|
|
96
96
|
const sectionMatch = line.match(/^## Section: (.+?) \(Lines (\d+)-(\d+)\)$/);
|
|
@@ -103,7 +103,7 @@ function findSectionMarkers(content) {
|
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
-
|
|
106
|
+
|
|
107
107
|
return sections;
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -111,14 +111,14 @@ function validateHelper(helperFile) {
|
|
|
111
111
|
const filePath = path.join(HELPERS_DIR, helperFile);
|
|
112
112
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
113
113
|
const issues = [];
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
// 1. Check frontmatter exists
|
|
116
116
|
const frontmatter = parseYAMLFrontmatter(content);
|
|
117
117
|
if (!frontmatter) {
|
|
118
118
|
issues.push({ type: 'error', message: 'Missing YAML frontmatter' });
|
|
119
119
|
return { file: helperFile, issues };
|
|
120
120
|
}
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
// 2. Check required fields
|
|
123
123
|
const requiredFields = ['helper_id', 'load_when', 'sections', 'always_load'];
|
|
124
124
|
for (const field of requiredFields) {
|
|
@@ -126,7 +126,7 @@ function validateHelper(helperFile) {
|
|
|
126
126
|
issues.push({ type: 'error', message: `Missing required field: ${field}` });
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
-
|
|
129
|
+
|
|
130
130
|
// 3. Check section markers match metadata
|
|
131
131
|
const sections = findSectionMarkers(content);
|
|
132
132
|
if (sections.length > 0 && frontmatter.sections) {
|
|
@@ -141,23 +141,22 @@ function validateHelper(helperFile) {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
return { file: helperFile, frontmatter, sections, issues };
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
function validateRegistry() {
|
|
149
149
|
const content = fs.readFileSync(METADATA_FILE, 'utf-8');
|
|
150
|
-
const helperFiles = fs.readdirSync(HELPERS_DIR)
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
const helperFiles = fs.readdirSync(HELPERS_DIR).filter((f) => f.endsWith('.md') && f !== 'helper-metadata.md');
|
|
151
|
+
|
|
153
152
|
const registryHelpers = [];
|
|
154
153
|
const registryMatch = content.match(/### ([a-z-]+)\.md/g);
|
|
155
154
|
if (registryMatch) {
|
|
156
|
-
registryHelpers.push(...registryMatch.map(m => m.replace('### ', '').replace('.md', '')));
|
|
155
|
+
registryHelpers.push(...registryMatch.map((m) => m.replace('### ', '').replace('.md', '')));
|
|
157
156
|
}
|
|
158
|
-
|
|
157
|
+
|
|
159
158
|
const issues = [];
|
|
160
|
-
|
|
159
|
+
|
|
161
160
|
// Check all helpers are in registry
|
|
162
161
|
for (const helperFile of helperFiles) {
|
|
163
162
|
const helperId = helperFile.replace('.md', '');
|
|
@@ -168,7 +167,7 @@ function validateRegistry() {
|
|
|
168
167
|
});
|
|
169
168
|
}
|
|
170
169
|
}
|
|
171
|
-
|
|
170
|
+
|
|
172
171
|
// Check registry has all helpers
|
|
173
172
|
for (const registryHelper of registryHelpers) {
|
|
174
173
|
if (!helperFiles.includes(`${registryHelper}.md`)) {
|
|
@@ -178,20 +177,19 @@ function validateRegistry() {
|
|
|
178
177
|
});
|
|
179
178
|
}
|
|
180
179
|
}
|
|
181
|
-
|
|
180
|
+
|
|
182
181
|
return { helperFiles, registryHelpers, issues };
|
|
183
182
|
}
|
|
184
183
|
|
|
185
184
|
function main() {
|
|
186
185
|
log('🔍 Validating Helper Metadata...\n', 'blue');
|
|
187
|
-
|
|
188
|
-
const helperFiles = fs.readdirSync(HELPERS_DIR)
|
|
189
|
-
|
|
190
|
-
|
|
186
|
+
|
|
187
|
+
const helperFiles = fs.readdirSync(HELPERS_DIR).filter((f) => f.endsWith('.md') && f !== 'helper-metadata.md');
|
|
188
|
+
|
|
191
189
|
let totalIssues = 0;
|
|
192
190
|
let totalErrors = 0;
|
|
193
191
|
let totalWarnings = 0;
|
|
194
|
-
|
|
192
|
+
|
|
195
193
|
// Validate each helper
|
|
196
194
|
for (const helperFile of helperFiles) {
|
|
197
195
|
const result = validateHelper(helperFile);
|
|
@@ -211,11 +209,11 @@ function main() {
|
|
|
211
209
|
log(`✅ ${helperFile}`, 'green');
|
|
212
210
|
}
|
|
213
211
|
}
|
|
214
|
-
|
|
212
|
+
|
|
215
213
|
// Validate registry
|
|
216
214
|
log('\n📋 Validating Helper Registry...\n', 'blue');
|
|
217
215
|
const registryResult = validateRegistry();
|
|
218
|
-
|
|
216
|
+
|
|
219
217
|
if (registryResult.issues.length > 0) {
|
|
220
218
|
for (const issue of registryResult.issues) {
|
|
221
219
|
if (issue.type === 'error') {
|
|
@@ -230,7 +228,7 @@ function main() {
|
|
|
230
228
|
} else {
|
|
231
229
|
log('✅ Helper registry is consistent', 'green');
|
|
232
230
|
}
|
|
233
|
-
|
|
231
|
+
|
|
234
232
|
// Summary
|
|
235
233
|
log('\n' + '='.repeat(50), 'blue');
|
|
236
234
|
if (totalIssues === 0) {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-commit-unit
|
|
3
|
+
description: Create small, reviewable commits per logical unit of work with consistent messages tied to the task ID. Use during implementation and batch runs.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: git
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Commit a Logical Unit
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- After completing a coherent step (not after every file).
|
|
13
|
+
- Before switching focus or running validation.
|
|
14
|
+
- During batch runs after each “unit” completes.
|
|
15
|
+
|
|
16
|
+
## Inputs
|
|
17
|
+
|
|
18
|
+
- Task ID (from `work/backlog/tasks.local.md` or user input)
|
|
19
|
+
- Current diff (`git diff` and `git status`)
|
|
20
|
+
- Commit message style: concise, why-focused, task-linked
|
|
21
|
+
|
|
22
|
+
## Output contract
|
|
23
|
+
|
|
24
|
+
Return:
|
|
25
|
+
- `commitCreated`: yes/no
|
|
26
|
+
- `commitHash` (if created)
|
|
27
|
+
- `message`
|
|
28
|
+
- `filesChangedSummary`
|
|
29
|
+
|
|
30
|
+
## Rules
|
|
31
|
+
|
|
32
|
+
- Never commit secrets (`.env`, credential files, tokens).
|
|
33
|
+
- If there are no changes, do not create an empty commit.
|
|
34
|
+
- Keep commits small and reviewable; split if multiple concerns.
|
|
35
|
+
|
|
36
|
+
## Suggested commit message pattern
|
|
37
|
+
|
|
38
|
+
- Title: `<task-id>: <verb> <scope> (<why>)`
|
|
39
|
+
- Body (optional): 1–3 bullets explaining intent and risk
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
- `t1.2: add branch detection helper (avoid hardcoded main)`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-design-system-bootstrap
|
|
3
|
+
description: Bootstrap a usable design system early (Tailwind + shadcn/ui) to avoid design babysitting later. Produces spec/07-design-system.md and a UI Definition of Done checklist.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: design
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Design System Bootstrap (Tailwind + shadcn/ui)
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- During `/spec/init` or `/spec/refine` when design direction is unclear or repeatedly causes rework.
|
|
13
|
+
- Before `/spec/plan` so design work can be turned into concrete, non-babysat tasks.
|
|
14
|
+
|
|
15
|
+
## Inputs (ask if missing)
|
|
16
|
+
|
|
17
|
+
- Product vibe / adjectives (3–5)
|
|
18
|
+
- Target surfaces (primary screens + whether data-dense)
|
|
19
|
+
- Brand constraints (logo, existing colors, typography)
|
|
20
|
+
- Accessibility target (default: WCAG AA)
|
|
21
|
+
|
|
22
|
+
## Output contract
|
|
23
|
+
|
|
24
|
+
Produce or update `spec/07-design-system.md` with:
|
|
25
|
+
- Style direction (do/don’t)
|
|
26
|
+
- Token table (semantic colors, typography, spacing, radius/shadows)
|
|
27
|
+
- Component conventions (shadcn/ui)
|
|
28
|
+
- UI patterns (nav/forms/tables/states)
|
|
29
|
+
- UI Definition of Done checklist
|
|
30
|
+
|
|
31
|
+
## Rules
|
|
32
|
+
|
|
33
|
+
- Make it usable, not aspirational.
|
|
34
|
+
- Prefer semantic tokens over raw colors.
|
|
35
|
+
- Keep it compatible with Tailwind + shadcn/ui defaults (can be overridden intentionally).
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-git-default-branch
|
|
3
|
+
description: Resolve default/development/production branches consistently across projects. Use before creating task branches, counting commits, creating PRs, or generating diffs.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: git
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Resolve Git Default Branch
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- You are about to create a task branch.
|
|
13
|
+
- You need to compute diffs/commit counts against the base branch.
|
|
14
|
+
- You are about to create or update a PR.
|
|
15
|
+
- You see any workflow text hardcoding `main`/`develop`/`staging` and need to make it project-agnostic.
|
|
16
|
+
|
|
17
|
+
## Inputs
|
|
18
|
+
|
|
19
|
+
- Optional: `.sdd/git-config.json` (project-specific config; preferred)
|
|
20
|
+
- Git remote metadata: `origin` HEAD branch (if available)
|
|
21
|
+
- Local/remote branch existence
|
|
22
|
+
|
|
23
|
+
## Output contract (what you must return)
|
|
24
|
+
|
|
25
|
+
Return a short structured result:
|
|
26
|
+
|
|
27
|
+
- `defaultBranch`: the branch to use as PR base and “clean base” checkout
|
|
28
|
+
- `developmentBranch`: optional; defaults to `defaultBranch` if not known
|
|
29
|
+
- `productionBranch`: optional; defaults to `defaultBranch` if not known
|
|
30
|
+
- `source`: `config` | `remoteHead` | `fallback`
|
|
31
|
+
|
|
32
|
+
## Algorithm (project-agnostic)
|
|
33
|
+
|
|
34
|
+
1. **Config (highest priority)**: If `.sdd/git-config.json` exists, read:
|
|
35
|
+
- `default_branch` OR `development_branch` as `defaultBranch`
|
|
36
|
+
- `development_branch` as `developmentBranch` (fallback: `defaultBranch`)
|
|
37
|
+
- `production_branch` as `productionBranch` (fallback: `defaultBranch`)
|
|
38
|
+
2. **Remote HEAD**: If `origin` exists, read the remote default branch (e.g., `git remote show origin` and parse `HEAD branch`).
|
|
39
|
+
3. **Fallback**: If remote HEAD is unavailable, pick the first existing branch in this order (local OR remote):
|
|
40
|
+
- `main`
|
|
41
|
+
- `master`
|
|
42
|
+
- `develop`
|
|
43
|
+
4. If nothing is detectable, return `defaultBranch: "main"` and include a warning in your explanation.
|
|
44
|
+
|
|
45
|
+
## Rules
|
|
46
|
+
|
|
47
|
+
- Do not assume `staging` exists. If a project uses `staging`, it should be configured in `.sdd/git-config.json`.
|
|
48
|
+
- Never hardcode `main` as “the” default branch in documentation. Use `defaultBranch` (resolved by this skill).
|
|
49
|
+
- If the project has `work/backlog/tasks.local.md`, include the task ID in downstream commit/PR titles (but this skill itself only resolves branches).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-pr-create-or-update
|
|
3
|
+
description: Create or update a PR with correct base branch, task-linked title, and a structured body (changes, testing, acceptance). Use after validation or at milestone boundaries.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: github
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Create or Update Pull Request
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- After `/task/validate` passes (or passes with known exceptions).
|
|
13
|
+
- During `/task/batch` when configured to open PRs per task or per milestone.
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
|
|
17
|
+
- Base branch: resolve via `/sdd-git-default-branch`
|
|
18
|
+
- Task ID + short title
|
|
19
|
+
- Git changes: commits since base branch, `git diff <base>...HEAD --stat`
|
|
20
|
+
- Validation result summary (lint/tests/build)
|
|
21
|
+
|
|
22
|
+
## Output contract
|
|
23
|
+
|
|
24
|
+
Return:
|
|
25
|
+
- `action`: created/updated/noop
|
|
26
|
+
- `prUrl` (if created/updated)
|
|
27
|
+
- `baseBranchUsed`
|
|
28
|
+
|
|
29
|
+
## Body template
|
|
30
|
+
|
|
31
|
+
Use a structured PR body:
|
|
32
|
+
|
|
33
|
+
- **Summary**: 1–3 bullets
|
|
34
|
+
- **Test plan**: checklist
|
|
35
|
+
- **Notes / risks**: optional
|
|
36
|
+
|
|
37
|
+
## Rules
|
|
38
|
+
|
|
39
|
+
- Never assume base is `main`.
|
|
40
|
+
- Prefer updating an existing PR over creating duplicates.
|
|
41
|
+
- Do not push unless user asked to push (or the workflow explicitly requires it).
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-task-preflight
|
|
3
|
+
description: Prepare a task workspace safely before implementation: clean working tree, correct base branch, and task branch naming. Use before /task/start execution work.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: git
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Task Preflight (Git Safety)
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- Right before starting implementation for a task (single task or batch task).
|
|
13
|
+
- When you suspect you’re on the wrong branch or have dirty state.
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
|
|
17
|
+
- Task context (ideally: `taskId`, short description)
|
|
18
|
+
- Repo state: `git status`, current branch, remotes
|
|
19
|
+
- Base branch: resolve via `/sdd-git-default-branch` (preferred) or helper `branch-detection.md`
|
|
20
|
+
|
|
21
|
+
## Output contract
|
|
22
|
+
|
|
23
|
+
Return:
|
|
24
|
+
- `baseBranch`
|
|
25
|
+
- `taskBranch`
|
|
26
|
+
- `actionsTaken` (bullets)
|
|
27
|
+
- `blockingIssues` (bullets; empty if none)
|
|
28
|
+
|
|
29
|
+
## Procedure
|
|
30
|
+
|
|
31
|
+
1. **Validate working tree is clean**
|
|
32
|
+
- If dirty/untracked: stop and report as `blockingIssues` (do not auto-stash).
|
|
33
|
+
2. **Resolve `baseBranch`**
|
|
34
|
+
- Use `/sdd-git-default-branch` to resolve `defaultBranch`.
|
|
35
|
+
3. **Ensure base branch is up to date**
|
|
36
|
+
- Checkout `baseBranch`
|
|
37
|
+
- If remote exists: pull latest (`git pull origin <baseBranch>`)
|
|
38
|
+
4. **Create/checkout task branch**
|
|
39
|
+
- Naming: `task/<task-id>-<short-description>` (kebab-case)
|
|
40
|
+
- If exists locally: checkout
|
|
41
|
+
- Else: create from `baseBranch`
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
|
|
45
|
+
- Never merge/rebase in preflight.
|
|
46
|
+
- Never commit anything in preflight.
|
|
47
|
+
- Never assume `main`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdd-validation-suite
|
|
3
|
+
description: Run a lightweight, project-agnostic validation suite (lint, typecheck, build, tests when present) and summarize pass/fail with actionable error highlights.
|
|
4
|
+
metadata:
|
|
5
|
+
sdd_category: validation
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SDD: Validation Suite
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- During `/task/validate` before opening/updating a PR.
|
|
13
|
+
- During `/task/batch` after each task (and optionally after each logical unit).
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
|
|
17
|
+
- Project type + tooling (from detection or repo files)
|
|
18
|
+
- Available scripts (package.json, makefile, etc.)
|
|
19
|
+
- Optional: workspace scope (monorepo), e.g. `apps/storefront`
|
|
20
|
+
|
|
21
|
+
## Output contract
|
|
22
|
+
|
|
23
|
+
Return a compact report:
|
|
24
|
+
- `lint`: pass/fail/skipped
|
|
25
|
+
- `typecheck`: pass/fail/skipped
|
|
26
|
+
- `tests`: pass/fail/skipped
|
|
27
|
+
- `build`: pass/fail/skipped
|
|
28
|
+
- `highlights`: top 3 actionable errors (if any)
|
|
29
|
+
|
|
30
|
+
## Execution strategy (project-agnostic)
|
|
31
|
+
|
|
32
|
+
- If JS/TS: prefer `npm run lint`, `npm run typecheck`, `npm test`, `npm run build` when scripts exist.
|
|
33
|
+
- If Python: prefer `ruff`, `mypy`, `pytest` when configured.
|
|
34
|
+
- If unknown: run the minimum safe checks available, and clearly mark skipped items.
|
|
35
|
+
|
|
36
|
+
**Monorepo rule (if applicable):**
|
|
37
|
+
- If the repo is a monorepo, run commands **scoped to the task workspace** (do not run repo-wide by default).
|
|
38
|
+
- Examples:
|
|
39
|
+
- `pnpm -C <workspace> run lint`
|
|
40
|
+
- `npm --prefix <workspace> run test`
|
|
41
|
+
- `yarn --cwd <workspace> test`
|
|
42
|
+
- If no workspace scope is provided for a monorepo task, treat validation as **blocked** until scope is clarified.
|
|
43
|
+
|
|
44
|
+
## Rules
|
|
45
|
+
|
|
46
|
+
- Do not invent commands that don’t exist.
|
|
47
|
+
- If a step fails, stop and report errors before continuing.
|
|
@@ -19,6 +19,14 @@ What is the main value delivered to users?
|
|
|
19
19
|
What feels in-scope right now?
|
|
20
20
|
What explicitly feels out-of-scope?
|
|
21
21
|
|
|
22
|
+
## 5.1 MVP vs Future (scope locking)
|
|
23
|
+
|
|
24
|
+
### MVP (ship target)
|
|
25
|
+
- [List the minimum set of capabilities required to ship an MVP.]
|
|
26
|
+
|
|
27
|
+
### Future ideas / Roadmap (park here)
|
|
28
|
+
- [If your initial prompt includes visionary “later” ideas, list them here so they don’t accidentally become MVP scope.]
|
|
29
|
+
|
|
22
30
|
## 6. Open Questions
|
|
23
31
|
List uncertainties, assumptions, or things that need clarification.
|
|
24
32
|
|
|
@@ -32,5 +40,6 @@ Anything else discovered during discussion or research.
|
|
|
32
40
|
If applicable, reference:
|
|
33
41
|
- `spec/01-prd.md` (if PRD was created)
|
|
34
42
|
- `spec/02-architecture.md` (if architecture is documented)
|
|
43
|
+
- `spec/06-acceptance.md` (MVP ship checklist / definition of done)
|
|
35
44
|
- `spec/07-design-system.md` (if design is critical)
|
|
36
45
|
- `spec/08-infrastructure.md` (if infrastructure is critical)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## System Overview
|
|
4
|
+
High-level description of system architecture and how components interact.
|
|
5
|
+
|
|
6
|
+
## Component Architecture
|
|
7
|
+
- Frontend: [Description]
|
|
8
|
+
- Backend/API: [Description]
|
|
9
|
+
- Database: [Description]
|
|
10
|
+
- External Services: [Description]
|
|
11
|
+
|
|
12
|
+
## Data Flow
|
|
13
|
+
How data moves through the system:
|
|
14
|
+
- User actions → [flow description]
|
|
15
|
+
- Data fetching → [flow description]
|
|
16
|
+
- Mutations → [flow description]
|
|
17
|
+
|
|
18
|
+
## Design Patterns
|
|
19
|
+
Architecture patterns used:
|
|
20
|
+
- [Pattern name]: [Description and rationale]
|
|
21
|
+
|
|
22
|
+
## Technology Stack
|
|
23
|
+
|
|
24
|
+
Document the technologies, frameworks, and tools used in this project. This is the source of truth for framework/tool detection and rule activation.
|
|
25
|
+
|
|
26
|
+
**Format:**
|
|
27
|
+
- Frontend Framework: [Framework name, e.g., Next.js, Vite, React]
|
|
28
|
+
- Backend Framework: [Framework name, e.g., Express, FastAPI, Flask]
|
|
29
|
+
- CMS: [CMS name, e.g., Payload CMS, Strapi]
|
|
30
|
+
- Database: [Database name, e.g., PostgreSQL, MongoDB]
|
|
31
|
+
- Build Tool: [Build tool name, e.g., Vite, Webpack]
|
|
32
|
+
- Language: [Language name, e.g., TypeScript, Python]
|
|
33
|
+
- Other: [List other tools/libraries]
|
|
34
|
+
|
|
35
|
+
**Example:**
|
|
36
|
+
- Frontend Framework: Next.js
|
|
37
|
+
- CMS: Payload CMS
|
|
38
|
+
- Database: PostgreSQL
|
|
39
|
+
- Build Tool: Vite (for admin)
|
|
40
|
+
- Language: TypeScript
|
|
41
|
+
|
|
42
|
+
**Note:** If tech stack is documented here, it should also be referenced in `spec/08-infrastructure.md` for consistency.
|
|
43
|
+
|
|
44
|
+
## API Design (if applicable)
|
|
45
|
+
- API structure: [Description]
|
|
46
|
+
- Authentication: [Description]
|
|
47
|
+
- Error handling: [Description]
|
|
48
|
+
|
|
49
|
+
## Security Architecture (if critical)
|
|
50
|
+
- Authentication flow: [Description]
|
|
51
|
+
- Authorization: [Description]
|
|
52
|
+
- Data protection: [Description]
|
|
53
|
+
|
|
54
|
+
## Scalability Considerations
|
|
55
|
+
- Current scale: [Description]
|
|
56
|
+
- Future scale: [Description]
|
|
57
|
+
- Scaling strategy: [Description]
|
|
58
|
+
|
|
59
|
+
## CI/CD Architecture (if applicable)
|
|
60
|
+
- CI pipeline: [Description of CI workflow]
|
|
61
|
+
- CD pipeline: [Description of CD workflow]
|
|
62
|
+
- Testing strategy: [Unit tests, integration tests, E2E tests]
|
|
63
|
+
- Quality gates: [Required checks before merge/deploy]
|
|
64
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Acceptance Criteria / Ship Checklist
|
|
2
|
+
|
|
3
|
+
This document defines what “done” means for the **MVP** (and optionally later phases).
|
|
4
|
+
Use it as the project’s **ship gate** during planning and validation.
|
|
5
|
+
|
|
6
|
+
## MVP definition (1–5 bullets)
|
|
7
|
+
|
|
8
|
+
- [What must be true to call the MVP shipped?]
|
|
9
|
+
|
|
10
|
+
## Success criteria (measurable if possible)
|
|
11
|
+
|
|
12
|
+
- [Metric / outcome]
|
|
13
|
+
|
|
14
|
+
## Scope boundaries
|
|
15
|
+
|
|
16
|
+
### In scope (MVP)
|
|
17
|
+
- [Feature / capability]
|
|
18
|
+
|
|
19
|
+
### Out of scope (MVP)
|
|
20
|
+
- [Feature / capability]
|
|
21
|
+
|
|
22
|
+
### Future ideas / Roadmap (park here)
|
|
23
|
+
- [Item]
|
|
24
|
+
|
|
25
|
+
## Non-functional requirements (MVP)
|
|
26
|
+
|
|
27
|
+
- **Performance**: [e.g., pages load < 2s on mid-tier device]
|
|
28
|
+
- **Reliability**: [e.g., error budget / retries]
|
|
29
|
+
- **Security**: [e.g., auth, roles, audit trail]
|
|
30
|
+
- **Accessibility**: [e.g., WCAG AA]
|
|
31
|
+
- **Privacy/Compliance**: [if applicable]
|
|
32
|
+
|
|
33
|
+
## Quality gates (must pass to ship MVP)
|
|
34
|
+
|
|
35
|
+
- [ ] Key user journeys verified end-to-end
|
|
36
|
+
- [ ] Error/empty/loading states implemented for primary flows
|
|
37
|
+
- [ ] Logging/monitoring in place (minimum viable observability)
|
|
38
|
+
- [ ] Data migrations/backups strategy (if DB)
|
|
39
|
+
- [ ] Security basics covered (auth, access control, secrets handling)
|
|
40
|
+
- [ ] CI checks passing (lint/typecheck/tests/build as applicable)
|
|
41
|
+
- [ ] Deployment pipeline ready (preview + production)
|
|
42
|
+
|
|
43
|
+
## Test plan (MVP)
|
|
44
|
+
|
|
45
|
+
- **Manual smoke tests**:
|
|
46
|
+
- [Flow 1]
|
|
47
|
+
- [Flow 2]
|
|
48
|
+
- **Automated tests**:
|
|
49
|
+
- Unit: [yes/no]
|
|
50
|
+
- Integration: [yes/no]
|
|
51
|
+
- E2E: [yes/no]
|
|
52
|
+
|
|
53
|
+
## Release plan (MVP)
|
|
54
|
+
|
|
55
|
+
- **Rollout**: [gradual/full]
|
|
56
|
+
- **Rollback**: [plan]
|
|
57
|
+
- **Monitoring**: [what to watch]
|
|
58
|
+
- **Support**: [who responds to incidents]
|
|
59
|
+
|