sedd 0.1.0
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/README.md +504 -0
- package/bin/sedd.js +6 -0
- package/commands/sedd.clarify.md +435 -0
- package/commands/sedd.dashboard.md +145 -0
- package/commands/sedd.implement.md +326 -0
- package/commands/sedd.migrate.md +249 -0
- package/commands/sedd.specify.md +198 -0
- package/commands/sedd.tasks.md +176 -0
- package/dist/cli/check.d.ts +6 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +134 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/clarify.d.ts +2 -0
- package/dist/cli/clarify.d.ts.map +1 -0
- package/dist/cli/clarify.js +116 -0
- package/dist/cli/clarify.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +175 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +9 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +236 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/migrate.d.ts +7 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +197 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/specify.d.ts +7 -0
- package/dist/cli/specify.d.ts.map +1 -0
- package/dist/cli/specify.js +131 -0
- package/dist/cli/specify.js.map +1 -0
- package/dist/cli/status.d.ts +6 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +118 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/tasks.d.ts +7 -0
- package/dist/cli/tasks.d.ts.map +1 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/changelog.d.ts +30 -0
- package/dist/core/changelog.d.ts.map +1 -0
- package/dist/core/changelog.js +97 -0
- package/dist/core/changelog.js.map +1 -0
- package/dist/core/file-splitter.d.ts +39 -0
- package/dist/core/file-splitter.d.ts.map +1 -0
- package/dist/core/file-splitter.js +162 -0
- package/dist/core/file-splitter.js.map +1 -0
- package/dist/core/migration-manager.d.ts +76 -0
- package/dist/core/migration-manager.d.ts.map +1 -0
- package/dist/core/migration-manager.js +230 -0
- package/dist/core/migration-manager.js.map +1 -0
- package/dist/core/timestamps.d.ts +17 -0
- package/dist/core/timestamps.d.ts.map +1 -0
- package/dist/core/timestamps.js +37 -0
- package/dist/core/timestamps.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +102 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +83 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/git.d.ts +63 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +179 -0
- package/dist/utils/git.js.map +1 -0
- package/hooks/README.md +220 -0
- package/hooks/check-roadmap.js +231 -0
- package/hooks/check-roadmap.ps1 +343 -0
- package/package.json +60 -0
- package/scripts/bash/sedd-clarify.sh +142 -0
- package/scripts/bash/sedd-complete-task.sh +108 -0
- package/scripts/bash/sedd-specify.sh +147 -0
- package/scripts/powershell/sedd-clarify.ps1 +222 -0
- package/scripts/powershell/sedd-complete-task.ps1 +143 -0
- package/scripts/powershell/sedd-specify.ps1 +192 -0
- package/scripts/powershell/sedd-status.ps1 +153 -0
- package/scripts/powershell/sedd-tasks.ps1 +176 -0
- package/templates/changelog-template.md +6 -0
- package/templates/clarify-template.md +66 -0
- package/templates/config-template.json +20 -0
- package/templates/decisions-template.md +56 -0
- package/templates/interfaces-template.ts +131 -0
- package/templates/meta-template.json +12 -0
- package/templates/progress-template.md +61 -0
- package/templates/sedd.schema.json +95 -0
- package/templates/spec-template.md +114 -0
- package/templates/tasks-template.md +58 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# /sedd.specify - Create Feature Specification
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Create a new feature with base specification (spec.md + interfaces.ts).
|
|
5
|
+
|
|
6
|
+
## Trigger
|
|
7
|
+
User runs `/sedd.specify "feature description"` or `/sedd.specify` (interactive)
|
|
8
|
+
|
|
9
|
+
## Pre-flight Checks
|
|
10
|
+
|
|
11
|
+
1. **Load Configuration**
|
|
12
|
+
```
|
|
13
|
+
Read sedd.config.json (or use defaults)
|
|
14
|
+
Default specsDir: .sedd
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
2. **Verify SEDD is initialized**
|
|
18
|
+
- Check if specsDir exists
|
|
19
|
+
- If not: suggest `npx sedd init`
|
|
20
|
+
|
|
21
|
+
3. **Check for existing feature branch**
|
|
22
|
+
- If on feature branch (###-name): use existing feature
|
|
23
|
+
- If not: create new feature
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
Default `sedd.config.json`:
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"specsDir": ".sedd",
|
|
31
|
+
"branchPattern": "{{id}}-{{name}}",
|
|
32
|
+
"autoSplit": { "enabled": true, "maxLines": 400 },
|
|
33
|
+
"commit": { "askBeforeCommit": true }
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Workflow
|
|
38
|
+
|
|
39
|
+
### Step 1: Parse Input
|
|
40
|
+
|
|
41
|
+
Extract feature description from user input or ask interactively.
|
|
42
|
+
|
|
43
|
+
### Step 2: Architecture Analysis (MANDATORY)
|
|
44
|
+
|
|
45
|
+
Before creating spec, MUST search for related implementations:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Find similar:
|
|
49
|
+
- Existing specs in {{specsDir}}/
|
|
50
|
+
- Related code patterns
|
|
51
|
+
- Reusable components
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Document findings in spec.md.
|
|
55
|
+
|
|
56
|
+
### Step 3: Capture Expectation (NEW)
|
|
57
|
+
|
|
58
|
+
Ask user for their expectation:
|
|
59
|
+
```
|
|
60
|
+
What do you expect as the final outcome of this feature?
|
|
61
|
+
(This will be used to verify alignment when implementation is complete)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Save expectation in:
|
|
65
|
+
- `spec.md` under `## Expectation` section
|
|
66
|
+
- `_meta.json` in `expectation` field
|
|
67
|
+
|
|
68
|
+
### Step 4: Create Feature Structure
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
{{specsDir}}/{{FEATURE_ID}}-{{SHORT_NAME}}/
|
|
72
|
+
├── _meta.json # Metadata (with expectation)
|
|
73
|
+
├── CHANGELOG.md # Changelog
|
|
74
|
+
├── spec.md # Base specification (with Expectation section)
|
|
75
|
+
├── interfaces.ts # TypeScript interfaces
|
|
76
|
+
└── ui-mockups/ # If UI feature
|
|
77
|
+
└── component-name.md
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 5: Generate spec.md
|
|
81
|
+
|
|
82
|
+
Use template with:
|
|
83
|
+
- Feature name, ID, timestamp
|
|
84
|
+
- User stories based on description
|
|
85
|
+
- Mark requirements as NEEDS_CLARIFICATION where unclear
|
|
86
|
+
- Include Expectation section
|
|
87
|
+
|
|
88
|
+
### Step 6: Generate interfaces.ts (MANDATORY)
|
|
89
|
+
|
|
90
|
+
Extract entities from description and create TypeScript interfaces:
|
|
91
|
+
- Identify nouns → Entities
|
|
92
|
+
- Identify verbs → Actions/Events
|
|
93
|
+
- Define DTOs for API
|
|
94
|
+
|
|
95
|
+
### Step 7: UI Mockups (MANDATORY if UI feature)
|
|
96
|
+
|
|
97
|
+
If feature involves UI components, CREATE ASCII mockups:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
┌────────────────────────────────────────┐
|
|
101
|
+
│ Header [X] │
|
|
102
|
+
├────────────────────────────────────────┤
|
|
103
|
+
│ │
|
|
104
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
105
|
+
│ │ Card 1 │ │ Card 2 │ │
|
|
106
|
+
│ └──────────┘ └──────────┘ │
|
|
107
|
+
│ │
|
|
108
|
+
│ [Button Primary] [Button Secondary] │
|
|
109
|
+
│ │
|
|
110
|
+
└────────────────────────────────────────┘
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Save to `ui-mockups/{{component}}.md`
|
|
114
|
+
|
|
115
|
+
### Step 8: Initialize _meta.json
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"featureId": "024",
|
|
120
|
+
"featureName": "dark-mode-toggle",
|
|
121
|
+
"branch": "024-dark-mode-toggle",
|
|
122
|
+
"createdAt": "2026-01-11T10:00:00Z",
|
|
123
|
+
"specCreatedAt": "2026-01-11T10:00:00Z",
|
|
124
|
+
"currentMigration": null,
|
|
125
|
+
"migrations": {},
|
|
126
|
+
"splits": [],
|
|
127
|
+
"commits": [],
|
|
128
|
+
"expectation": "User can toggle dark mode in settings and have it persist across sessions"
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Step 9: Update Changelog
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
## [2026-01-11] - Feature Created
|
|
136
|
+
|
|
137
|
+
- Created initial specification
|
|
138
|
+
- Defined {{N}} user stories
|
|
139
|
+
- Identified {{M}} key entities
|
|
140
|
+
- Generated TypeScript interfaces
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Step 10: Ask About Commit
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Do you want to commit?
|
|
147
|
+
Message: "feat(024): create spec for dark-mode-toggle"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Step 11: Offer Next Step
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
Specification created! Next step:
|
|
154
|
+
/sedd.clarify - Refine requirements and generate tasks
|
|
155
|
+
|
|
156
|
+
Would you like to proceed with clarification?
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Output
|
|
160
|
+
|
|
161
|
+
1. **spec.md** - Complete specification
|
|
162
|
+
2. **interfaces.ts** - TypeScript interfaces
|
|
163
|
+
3. **ui-mockups/** - ASCII mockups (if UI)
|
|
164
|
+
4. **_meta.json** - Feature metadata
|
|
165
|
+
5. **CHANGELOG.md** - Initial entry
|
|
166
|
+
|
|
167
|
+
## Rules
|
|
168
|
+
|
|
169
|
+
- NEVER create spec without architecture analysis
|
|
170
|
+
- ALWAYS create interfaces.ts
|
|
171
|
+
- ALWAYS create ASCII mockups for UI features
|
|
172
|
+
- Mark unclear items as NEEDS_CLARIFICATION
|
|
173
|
+
- Auto-split files > 400 lines
|
|
174
|
+
- No migrations created yet (happens in /sedd.clarify)
|
|
175
|
+
|
|
176
|
+
## CLI Alternative
|
|
177
|
+
|
|
178
|
+
For automated workflows, use the SEDD CLI:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Create new feature structure
|
|
182
|
+
sedd specify 024 dark-mode-toggle -d "Add dark mode support"
|
|
183
|
+
|
|
184
|
+
# Create with expectation (recommended)
|
|
185
|
+
sedd specify 024 dark-mode-toggle -d "Add dark mode support" -e "User can toggle dark mode"
|
|
186
|
+
|
|
187
|
+
# Check structure
|
|
188
|
+
sedd check
|
|
189
|
+
|
|
190
|
+
# View status
|
|
191
|
+
sedd status
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Options:**
|
|
195
|
+
- `-d, --description` - Feature description
|
|
196
|
+
- `-e, --expectation` - Expected outcome (used for alignment verification)
|
|
197
|
+
|
|
198
|
+
Scripts also available in `.sedd/scripts/powershell/sedd-specify.ps1` and `.sedd/scripts/bash/sedd-specify.sh`.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# /sedd.tasks - Generate Tasks
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Add tasks to the current migration. Usually called after /sedd.clarify to populate tasks.md.
|
|
5
|
+
|
|
6
|
+
## Trigger
|
|
7
|
+
User runs `/sedd.tasks`
|
|
8
|
+
|
|
9
|
+
## Pre-flight Checks
|
|
10
|
+
|
|
11
|
+
1. **Read sedd.config.json** to get `specsDir` (default: `.sedd`, legacy: `specs`)
|
|
12
|
+
```
|
|
13
|
+
Read sedd.config.json → specsDir = "specs" or ".sedd"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
2. **Get current branch** from git
|
|
17
|
+
```
|
|
18
|
+
git rev-parse --abbrev-ref HEAD → "023-agent-executor"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. **Find feature directory**
|
|
22
|
+
```
|
|
23
|
+
{specsDir}/{branch}/ → specs/023-agent-executor/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
4. **Load _meta.json** to get current migration
|
|
27
|
+
|
|
28
|
+
5. **Verify current migration exists** (run /sedd.clarify first)
|
|
29
|
+
|
|
30
|
+
## CRITICAL RULE
|
|
31
|
+
|
|
32
|
+
⚠️ **NOTHING HAPPENS WITHOUT A TASK**
|
|
33
|
+
- Every action must be a task in tasks.md
|
|
34
|
+
- NEVER skip task registration
|
|
35
|
+
- ALWAYS update task status before/after work
|
|
36
|
+
|
|
37
|
+
## Workflow
|
|
38
|
+
|
|
39
|
+
### Step 1: Load Context
|
|
40
|
+
|
|
41
|
+
Read from feature directory:
|
|
42
|
+
- `spec.md` (requirements)
|
|
43
|
+
- `interfaces.ts` (entities)
|
|
44
|
+
- `{currentMigration}/clarify.md` (clarifications)
|
|
45
|
+
- `{currentMigration}/decisions.md` (decisions)
|
|
46
|
+
|
|
47
|
+
### Step 2: Extract Work Items
|
|
48
|
+
|
|
49
|
+
From spec.md:
|
|
50
|
+
- Each User Story → Task group
|
|
51
|
+
- Each Functional Requirement → Task
|
|
52
|
+
- Each Entity in interfaces.ts → CRUD tasks
|
|
53
|
+
|
|
54
|
+
From decisions.md:
|
|
55
|
+
- Each decision with implementation impact → Task
|
|
56
|
+
|
|
57
|
+
### Step 3: Generate Task IDs
|
|
58
|
+
|
|
59
|
+
Tasks are prefixed with migration ID:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
T{migration}-{sequence}
|
|
63
|
+
|
|
64
|
+
T001-001 = Migration 001, Task 1
|
|
65
|
+
T001-002 = Migration 001, Task 2
|
|
66
|
+
T002-001 = Migration 002, Task 1
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Step 4: Create Task Categories
|
|
70
|
+
|
|
71
|
+
| Category | Description |
|
|
72
|
+
|----------|-------------|
|
|
73
|
+
| Foundation | Infrastructure, base setup |
|
|
74
|
+
| US{N} | User Story implementation |
|
|
75
|
+
| Integration | External services |
|
|
76
|
+
| Tests | Unit, integration tests |
|
|
77
|
+
|
|
78
|
+
### Step 5: Write tasks.md
|
|
79
|
+
|
|
80
|
+
Append to `{currentMigration}/tasks.md`:
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
# Tasks - Migration 001
|
|
84
|
+
|
|
85
|
+
Migration: 001
|
|
86
|
+
Timestamp: 2026-01-11_10-30-45
|
|
87
|
+
Parent: (none)
|
|
88
|
+
|
|
89
|
+
## Summary
|
|
90
|
+
Total: 8 | Completed: 0 | Pending: 8
|
|
91
|
+
|
|
92
|
+
## Tasks
|
|
93
|
+
|
|
94
|
+
### Foundation
|
|
95
|
+
- [ ] T001-001 [Foundation] Create database migration for new tables
|
|
96
|
+
- [ ] T001-002 [Foundation] Set up API route structure
|
|
97
|
+
|
|
98
|
+
### US1: Dark Mode Toggle
|
|
99
|
+
- [ ] T001-003 [US1] Create ThemeContext with localStorage persistence
|
|
100
|
+
- [ ] T001-004 [US1] Build ThemeToggle component
|
|
101
|
+
- [ ] T001-005 [US1] Add toggle to settings page
|
|
102
|
+
|
|
103
|
+
### US2: Theme Sync
|
|
104
|
+
- [ ] T001-006 [US2] Create user preference API endpoint
|
|
105
|
+
- [ ] T001-007 [US2] Implement cross-device sync
|
|
106
|
+
|
|
107
|
+
### Tests
|
|
108
|
+
- [ ] T001-008 [Tests] Write unit tests for ThemeContext
|
|
109
|
+
|
|
110
|
+
## Dependencies
|
|
111
|
+
|
|
112
|
+
T001-001, T001-002 → T001-003 → T001-004 → T001-005
|
|
113
|
+
→ T001-006 → T001-007
|
|
114
|
+
T001-003 → T001-008
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Step 6: Update _meta.json
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"migrations": {
|
|
122
|
+
"001": {
|
|
123
|
+
"tasksTotal": 8,
|
|
124
|
+
"tasksCompleted": 0,
|
|
125
|
+
"status": "in-progress"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Step 7: Ask About Commit
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Tasks generated! 8 tasks in migration 001.
|
|
135
|
+
|
|
136
|
+
Do you want to commit?
|
|
137
|
+
Message: "docs(024): add tasks for migration 001"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Task Format
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
- [ ] T{MIG}-{SEQ} [{CATEGORY}] {Description} `{file_path}` (optional)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Examples:
|
|
147
|
+
```
|
|
148
|
+
- [ ] T001-001 [Foundation] Create ThemeContext `src/contexts/ThemeContext.tsx`
|
|
149
|
+
- [ ] T001-002 [US1] Add dark mode toggle to header
|
|
150
|
+
- [x] T001-003 [Tests] Write unit tests for ThemeContext
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Rules
|
|
154
|
+
|
|
155
|
+
- Tasks MUST have migration prefix (T001-XXX)
|
|
156
|
+
- Tasks MUST have category in brackets
|
|
157
|
+
- File paths are optional but recommended
|
|
158
|
+
- Update task count in _meta.json
|
|
159
|
+
- Tasks can span multiple migrations
|
|
160
|
+
|
|
161
|
+
## CLI Alternative
|
|
162
|
+
|
|
163
|
+
For automated workflows, use the SEDD CLI:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Add tasks to current migration
|
|
167
|
+
sedd tasks '[{"story":"US1","description":"Create component"},{"story":"US2","description":"Add API"}]'
|
|
168
|
+
|
|
169
|
+
# Mark task complete
|
|
170
|
+
sedd complete T001-001
|
|
171
|
+
|
|
172
|
+
# View status
|
|
173
|
+
sedd status
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Scripts also available in `.sedd/scripts/powershell/sedd-tasks.ps1`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAQD,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IrE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { GitOperations } from '../utils/git.js';
|
|
5
|
+
import { MigrationManager } from '../core/migration-manager.js';
|
|
6
|
+
import { loadConfig } from '../types/index.js';
|
|
7
|
+
export async function check(options = {}) {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const git = new GitOperations(cwd);
|
|
10
|
+
const config = loadConfig(cwd);
|
|
11
|
+
console.log(chalk.blue('\n🔍 Checking SEDD structure...\n'));
|
|
12
|
+
const result = {
|
|
13
|
+
valid: true,
|
|
14
|
+
errors: [],
|
|
15
|
+
warnings: [],
|
|
16
|
+
};
|
|
17
|
+
// Check config file
|
|
18
|
+
const configPath = join(cwd, 'sedd.config.json');
|
|
19
|
+
if (existsSync(configPath)) {
|
|
20
|
+
console.log(chalk.green('✓'), 'sedd.config.json exists');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
result.warnings.push('sedd.config.json not found. Using defaults.');
|
|
24
|
+
console.log(chalk.yellow('⚠'), 'sedd.config.json not found (using defaults)');
|
|
25
|
+
}
|
|
26
|
+
// Check specs directory
|
|
27
|
+
const specsDir = join(cwd, config.specsDir);
|
|
28
|
+
if (!existsSync(specsDir)) {
|
|
29
|
+
result.warnings.push(`${config.specsDir}/ directory not found. No features created yet.`);
|
|
30
|
+
console.log(chalk.yellow('⚠'), `${config.specsDir}/ not found`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(chalk.green('✓'), `${config.specsDir}/ directory exists`);
|
|
34
|
+
const features = readdirSync(specsDir, { withFileTypes: true })
|
|
35
|
+
.filter((d) => d.isDirectory())
|
|
36
|
+
.map((d) => d.name);
|
|
37
|
+
for (const feature of features) {
|
|
38
|
+
const featureDir = join(specsDir, feature);
|
|
39
|
+
const metaPath = join(featureDir, '_meta.json');
|
|
40
|
+
if (existsSync(metaPath)) {
|
|
41
|
+
console.log(chalk.green('✓'), `${feature}/ has valid _meta.json`);
|
|
42
|
+
const mm = new MigrationManager(featureDir);
|
|
43
|
+
const meta = mm.loadMeta();
|
|
44
|
+
if (meta) {
|
|
45
|
+
const migrations = Object.keys(meta.migrations).length;
|
|
46
|
+
const current = meta.currentMigration || 'none';
|
|
47
|
+
console.log(chalk.gray(' └'), `Migrations: ${migrations}, Current: ${current}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const hasOldStructure = existsSync(join(featureDir, 'spec.md')) || existsSync(join(featureDir, 'tasks.md'));
|
|
52
|
+
if (hasOldStructure) {
|
|
53
|
+
result.warnings.push(`${feature}/ uses old structure. Run "sedd migrate ${feature}" to upgrade.`);
|
|
54
|
+
console.log(chalk.yellow('⚠'), `${feature}/ needs migration`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result.warnings.push(`${feature}/ has no _meta.json`);
|
|
58
|
+
console.log(chalk.yellow('⚠'), `${feature}/ missing _meta.json`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Check .claude directory
|
|
64
|
+
const claudeDir = join(cwd, '.claude');
|
|
65
|
+
const commandsDir = join(claudeDir, 'commands');
|
|
66
|
+
const hooksDir = join(claudeDir, 'hooks');
|
|
67
|
+
if (!existsSync(commandsDir)) {
|
|
68
|
+
result.warnings.push('.claude/commands/ not found. Run "sedd init" to install commands.');
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const requiredCommands = [
|
|
72
|
+
'sedd.specify.md',
|
|
73
|
+
'sedd.clarify.md',
|
|
74
|
+
'sedd.implement.md',
|
|
75
|
+
];
|
|
76
|
+
for (const cmd of requiredCommands) {
|
|
77
|
+
const cmdPath = join(commandsDir, cmd);
|
|
78
|
+
if (existsSync(cmdPath)) {
|
|
79
|
+
console.log(chalk.green('✓'), `Command: ${cmd}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
result.warnings.push(`Missing command: ${cmd}`);
|
|
83
|
+
console.log(chalk.yellow('⚠'), `Missing: ${cmd}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!existsSync(hooksDir)) {
|
|
88
|
+
result.warnings.push('.claude/hooks/ not found. Run "sedd init" to install hooks.');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const hookFiles = ['check-roadmap.js', 'check-roadmap.ps1'];
|
|
92
|
+
for (const hook of hookFiles) {
|
|
93
|
+
const hookPath = join(hooksDir, hook);
|
|
94
|
+
if (existsSync(hookPath)) {
|
|
95
|
+
console.log(chalk.green('✓'), `Hook: ${hook}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check git branch
|
|
100
|
+
if (git.hasGit()) {
|
|
101
|
+
const branch = git.getCurrentBranch();
|
|
102
|
+
if (git.isFeatureBranch(branch)) {
|
|
103
|
+
console.log(chalk.green('✓'), `On feature branch: ${branch}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
result.warnings.push(`Not on a feature branch (current: ${branch})`);
|
|
107
|
+
console.log(chalk.yellow('⚠'), `Not on feature branch: ${branch}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
console.log();
|
|
111
|
+
if (result.errors.length > 0) {
|
|
112
|
+
console.log(chalk.red('Errors:'));
|
|
113
|
+
for (const error of result.errors) {
|
|
114
|
+
console.log(chalk.red(' ✗'), error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (result.warnings.length > 0) {
|
|
118
|
+
console.log(chalk.yellow('Warnings:'));
|
|
119
|
+
for (const warning of result.warnings) {
|
|
120
|
+
console.log(chalk.yellow(' ⚠'), warning);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (result.valid && result.warnings.length === 0) {
|
|
124
|
+
console.log(chalk.green('✨ All checks passed!\n'));
|
|
125
|
+
}
|
|
126
|
+
else if (result.valid) {
|
|
127
|
+
console.log(chalk.yellow('\n⚠ Some warnings found, but structure is valid.\n'));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(chalk.red('\n✗ Structure is invalid. Please fix errors.\n'));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarify.d.ts","sourceRoot":"","sources":["../../src/cli/clarify.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiI5D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { loadConfig, getNextMigrationId, getMigrationFolder } from '../types/index.js';
|
|
5
|
+
import { GitOperations } from '../utils/git.js';
|
|
6
|
+
import { getSessionTimestamp, formatTimestamp } from '../core/timestamps.js';
|
|
7
|
+
export async function clarify(branch) {
|
|
8
|
+
const cwd = process.cwd();
|
|
9
|
+
const config = loadConfig(cwd);
|
|
10
|
+
const git = new GitOperations(cwd);
|
|
11
|
+
const currentBranch = branch || git.getCurrentBranch();
|
|
12
|
+
if (!git.isFeatureBranch(currentBranch)) {
|
|
13
|
+
console.log(chalk.red(`Error: Not on a feature branch (current: ${currentBranch})`));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
let featureDir = join(cwd, config.specsDir, currentBranch);
|
|
17
|
+
if (!existsSync(featureDir)) {
|
|
18
|
+
featureDir = join(cwd, 'specs', currentBranch);
|
|
19
|
+
}
|
|
20
|
+
if (!existsSync(featureDir)) {
|
|
21
|
+
console.log(chalk.red(`Error: Feature directory not found for branch: ${currentBranch}`));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const metaPath = join(featureDir, '_meta.json');
|
|
25
|
+
if (!existsSync(metaPath)) {
|
|
26
|
+
console.log(chalk.red('Error: _meta.json not found. Run /sedd.specify first.'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));
|
|
30
|
+
const migrationId = getNextMigrationId(meta);
|
|
31
|
+
const timestamp = getSessionTimestamp();
|
|
32
|
+
const migrationFolder = getMigrationFolder(migrationId, timestamp);
|
|
33
|
+
const migrationDir = join(featureDir, migrationFolder);
|
|
34
|
+
mkdirSync(migrationDir, { recursive: true });
|
|
35
|
+
console.log(chalk.green('✓'), `Created migration: ${migrationFolder}`);
|
|
36
|
+
const dateStr = formatTimestamp();
|
|
37
|
+
const previousMigration = meta.currentMigration;
|
|
38
|
+
const clarifyContent = `# Clarification Session - Migration ${migrationId}
|
|
39
|
+
|
|
40
|
+
**Timestamp:** ${dateStr}
|
|
41
|
+
**Branch:** ${currentBranch}
|
|
42
|
+
|
|
43
|
+
## Expected Outcome
|
|
44
|
+
|
|
45
|
+
> What do you expect to achieve with this migration?
|
|
46
|
+
|
|
47
|
+
[Define your expected outcome here]
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Questions & Answers
|
|
52
|
+
|
|
53
|
+
<!-- Questions discussed during this clarification session -->
|
|
54
|
+
|
|
55
|
+
### Q1: [Question]
|
|
56
|
+
|
|
57
|
+
**Answer:** [Answer]
|
|
58
|
+
|
|
59
|
+
`;
|
|
60
|
+
writeFileSync(join(migrationDir, 'clarify.md'), clarifyContent, 'utf-8');
|
|
61
|
+
console.log(chalk.green('✓'), 'Created: clarify.md');
|
|
62
|
+
const decisionsContent = `# Decisions - Migration ${migrationId}
|
|
63
|
+
|
|
64
|
+
**Timestamp:** ${dateStr}
|
|
65
|
+
|
|
66
|
+
## Decisions Made
|
|
67
|
+
|
|
68
|
+
| # | Decision | Rationale |
|
|
69
|
+
|---|----------|-----------|
|
|
70
|
+
| 1 | [Decision] | [Why] |
|
|
71
|
+
|
|
72
|
+
`;
|
|
73
|
+
writeFileSync(join(migrationDir, 'decisions.md'), decisionsContent, 'utf-8');
|
|
74
|
+
console.log(chalk.green('✓'), 'Created: decisions.md');
|
|
75
|
+
const tasksContent = `# Tasks - Migration ${migrationId}
|
|
76
|
+
|
|
77
|
+
**Migration:** ${migrationId}
|
|
78
|
+
**Timestamp:** ${timestamp}
|
|
79
|
+
**Parent:** ${previousMigration || 'none'}
|
|
80
|
+
|
|
81
|
+
## Tasks
|
|
82
|
+
|
|
83
|
+
<!-- Tasks will be added here by /sedd.tasks -->
|
|
84
|
+
<!-- Format: - [ ] T${migrationId}-001 [US1] Task description -->
|
|
85
|
+
|
|
86
|
+
`;
|
|
87
|
+
writeFileSync(join(migrationDir, 'tasks.md'), tasksContent, 'utf-8');
|
|
88
|
+
console.log(chalk.green('✓'), 'Created: tasks.md');
|
|
89
|
+
meta.currentMigration = migrationId;
|
|
90
|
+
meta.migrations[migrationId] = {
|
|
91
|
+
id: migrationId,
|
|
92
|
+
timestamp,
|
|
93
|
+
folder: migrationFolder,
|
|
94
|
+
parent: previousMigration || undefined,
|
|
95
|
+
status: 'pending',
|
|
96
|
+
tasksTotal: 0,
|
|
97
|
+
tasksCompleted: 0,
|
|
98
|
+
createdAt: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
|
|
101
|
+
console.log(chalk.green('✓'), 'Updated: _meta.json');
|
|
102
|
+
console.log(chalk.cyan(`\n✨ Migration ${migrationId} created successfully!`));
|
|
103
|
+
console.log(chalk.cyan('Next steps:'));
|
|
104
|
+
console.log(' 1. Add questions/answers to clarify.md');
|
|
105
|
+
console.log(' 2. Document decisions in decisions.md');
|
|
106
|
+
console.log(' 3. Run /sedd.tasks to generate tasks');
|
|
107
|
+
console.log(chalk.gray('\n---SEDD-OUTPUT---'));
|
|
108
|
+
console.log(JSON.stringify({
|
|
109
|
+
success: true,
|
|
110
|
+
migrationId,
|
|
111
|
+
migrationFolder,
|
|
112
|
+
migrationDir,
|
|
113
|
+
files: ['clarify.md', 'decisions.md', 'tasks.md'],
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=clarify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clarify.js","sourceRoot":"","sources":["../../src/cli/clarify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|