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,230 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getNextMigrationId, getMigrationFolder, parseMigrationFolder, } from '../types/index.js';
|
|
4
|
+
import { formatTimestamp, getSessionTimestamp } from './timestamps.js';
|
|
5
|
+
export class MigrationManager {
|
|
6
|
+
featureDir;
|
|
7
|
+
metaPath;
|
|
8
|
+
meta = null;
|
|
9
|
+
constructor(featureDir) {
|
|
10
|
+
this.featureDir = featureDir;
|
|
11
|
+
this.metaPath = join(featureDir, '_meta.json');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Initialize a new feature (no migrations yet)
|
|
15
|
+
*/
|
|
16
|
+
initFeature(featureId, featureName, branch) {
|
|
17
|
+
const now = formatTimestamp();
|
|
18
|
+
this.meta = {
|
|
19
|
+
featureId,
|
|
20
|
+
featureName,
|
|
21
|
+
branch,
|
|
22
|
+
createdAt: now,
|
|
23
|
+
specCreatedAt: now,
|
|
24
|
+
currentMigration: null,
|
|
25
|
+
migrations: {},
|
|
26
|
+
splits: [],
|
|
27
|
+
commits: [],
|
|
28
|
+
};
|
|
29
|
+
this.saveMeta();
|
|
30
|
+
return this.meta;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load existing feature metadata
|
|
34
|
+
*/
|
|
35
|
+
loadMeta() {
|
|
36
|
+
if (!existsSync(this.metaPath)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const content = readFileSync(this.metaPath, 'utf-8');
|
|
40
|
+
this.meta = JSON.parse(content);
|
|
41
|
+
return this.meta;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Save metadata to file
|
|
45
|
+
*/
|
|
46
|
+
saveMeta() {
|
|
47
|
+
if (!this.meta) {
|
|
48
|
+
throw new Error('No metadata to save');
|
|
49
|
+
}
|
|
50
|
+
if (!existsSync(this.featureDir)) {
|
|
51
|
+
mkdirSync(this.featureDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
writeFileSync(this.metaPath, JSON.stringify(this.meta, null, 2), 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a new migration
|
|
57
|
+
*/
|
|
58
|
+
createMigration() {
|
|
59
|
+
if (!this.meta) {
|
|
60
|
+
throw new Error('No feature loaded');
|
|
61
|
+
}
|
|
62
|
+
const timestamp = getSessionTimestamp();
|
|
63
|
+
const id = getNextMigrationId(this.meta);
|
|
64
|
+
const folder = getMigrationFolder(id, timestamp);
|
|
65
|
+
const parent = this.meta.currentMigration;
|
|
66
|
+
const migration = {
|
|
67
|
+
id,
|
|
68
|
+
timestamp,
|
|
69
|
+
folder,
|
|
70
|
+
parent: parent ?? undefined,
|
|
71
|
+
status: 'in-progress',
|
|
72
|
+
tasksTotal: 0,
|
|
73
|
+
tasksCompleted: 0,
|
|
74
|
+
createdAt: formatTimestamp(),
|
|
75
|
+
};
|
|
76
|
+
const migrationDir = join(this.featureDir, folder);
|
|
77
|
+
mkdirSync(migrationDir, { recursive: true });
|
|
78
|
+
this.meta.migrations[id] = migration;
|
|
79
|
+
this.meta.currentMigration = id;
|
|
80
|
+
this.saveMeta();
|
|
81
|
+
return migration;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get current migration
|
|
85
|
+
*/
|
|
86
|
+
getCurrentMigration() {
|
|
87
|
+
if (!this.meta) {
|
|
88
|
+
this.loadMeta();
|
|
89
|
+
}
|
|
90
|
+
if (!this.meta?.currentMigration) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return this.meta.migrations[this.meta.currentMigration] ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get migration by ID
|
|
97
|
+
*/
|
|
98
|
+
getMigration(id) {
|
|
99
|
+
if (!this.meta) {
|
|
100
|
+
this.loadMeta();
|
|
101
|
+
}
|
|
102
|
+
return this.meta?.migrations[id] ?? null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get all migrations in order
|
|
106
|
+
*/
|
|
107
|
+
getAllMigrations() {
|
|
108
|
+
if (!this.meta) {
|
|
109
|
+
this.loadMeta();
|
|
110
|
+
}
|
|
111
|
+
if (!this.meta) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
return Object.values(this.meta.migrations).sort((a, b) => a.id.localeCompare(b.id));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get migration directory path
|
|
118
|
+
*/
|
|
119
|
+
getMigrationDir(migrationId) {
|
|
120
|
+
const migration = this.getMigration(migrationId);
|
|
121
|
+
if (!migration) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return join(this.featureDir, migration.folder);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Update migration status
|
|
128
|
+
*/
|
|
129
|
+
updateMigrationStatus(id, status) {
|
|
130
|
+
if (!this.meta) {
|
|
131
|
+
throw new Error('No feature loaded');
|
|
132
|
+
}
|
|
133
|
+
const migration = this.meta.migrations[id];
|
|
134
|
+
if (!migration) {
|
|
135
|
+
throw new Error(`Migration ${id} not found`);
|
|
136
|
+
}
|
|
137
|
+
migration.status = status;
|
|
138
|
+
if (status === 'completed') {
|
|
139
|
+
migration.completedAt = formatTimestamp();
|
|
140
|
+
}
|
|
141
|
+
this.saveMeta();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Update migration task counts
|
|
145
|
+
*/
|
|
146
|
+
updateMigrationTasks(id, total, completed) {
|
|
147
|
+
if (!this.meta) {
|
|
148
|
+
throw new Error('No feature loaded');
|
|
149
|
+
}
|
|
150
|
+
const migration = this.meta.migrations[id];
|
|
151
|
+
if (!migration) {
|
|
152
|
+
throw new Error(`Migration ${id} not found`);
|
|
153
|
+
}
|
|
154
|
+
migration.tasksTotal = total;
|
|
155
|
+
migration.tasksCompleted = completed;
|
|
156
|
+
if (completed >= total && total > 0) {
|
|
157
|
+
migration.status = 'completed';
|
|
158
|
+
migration.completedAt = formatTimestamp();
|
|
159
|
+
}
|
|
160
|
+
this.saveMeta();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Record a commit
|
|
164
|
+
*/
|
|
165
|
+
recordCommit(migrationId, hash, message) {
|
|
166
|
+
if (!this.meta) {
|
|
167
|
+
throw new Error('No feature loaded');
|
|
168
|
+
}
|
|
169
|
+
this.meta.commits.push({
|
|
170
|
+
migration: migrationId,
|
|
171
|
+
hash,
|
|
172
|
+
message,
|
|
173
|
+
timestamp: formatTimestamp(),
|
|
174
|
+
});
|
|
175
|
+
this.saveMeta();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get pending migrations (not completed)
|
|
179
|
+
*/
|
|
180
|
+
getPendingMigrations() {
|
|
181
|
+
return this.getAllMigrations().filter((m) => m.status !== 'completed');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get migrations up to a specific ID
|
|
185
|
+
*/
|
|
186
|
+
getMigrationsUpTo(id) {
|
|
187
|
+
return this.getAllMigrations().filter((m) => m.id <= id);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get feature status summary
|
|
191
|
+
*/
|
|
192
|
+
getStatus() {
|
|
193
|
+
if (!this.meta) {
|
|
194
|
+
this.loadMeta();
|
|
195
|
+
}
|
|
196
|
+
if (!this.meta) {
|
|
197
|
+
throw new Error('No feature loaded');
|
|
198
|
+
}
|
|
199
|
+
const migrations = Object.values(this.meta.migrations);
|
|
200
|
+
const completed = migrations.filter((m) => m.status === 'completed').length;
|
|
201
|
+
let pendingTasks = 0;
|
|
202
|
+
let completedTasks = 0;
|
|
203
|
+
for (const m of migrations) {
|
|
204
|
+
completedTasks += m.tasksCompleted;
|
|
205
|
+
pendingTasks += m.tasksTotal - m.tasksCompleted;
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
featureId: this.meta.featureId,
|
|
209
|
+
featureName: this.meta.featureName,
|
|
210
|
+
currentMigration: this.meta.currentMigration,
|
|
211
|
+
totalMigrations: migrations.length,
|
|
212
|
+
completedMigrations: completed,
|
|
213
|
+
pendingTasks,
|
|
214
|
+
completedTasks,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Scan feature directory for migration folders
|
|
219
|
+
*/
|
|
220
|
+
scanMigrationFolders() {
|
|
221
|
+
if (!existsSync(this.featureDir)) {
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
return readdirSync(this.featureDir, { withFileTypes: true })
|
|
225
|
+
.filter((d) => d.isDirectory() && parseMigrationFolder(d.name))
|
|
226
|
+
.map((d) => d.name)
|
|
227
|
+
.sort();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=migration-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-manager.js","sourceRoot":"","sources":["../../src/core/migration-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format a date to ISO string with timezone
|
|
3
|
+
*/
|
|
4
|
+
export declare const formatTimestamp: (date?: Date) => string;
|
|
5
|
+
/**
|
|
6
|
+
* Get a session timestamp for file naming (YYYY-MM-DD_HH-mm-ss)
|
|
7
|
+
*/
|
|
8
|
+
export declare const getSessionTimestamp: (date?: Date) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a session timestamp back to a Date
|
|
11
|
+
*/
|
|
12
|
+
export declare const parseSessionTimestamp: (timestamp: string) => Date;
|
|
13
|
+
/**
|
|
14
|
+
* Format a date for display in changelog entries
|
|
15
|
+
*/
|
|
16
|
+
export declare const formatChangelogDate: (date?: Date) => string;
|
|
17
|
+
//# sourceMappingURL=timestamps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamps.d.ts","sourceRoot":"","sources":["../../src/core/timestamps.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAM,IAAiB,KAAG,MAEzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,IAAiB,KAAG,MAW7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,KAAG,IAezD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,IAAiB,KAAG,MAE7D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format a date to ISO string with timezone
|
|
3
|
+
*/
|
|
4
|
+
export const formatTimestamp = (date = new Date()) => {
|
|
5
|
+
return date.toISOString();
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Get a session timestamp for file naming (YYYY-MM-DD_HH-mm-ss)
|
|
9
|
+
*/
|
|
10
|
+
export const getSessionTimestamp = (date = new Date()) => {
|
|
11
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
12
|
+
const year = date.getFullYear();
|
|
13
|
+
const month = pad(date.getMonth() + 1);
|
|
14
|
+
const day = pad(date.getDate());
|
|
15
|
+
const hours = pad(date.getHours());
|
|
16
|
+
const minutes = pad(date.getMinutes());
|
|
17
|
+
const seconds = pad(date.getSeconds());
|
|
18
|
+
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Parse a session timestamp back to a Date
|
|
22
|
+
*/
|
|
23
|
+
export const parseSessionTimestamp = (timestamp) => {
|
|
24
|
+
const match = timestamp.match(/^(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})$/);
|
|
25
|
+
if (!match) {
|
|
26
|
+
throw new Error(`Invalid session timestamp format: ${timestamp}`);
|
|
27
|
+
}
|
|
28
|
+
const [, year, month, day, hours, minutes, seconds] = match;
|
|
29
|
+
return new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hours), parseInt(minutes), parseInt(seconds));
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Format a date for display in changelog entries
|
|
33
|
+
*/
|
|
34
|
+
export const formatChangelogDate = (date = new Date()) => {
|
|
35
|
+
return date.toISOString().split('T')[0];
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=timestamps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamps.js","sourceRoot":"","sources":["../../src/core/timestamps.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAa,IAAI,IAAI,EAAE,EAAU,EAAE;IACjE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAa,IAAI,IAAI,EAAE,EAAU,EAAE;IACrE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAEvC,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAQ,EAAE;IAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;IAC5D,OAAO,IAAI,IAAI,CACb,QAAQ,CAAC,IAAI,CAAC,EACd,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EACnB,QAAQ,CAAC,GAAG,CAAC,EACb,QAAQ,CAAC,KAAK,CAAC,EACf,QAAQ,CAAC,OAAO,CAAC,EACjB,QAAQ,CAAC,OAAO,CAAC,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAa,IAAI,IAAI,EAAE,EAAU,EAAE;IACrE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { MigrationManager } from './core/migration-manager.js';
|
|
2
|
+
export { FileSplitter } from './core/file-splitter.js';
|
|
3
|
+
export { ChangelogManager } from './core/changelog.js';
|
|
4
|
+
export { formatTimestamp, getSessionTimestamp, formatChangelogDate } from './core/timestamps.js';
|
|
5
|
+
export { GitOperations } from './utils/git.js';
|
|
6
|
+
export type { MigrationInfo, MigrationStatus, FeatureMeta, TaskInfo, SeddConfig, AutoSplitConfig, HooksConfig, CommitConfig, CommitInfo, SplitInfo, } from './types/index.js';
|
|
7
|
+
export { DEFAULT_CONFIG, loadConfig, getFeaturePath, getNextMigrationId, getMigrationFolder, parseMigrationFolder, getTaskId, parseTaskId, } from './types/index.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,eAAe,EACf,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { MigrationManager } from './core/migration-manager.js';
|
|
2
|
+
export { FileSplitter } from './core/file-splitter.js';
|
|
3
|
+
export { ChangelogManager } from './core/changelog.js';
|
|
4
|
+
export { formatTimestamp, getSessionTimestamp, formatChangelogDate } from './core/timestamps.js';
|
|
5
|
+
export { GitOperations } from './utils/git.js';
|
|
6
|
+
export { DEFAULT_CONFIG, loadConfig, getFeaturePath, getNextMigrationId, getMigrationFolder, parseMigrationFolder, getTaskId, parseTaskId, } from './types/index.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAe/C,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,WAAW,GACZ,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export type MigrationStatus = 'pending' | 'in-progress' | 'completed';
|
|
2
|
+
export interface MigrationInfo {
|
|
3
|
+
id: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
folder: string;
|
|
6
|
+
parent?: string;
|
|
7
|
+
status: MigrationStatus;
|
|
8
|
+
tasksTotal: number;
|
|
9
|
+
tasksCompleted: number;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
completedAt?: string;
|
|
12
|
+
expectation?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CommitInfo {
|
|
15
|
+
migration: string;
|
|
16
|
+
hash: string;
|
|
17
|
+
message: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SplitInfo {
|
|
21
|
+
originalFile: string;
|
|
22
|
+
parts: string[];
|
|
23
|
+
splitAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface FeatureMeta {
|
|
26
|
+
featureId: string;
|
|
27
|
+
featureName: string;
|
|
28
|
+
branch: string;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
specCreatedAt: string;
|
|
31
|
+
currentMigration: string | null;
|
|
32
|
+
migrations: Record<string, MigrationInfo>;
|
|
33
|
+
splits: SplitInfo[];
|
|
34
|
+
commits: CommitInfo[];
|
|
35
|
+
expectation?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface TaskInfo {
|
|
38
|
+
id: string;
|
|
39
|
+
migrationId: string;
|
|
40
|
+
description: string;
|
|
41
|
+
filePath?: string;
|
|
42
|
+
status: 'pending' | 'in-progress' | 'completed' | 'blocked';
|
|
43
|
+
markers: string[];
|
|
44
|
+
completedAt?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface AutoSplitConfig {
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
maxLines: number;
|
|
49
|
+
}
|
|
50
|
+
export interface HooksConfig {
|
|
51
|
+
assertive: boolean;
|
|
52
|
+
skills: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface CommitConfig {
|
|
55
|
+
askBeforeCommit: boolean;
|
|
56
|
+
messagePattern: string;
|
|
57
|
+
}
|
|
58
|
+
export type ScriptRunner = 'auto' | 'powershell' | 'bash';
|
|
59
|
+
export interface SeddConfig {
|
|
60
|
+
specsDir: string;
|
|
61
|
+
branchPattern: string;
|
|
62
|
+
scriptRunner: ScriptRunner;
|
|
63
|
+
autoSplit: AutoSplitConfig;
|
|
64
|
+
hooks: HooksConfig;
|
|
65
|
+
commit: CommitConfig;
|
|
66
|
+
}
|
|
67
|
+
export declare const DEFAULT_CONFIG: SeddConfig;
|
|
68
|
+
/**
|
|
69
|
+
* Load config from sedd.config.json or use defaults
|
|
70
|
+
*/
|
|
71
|
+
export declare const loadConfig: (projectRoot: string) => SeddConfig;
|
|
72
|
+
/**
|
|
73
|
+
* Get feature directory path
|
|
74
|
+
*/
|
|
75
|
+
export declare const getFeaturePath: (config: SeddConfig, projectRoot: string, featureBranch: string) => string;
|
|
76
|
+
/**
|
|
77
|
+
* Generate next migration ID (001, 002, 003...)
|
|
78
|
+
*/
|
|
79
|
+
export declare const getNextMigrationId: (meta: FeatureMeta) => string;
|
|
80
|
+
/**
|
|
81
|
+
* Generate migration folder name: 001_2026-01-10_14-30-45
|
|
82
|
+
*/
|
|
83
|
+
export declare const getMigrationFolder: (id: string, timestamp: string) => string;
|
|
84
|
+
/**
|
|
85
|
+
* Parse migration folder name
|
|
86
|
+
*/
|
|
87
|
+
export declare const parseMigrationFolder: (folder: string) => {
|
|
88
|
+
id: string;
|
|
89
|
+
timestamp: string;
|
|
90
|
+
} | null;
|
|
91
|
+
/**
|
|
92
|
+
* Generate task ID: T001-001, T001-002, T002-001...
|
|
93
|
+
*/
|
|
94
|
+
export declare const getTaskId: (migrationId: string, taskNumber: number) => string;
|
|
95
|
+
/**
|
|
96
|
+
* Parse task ID
|
|
97
|
+
*/
|
|
98
|
+
export declare const parseTaskId: (taskId: string) => {
|
|
99
|
+
migrationId: string;
|
|
100
|
+
taskNumber: number;
|
|
101
|
+
} | null;
|
|
102
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
specsDir: '.sedd',
|
|
3
|
+
branchPattern: '{{id}}-{{name}}',
|
|
4
|
+
scriptRunner: 'auto',
|
|
5
|
+
autoSplit: {
|
|
6
|
+
enabled: true,
|
|
7
|
+
maxLines: 400,
|
|
8
|
+
},
|
|
9
|
+
hooks: {
|
|
10
|
+
assertive: true,
|
|
11
|
+
skills: ['langchain-expert', 'architecture-mapper', 'defect-analyzer'],
|
|
12
|
+
},
|
|
13
|
+
commit: {
|
|
14
|
+
askBeforeCommit: true,
|
|
15
|
+
messagePattern: '{{type}}({{id}}): {{message}}',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
/**
|
|
21
|
+
* Load config from sedd.config.json or use defaults
|
|
22
|
+
*/
|
|
23
|
+
export const loadConfig = (projectRoot) => {
|
|
24
|
+
const configPath = join(projectRoot, 'sedd.config.json');
|
|
25
|
+
if (existsSync(configPath)) {
|
|
26
|
+
const userConfig = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
27
|
+
return { ...DEFAULT_CONFIG, ...userConfig };
|
|
28
|
+
}
|
|
29
|
+
return DEFAULT_CONFIG;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Get feature directory path
|
|
33
|
+
*/
|
|
34
|
+
export const getFeaturePath = (config, projectRoot, featureBranch) => {
|
|
35
|
+
return join(projectRoot, config.specsDir, featureBranch);
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Generate next migration ID (001, 002, 003...)
|
|
39
|
+
*/
|
|
40
|
+
export const getNextMigrationId = (meta) => {
|
|
41
|
+
const ids = Object.keys(meta.migrations).map((id) => parseInt(id));
|
|
42
|
+
const max = ids.length > 0 ? Math.max(...ids) : 0;
|
|
43
|
+
return (max + 1).toString().padStart(3, '0');
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Generate migration folder name: 001_2026-01-10_14-30-45
|
|
47
|
+
*/
|
|
48
|
+
export const getMigrationFolder = (id, timestamp) => {
|
|
49
|
+
return `${id}_${timestamp}`;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Parse migration folder name
|
|
53
|
+
*/
|
|
54
|
+
export const parseMigrationFolder = (folder) => {
|
|
55
|
+
const match = folder.match(/^(\d{3})_(\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2})$/);
|
|
56
|
+
if (!match) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
id: match[1],
|
|
61
|
+
timestamp: match[2],
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Generate task ID: T001-001, T001-002, T002-001...
|
|
66
|
+
*/
|
|
67
|
+
export const getTaskId = (migrationId, taskNumber) => {
|
|
68
|
+
return `T${migrationId}-${taskNumber.toString().padStart(3, '0')}`;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Parse task ID
|
|
72
|
+
*/
|
|
73
|
+
export const parseTaskId = (taskId) => {
|
|
74
|
+
const match = taskId.match(/^T(\d{3})-(\d{3})$/);
|
|
75
|
+
if (!match) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
migrationId: match[1],
|
|
80
|
+
taskNumber: parseInt(match[2]),
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface GitStatus {
|
|
2
|
+
hasGit: boolean;
|
|
3
|
+
branch: string;
|
|
4
|
+
isClean: boolean;
|
|
5
|
+
stagedFiles: string[];
|
|
6
|
+
unstagedFiles: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare class GitOperations {
|
|
9
|
+
private cwd;
|
|
10
|
+
constructor(cwd?: string);
|
|
11
|
+
/**
|
|
12
|
+
* Check if git is available and we're in a repo
|
|
13
|
+
*/
|
|
14
|
+
hasGit(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Get repository root
|
|
17
|
+
*/
|
|
18
|
+
getRepoRoot(): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Get current branch name
|
|
21
|
+
*/
|
|
22
|
+
getCurrentBranch(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Create and checkout a new branch
|
|
25
|
+
*/
|
|
26
|
+
createBranch(branchName: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get git status
|
|
29
|
+
*/
|
|
30
|
+
getStatus(): GitStatus;
|
|
31
|
+
/**
|
|
32
|
+
* Stage files
|
|
33
|
+
*/
|
|
34
|
+
stageFiles(files: string[]): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Stage all changes in a directory
|
|
37
|
+
*/
|
|
38
|
+
stageDirectory(dir: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Create a commit
|
|
41
|
+
*/
|
|
42
|
+
commit(message: string): string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Get highest feature number from branches
|
|
45
|
+
*/
|
|
46
|
+
getHighestBranchNumber(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Fetch all remotes
|
|
49
|
+
*/
|
|
50
|
+
fetchAll(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Check if branch name is valid feature branch (###-name)
|
|
53
|
+
*/
|
|
54
|
+
isFeatureBranch(branch: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Parse feature info from branch name
|
|
57
|
+
*/
|
|
58
|
+
parseFeatureBranch(branch: string): {
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
} | null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,GAAE,MAAsB;IAIvC;;OAEG;IACH,MAAM,IAAI,OAAO;IASjB;;OAEG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IASzC;;OAEG;IACH,SAAS,IAAI,SAAS;IAmCtB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IASpC;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASpC;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUtC;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAsBhC;;OAEG;IACH,QAAQ,IAAI,OAAO;IASnB;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAUxE"}
|