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.
Files changed (90) hide show
  1. package/README.md +504 -0
  2. package/bin/sedd.js +6 -0
  3. package/commands/sedd.clarify.md +435 -0
  4. package/commands/sedd.dashboard.md +145 -0
  5. package/commands/sedd.implement.md +326 -0
  6. package/commands/sedd.migrate.md +249 -0
  7. package/commands/sedd.specify.md +198 -0
  8. package/commands/sedd.tasks.md +176 -0
  9. package/dist/cli/check.d.ts +6 -0
  10. package/dist/cli/check.d.ts.map +1 -0
  11. package/dist/cli/check.js +134 -0
  12. package/dist/cli/check.js.map +1 -0
  13. package/dist/cli/clarify.d.ts +2 -0
  14. package/dist/cli/clarify.d.ts.map +1 -0
  15. package/dist/cli/clarify.js +116 -0
  16. package/dist/cli/clarify.js.map +1 -0
  17. package/dist/cli/index.d.ts +8 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +175 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/init.d.ts +9 -0
  22. package/dist/cli/init.d.ts.map +1 -0
  23. package/dist/cli/init.js +236 -0
  24. package/dist/cli/init.js.map +1 -0
  25. package/dist/cli/migrate.d.ts +7 -0
  26. package/dist/cli/migrate.d.ts.map +1 -0
  27. package/dist/cli/migrate.js +197 -0
  28. package/dist/cli/migrate.js.map +1 -0
  29. package/dist/cli/specify.d.ts +7 -0
  30. package/dist/cli/specify.d.ts.map +1 -0
  31. package/dist/cli/specify.js +131 -0
  32. package/dist/cli/specify.js.map +1 -0
  33. package/dist/cli/status.d.ts +6 -0
  34. package/dist/cli/status.d.ts.map +1 -0
  35. package/dist/cli/status.js +118 -0
  36. package/dist/cli/status.js.map +1 -0
  37. package/dist/cli/tasks.d.ts +7 -0
  38. package/dist/cli/tasks.d.ts.map +1 -0
  39. package/dist/cli/tasks.js +165 -0
  40. package/dist/cli/tasks.js.map +1 -0
  41. package/dist/core/changelog.d.ts +30 -0
  42. package/dist/core/changelog.d.ts.map +1 -0
  43. package/dist/core/changelog.js +97 -0
  44. package/dist/core/changelog.js.map +1 -0
  45. package/dist/core/file-splitter.d.ts +39 -0
  46. package/dist/core/file-splitter.d.ts.map +1 -0
  47. package/dist/core/file-splitter.js +162 -0
  48. package/dist/core/file-splitter.js.map +1 -0
  49. package/dist/core/migration-manager.d.ts +76 -0
  50. package/dist/core/migration-manager.d.ts.map +1 -0
  51. package/dist/core/migration-manager.js +230 -0
  52. package/dist/core/migration-manager.js.map +1 -0
  53. package/dist/core/timestamps.d.ts +17 -0
  54. package/dist/core/timestamps.d.ts.map +1 -0
  55. package/dist/core/timestamps.js +37 -0
  56. package/dist/core/timestamps.js.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +7 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/types/index.d.ts +102 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/index.js +83 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/utils/git.d.ts +63 -0
  66. package/dist/utils/git.d.ts.map +1 -0
  67. package/dist/utils/git.js +179 -0
  68. package/dist/utils/git.js.map +1 -0
  69. package/hooks/README.md +220 -0
  70. package/hooks/check-roadmap.js +231 -0
  71. package/hooks/check-roadmap.ps1 +343 -0
  72. package/package.json +60 -0
  73. package/scripts/bash/sedd-clarify.sh +142 -0
  74. package/scripts/bash/sedd-complete-task.sh +108 -0
  75. package/scripts/bash/sedd-specify.sh +147 -0
  76. package/scripts/powershell/sedd-clarify.ps1 +222 -0
  77. package/scripts/powershell/sedd-complete-task.ps1 +143 -0
  78. package/scripts/powershell/sedd-specify.ps1 +192 -0
  79. package/scripts/powershell/sedd-status.ps1 +153 -0
  80. package/scripts/powershell/sedd-tasks.ps1 +176 -0
  81. package/templates/changelog-template.md +6 -0
  82. package/templates/clarify-template.md +66 -0
  83. package/templates/config-template.json +20 -0
  84. package/templates/decisions-template.md +56 -0
  85. package/templates/interfaces-template.ts +131 -0
  86. package/templates/meta-template.json +12 -0
  87. package/templates/progress-template.md +61 -0
  88. package/templates/sedd.schema.json +95 -0
  89. package/templates/spec-template.md +114 -0
  90. 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"}
@@ -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"}