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,165 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import { loadConfig, getTaskId } from '../types/index.js';
5
+ import { GitOperations } from '../utils/git.js';
6
+ const getNextTaskNumber = (content, migrationId) => {
7
+ const pattern = new RegExp(`T${migrationId}-(\\d{3})`, 'g');
8
+ let maxNum = 0;
9
+ let match;
10
+ while ((match = pattern.exec(content)) !== null) {
11
+ const num = parseInt(match[1], 10);
12
+ if (num > maxNum)
13
+ maxNum = num;
14
+ }
15
+ return maxNum + 1;
16
+ };
17
+ export async function addTasks(tasksJson, options = {}) {
18
+ const cwd = process.cwd();
19
+ const config = loadConfig(cwd);
20
+ const git = new GitOperations(cwd);
21
+ const branch = git.getCurrentBranch();
22
+ if (!git.isFeatureBranch(branch)) {
23
+ console.log(chalk.red('Error: Not on a feature branch'));
24
+ process.exit(1);
25
+ }
26
+ let featureDir = join(cwd, config.specsDir, branch);
27
+ if (!existsSync(featureDir)) {
28
+ featureDir = join(cwd, 'specs', branch);
29
+ }
30
+ if (!existsSync(featureDir)) {
31
+ console.log(chalk.red(`Error: Feature not found: ${branch}`));
32
+ process.exit(1);
33
+ }
34
+ const metaPath = join(featureDir, '_meta.json');
35
+ if (!existsSync(metaPath)) {
36
+ console.log(chalk.red('Error: _meta.json not found'));
37
+ process.exit(1);
38
+ }
39
+ const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));
40
+ const migrationId = options.migration || meta.currentMigration;
41
+ if (!migrationId) {
42
+ console.log(chalk.red('Error: No current migration. Run /sedd.clarify first.'));
43
+ process.exit(1);
44
+ }
45
+ const migInfo = meta.migrations[migrationId];
46
+ if (!migInfo) {
47
+ console.log(chalk.red(`Error: Migration ${migrationId} not found`));
48
+ process.exit(1);
49
+ }
50
+ const tasksFile = join(featureDir, migInfo.folder, 'tasks.md');
51
+ if (!existsSync(tasksFile)) {
52
+ console.log(chalk.red(`Error: tasks.md not found for migration ${migrationId}`));
53
+ process.exit(1);
54
+ }
55
+ let taskList;
56
+ try {
57
+ taskList = JSON.parse(tasksJson);
58
+ }
59
+ catch {
60
+ console.log(chalk.red('Error: Invalid tasks JSON'));
61
+ process.exit(1);
62
+ }
63
+ if (!Array.isArray(taskList) || taskList.length === 0) {
64
+ console.log(chalk.yellow('No tasks provided'));
65
+ return;
66
+ }
67
+ const content = readFileSync(tasksFile, 'utf-8');
68
+ let nextNum = getNextTaskNumber(content, migrationId);
69
+ const newTasks = [];
70
+ for (const task of taskList) {
71
+ const taskId = getTaskId(migrationId, nextNum);
72
+ const story = task.story ? `[${task.story}] ` : '';
73
+ const line = `- [ ] ${taskId} ${story}${task.description}`;
74
+ newTasks.push(line);
75
+ nextNum++;
76
+ }
77
+ const separator = content.endsWith('\n') ? '\n' : '\n\n';
78
+ const newContent = content + separator + newTasks.join('\n') + '\n';
79
+ writeFileSync(tasksFile, newContent, 'utf-8');
80
+ console.log(chalk.green(`Added ${taskList.length} task(s) to migration ${migrationId}`));
81
+ for (const t of newTasks) {
82
+ console.log(chalk.white(` ${t}`));
83
+ }
84
+ meta.migrations[migrationId].tasksTotal += taskList.length;
85
+ meta.migrations[migrationId].status = 'in-progress';
86
+ writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
87
+ console.log(chalk.gray('\n---SEDD-OUTPUT---'));
88
+ console.log(JSON.stringify({
89
+ success: true,
90
+ migrationId,
91
+ tasksAdded: taskList.length,
92
+ totalTasks: meta.migrations[migrationId].tasksTotal,
93
+ }));
94
+ }
95
+ export async function completeTask(taskId) {
96
+ const cwd = process.cwd();
97
+ const config = loadConfig(cwd);
98
+ const git = new GitOperations(cwd);
99
+ const branch = git.getCurrentBranch();
100
+ if (!git.isFeatureBranch(branch)) {
101
+ console.log(chalk.red('Error: Not on a feature branch'));
102
+ process.exit(1);
103
+ }
104
+ const match = taskId.match(/^T(\d{3})-(\d{3})$/);
105
+ if (!match) {
106
+ console.log(chalk.red('Error: Invalid task ID format. Expected: T001-001'));
107
+ process.exit(1);
108
+ }
109
+ const migId = match[1];
110
+ let featureDir = join(cwd, config.specsDir, branch);
111
+ if (!existsSync(featureDir)) {
112
+ featureDir = join(cwd, 'specs', branch);
113
+ }
114
+ if (!existsSync(featureDir)) {
115
+ console.log(chalk.red(`Error: Feature not found: ${branch}`));
116
+ process.exit(1);
117
+ }
118
+ const metaPath = join(featureDir, '_meta.json');
119
+ if (!existsSync(metaPath)) {
120
+ console.log(chalk.red('Error: _meta.json not found'));
121
+ process.exit(1);
122
+ }
123
+ const meta = JSON.parse(readFileSync(metaPath, 'utf-8'));
124
+ const migInfo = meta.migrations[migId];
125
+ if (!migInfo) {
126
+ console.log(chalk.red(`Error: Migration ${migId} not found`));
127
+ process.exit(1);
128
+ }
129
+ const tasksFile = join(featureDir, migInfo.folder, 'tasks.md');
130
+ if (!existsSync(tasksFile)) {
131
+ console.log(chalk.red('Error: tasks.md not found'));
132
+ process.exit(1);
133
+ }
134
+ let content = readFileSync(tasksFile, 'utf-8');
135
+ if (content.includes(`[x] ${taskId}`)) {
136
+ console.log(chalk.yellow(`Task ${taskId} is already completed`));
137
+ return;
138
+ }
139
+ if (!content.includes(`[ ] ${taskId}`)) {
140
+ console.log(chalk.red(`Error: Task ${taskId} not found`));
141
+ process.exit(1);
142
+ }
143
+ content = content.replace(`- [ ] ${taskId}`, `- [x] ${taskId}`);
144
+ writeFileSync(tasksFile, content, 'utf-8');
145
+ console.log(chalk.green(`Completed: ${taskId}`));
146
+ meta.migrations[migId].tasksCompleted++;
147
+ const { tasksCompleted, tasksTotal } = meta.migrations[migId];
148
+ if (tasksCompleted >= tasksTotal) {
149
+ meta.migrations[migId].status = 'completed';
150
+ meta.migrations[migId].completedAt = new Date().toISOString();
151
+ console.log(chalk.cyan(`Migration ${migId} completed!`));
152
+ }
153
+ writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
154
+ console.log(chalk.white(`Progress: ${tasksCompleted}/${tasksTotal} tasks`));
155
+ console.log(chalk.gray('\n---SEDD-OUTPUT---'));
156
+ console.log(JSON.stringify({
157
+ success: true,
158
+ taskId,
159
+ migrationId: migId,
160
+ completed: tasksCompleted,
161
+ total: tasksTotal,
162
+ migrationStatus: meta.migrations[migId].status,
163
+ }));
164
+ }
165
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/cli/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface ChangelogEntry {
2
+ date: string;
3
+ phase: string;
4
+ changes: string[];
5
+ }
6
+ export declare class ChangelogManager {
7
+ private changelogPath;
8
+ constructor(featureDir: string);
9
+ /**
10
+ * Initialize a new changelog file
11
+ */
12
+ init(featureId: string, featureName: string): void;
13
+ /**
14
+ * Add an entry to the changelog
15
+ */
16
+ addEntry(phase: string, changes: string[]): void;
17
+ /**
18
+ * Format a changelog entry
19
+ */
20
+ private formatEntry;
21
+ /**
22
+ * Get all entries from changelog
23
+ */
24
+ getEntries(): ChangelogEntry[];
25
+ /**
26
+ * Check if changelog exists
27
+ */
28
+ exists(): boolean;
29
+ }
30
+ //# sourceMappingURL=changelog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/core/changelog.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAS;gBAElB,UAAU,EAAE,MAAM;IAI9B;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IASlD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IA+BhD;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,UAAU,IAAI,cAAc,EAAE;IAqC9B;;OAEG;IACH,MAAM,IAAI,OAAO;CAGlB"}
@@ -0,0 +1,97 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { formatChangelogDate } from './timestamps.js';
4
+ export class ChangelogManager {
5
+ changelogPath;
6
+ constructor(featureDir) {
7
+ this.changelogPath = join(featureDir, 'CHANGELOG.md');
8
+ }
9
+ /**
10
+ * Initialize a new changelog file
11
+ */
12
+ init(featureId, featureName) {
13
+ const content = `# Changelog - ${featureId}: ${featureName}
14
+
15
+ All notable changes to this feature will be documented in this file.
16
+
17
+ `;
18
+ writeFileSync(this.changelogPath, content, 'utf-8');
19
+ }
20
+ /**
21
+ * Add an entry to the changelog
22
+ */
23
+ addEntry(phase, changes) {
24
+ if (!existsSync(this.changelogPath)) {
25
+ throw new Error('Changelog not initialized');
26
+ }
27
+ const date = formatChangelogDate();
28
+ const entry = this.formatEntry({ date, phase, changes });
29
+ const currentContent = readFileSync(this.changelogPath, 'utf-8');
30
+ const lines = currentContent.split('\n');
31
+ let insertIndex = lines.findIndex((line) => line.startsWith('## ') || line.trim() === '');
32
+ if (insertIndex === -1 || (insertIndex < 3 && lines[insertIndex].trim() === '')) {
33
+ while (insertIndex < lines.length && lines[insertIndex].trim() === '') {
34
+ insertIndex++;
35
+ }
36
+ if (insertIndex === lines.length) {
37
+ insertIndex = lines.length;
38
+ }
39
+ }
40
+ const header = lines.slice(0, insertIndex).join('\n');
41
+ const rest = lines.slice(insertIndex).join('\n');
42
+ const newContent = header + '\n' + entry + '\n' + rest;
43
+ writeFileSync(this.changelogPath, newContent.trim() + '\n', 'utf-8');
44
+ }
45
+ /**
46
+ * Format a changelog entry
47
+ */
48
+ formatEntry(entry) {
49
+ const lines = [`## [${entry.date}] - ${entry.phase}`, ''];
50
+ for (const change of entry.changes) {
51
+ lines.push(`- ${change}`);
52
+ }
53
+ lines.push('');
54
+ return lines.join('\n');
55
+ }
56
+ /**
57
+ * Get all entries from changelog
58
+ */
59
+ getEntries() {
60
+ if (!existsSync(this.changelogPath)) {
61
+ return [];
62
+ }
63
+ const content = readFileSync(this.changelogPath, 'utf-8');
64
+ const entries = [];
65
+ const entryPattern = /^## \[(\d{4}-\d{2}-\d{2})\] - (.+)$/gm;
66
+ let match;
67
+ const lines = content.split('\n');
68
+ let currentEntry = null;
69
+ for (const line of lines) {
70
+ const headerMatch = line.match(/^## \[(\d{4}-\d{2}-\d{2})\] - (.+)$/);
71
+ if (headerMatch) {
72
+ if (currentEntry) {
73
+ entries.push(currentEntry);
74
+ }
75
+ currentEntry = {
76
+ date: headerMatch[1],
77
+ phase: headerMatch[2],
78
+ changes: [],
79
+ };
80
+ }
81
+ else if (currentEntry && line.startsWith('- ')) {
82
+ currentEntry.changes.push(line.substring(2));
83
+ }
84
+ }
85
+ if (currentEntry) {
86
+ entries.push(currentEntry);
87
+ }
88
+ return entries;
89
+ }
90
+ /**
91
+ * Check if changelog exists
92
+ */
93
+ exists() {
94
+ return existsSync(this.changelogPath);
95
+ }
96
+ }
97
+ //# sourceMappingURL=changelog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/core/changelog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface SplitResult {
2
+ success: boolean;
3
+ originalFile: string;
4
+ parts: string[];
5
+ message: string;
6
+ }
7
+ export declare class FileSplitter {
8
+ private maxLines;
9
+ constructor(maxLines?: number);
10
+ /**
11
+ * Count lines in a file
12
+ */
13
+ countLines(filePath: string): number;
14
+ /**
15
+ * Estimate token count (approx 4 chars per token)
16
+ */
17
+ estimateTokens(filePath: string): number;
18
+ /**
19
+ * Check if file needs splitting
20
+ */
21
+ needsSplit(filePath: string): boolean;
22
+ /**
23
+ * Split a markdown file into parts
24
+ */
25
+ split(filePath: string): SplitResult;
26
+ /**
27
+ * Merge split files back into one
28
+ */
29
+ merge(dir: string, baseName: string): string;
30
+ /**
31
+ * Generate index file content
32
+ */
33
+ private generateIndexFile;
34
+ /**
35
+ * Write content with automatic splitting if needed
36
+ */
37
+ writeWithAutoSplit(filePath: string, content: string): SplitResult;
38
+ }
39
+ //# sourceMappingURL=file-splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-splitter.d.ts","sourceRoot":"","sources":["../../src/core/file-splitter.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,SAAoC;IAIxD;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IASpC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IASxC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKrC;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IA2DpC;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA6C5C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW;CAcnE"}
@@ -0,0 +1,162 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
2
+ import { join, dirname, basename, extname } from 'node:path';
3
+ import { DEFAULT_CONFIG } from '../types/index.js';
4
+ export class FileSplitter {
5
+ maxLines;
6
+ constructor(maxLines = DEFAULT_CONFIG.autoSplit.maxLines) {
7
+ this.maxLines = maxLines;
8
+ }
9
+ /**
10
+ * Count lines in a file
11
+ */
12
+ countLines(filePath) {
13
+ if (!existsSync(filePath)) {
14
+ return 0;
15
+ }
16
+ const content = readFileSync(filePath, 'utf-8');
17
+ return content.split('\n').length;
18
+ }
19
+ /**
20
+ * Estimate token count (approx 4 chars per token)
21
+ */
22
+ estimateTokens(filePath) {
23
+ if (!existsSync(filePath)) {
24
+ return 0;
25
+ }
26
+ const content = readFileSync(filePath, 'utf-8');
27
+ return Math.ceil(content.length / 4);
28
+ }
29
+ /**
30
+ * Check if file needs splitting
31
+ */
32
+ needsSplit(filePath) {
33
+ const lines = this.countLines(filePath);
34
+ return lines > this.maxLines;
35
+ }
36
+ /**
37
+ * Split a markdown file into parts
38
+ */
39
+ split(filePath) {
40
+ if (!existsSync(filePath)) {
41
+ return {
42
+ success: false,
43
+ originalFile: filePath,
44
+ parts: [],
45
+ message: `File not found: ${filePath}`,
46
+ };
47
+ }
48
+ const lines = this.countLines(filePath);
49
+ if (lines <= this.maxLines) {
50
+ return {
51
+ success: true,
52
+ originalFile: filePath,
53
+ parts: [filePath],
54
+ message: `File does not need splitting (${lines} lines)`,
55
+ };
56
+ }
57
+ const content = readFileSync(filePath, 'utf-8');
58
+ const allLines = content.split('\n');
59
+ const dir = dirname(filePath);
60
+ const baseName = basename(filePath, extname(filePath));
61
+ const ext = extname(filePath);
62
+ const parts = [];
63
+ let partIndex = 0;
64
+ let currentLine = 0;
65
+ while (currentLine < allLines.length) {
66
+ const endLine = Math.min(currentLine + this.maxLines, allLines.length);
67
+ const chunk = allLines.slice(currentLine, endLine);
68
+ const partFileName = `${baseName}_${partIndex}${ext}`;
69
+ const partPath = join(dir, partFileName);
70
+ writeFileSync(partPath, chunk.join('\n'), 'utf-8');
71
+ parts.push(partPath);
72
+ currentLine = endLine;
73
+ partIndex++;
74
+ }
75
+ unlinkSync(filePath);
76
+ const indexPath = join(dir, `${baseName}-index${ext}`);
77
+ const indexContent = this.generateIndexFile(baseName, parts);
78
+ writeFileSync(indexPath, indexContent, 'utf-8');
79
+ parts.unshift(indexPath);
80
+ return {
81
+ success: true,
82
+ originalFile: filePath,
83
+ parts,
84
+ message: `Split into ${partIndex} parts`,
85
+ };
86
+ }
87
+ /**
88
+ * Merge split files back into one
89
+ */
90
+ merge(dir, baseName) {
91
+ const ext = '.md';
92
+ const pattern = new RegExp(`^${baseName}_(\\d+)${ext}$`);
93
+ const { readdirSync } = require('node:fs');
94
+ const files = readdirSync(dir);
95
+ const parts = files
96
+ .filter((f) => pattern.test(f))
97
+ .sort((a, b) => {
98
+ const numA = parseInt(a.match(pattern)[1]);
99
+ const numB = parseInt(b.match(pattern)[1]);
100
+ return numA - numB;
101
+ })
102
+ .map((f) => join(dir, f));
103
+ if (parts.length === 0) {
104
+ const singleFile = join(dir, `${baseName}${ext}`);
105
+ if (existsSync(singleFile)) {
106
+ return singleFile;
107
+ }
108
+ throw new Error(`No files found to merge for ${baseName}`);
109
+ }
110
+ const mergedContent = [];
111
+ for (const part of parts) {
112
+ const content = readFileSync(part, 'utf-8');
113
+ mergedContent.push(content);
114
+ }
115
+ const outputPath = join(dir, `${baseName}${ext}`);
116
+ writeFileSync(outputPath, mergedContent.join('\n'), 'utf-8');
117
+ for (const part of parts) {
118
+ unlinkSync(part);
119
+ }
120
+ const indexPath = join(dir, `${baseName}-index${ext}`);
121
+ if (existsSync(indexPath)) {
122
+ unlinkSync(indexPath);
123
+ }
124
+ return outputPath;
125
+ }
126
+ /**
127
+ * Generate index file content
128
+ */
129
+ generateIndexFile(baseName, parts) {
130
+ const lines = [
131
+ `# ${baseName} (Split Index)`,
132
+ '',
133
+ 'This file was automatically split due to size limits.',
134
+ '',
135
+ '## Parts',
136
+ '',
137
+ ];
138
+ for (let i = 0; i < parts.length; i++) {
139
+ const partName = basename(parts[i]);
140
+ if (!partName.includes('-index')) {
141
+ lines.push(`- [Part ${i + 1}](./${partName})`);
142
+ }
143
+ }
144
+ return lines.join('\n');
145
+ }
146
+ /**
147
+ * Write content with automatic splitting if needed
148
+ */
149
+ writeWithAutoSplit(filePath, content) {
150
+ writeFileSync(filePath, content, 'utf-8');
151
+ if (this.needsSplit(filePath)) {
152
+ return this.split(filePath);
153
+ }
154
+ return {
155
+ success: true,
156
+ originalFile: filePath,
157
+ parts: [filePath],
158
+ message: 'File written successfully',
159
+ };
160
+ }
161
+ }
162
+ //# sourceMappingURL=file-splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-splitter.js","sourceRoot":"","sources":["../../src/core/file-splitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { type FeatureMeta, type MigrationInfo, type MigrationStatus } from '../types/index.js';
2
+ export declare class MigrationManager {
3
+ private featureDir;
4
+ private metaPath;
5
+ private meta;
6
+ constructor(featureDir: string);
7
+ /**
8
+ * Initialize a new feature (no migrations yet)
9
+ */
10
+ initFeature(featureId: string, featureName: string, branch: string): FeatureMeta;
11
+ /**
12
+ * Load existing feature metadata
13
+ */
14
+ loadMeta(): FeatureMeta | null;
15
+ /**
16
+ * Save metadata to file
17
+ */
18
+ saveMeta(): void;
19
+ /**
20
+ * Create a new migration
21
+ */
22
+ createMigration(): MigrationInfo;
23
+ /**
24
+ * Get current migration
25
+ */
26
+ getCurrentMigration(): MigrationInfo | null;
27
+ /**
28
+ * Get migration by ID
29
+ */
30
+ getMigration(id: string): MigrationInfo | null;
31
+ /**
32
+ * Get all migrations in order
33
+ */
34
+ getAllMigrations(): MigrationInfo[];
35
+ /**
36
+ * Get migration directory path
37
+ */
38
+ getMigrationDir(migrationId: string): string | null;
39
+ /**
40
+ * Update migration status
41
+ */
42
+ updateMigrationStatus(id: string, status: MigrationStatus): void;
43
+ /**
44
+ * Update migration task counts
45
+ */
46
+ updateMigrationTasks(id: string, total: number, completed: number): void;
47
+ /**
48
+ * Record a commit
49
+ */
50
+ recordCommit(migrationId: string, hash: string, message: string): void;
51
+ /**
52
+ * Get pending migrations (not completed)
53
+ */
54
+ getPendingMigrations(): MigrationInfo[];
55
+ /**
56
+ * Get migrations up to a specific ID
57
+ */
58
+ getMigrationsUpTo(id: string): MigrationInfo[];
59
+ /**
60
+ * Get feature status summary
61
+ */
62
+ getStatus(): {
63
+ featureId: string;
64
+ featureName: string;
65
+ currentMigration: string | null;
66
+ totalMigrations: number;
67
+ completedMigrations: number;
68
+ pendingTasks: number;
69
+ completedTasks: number;
70
+ };
71
+ /**
72
+ * Scan feature directory for migration folders
73
+ */
74
+ scanMigrationFolders(): string[];
75
+ }
76
+ //# sourceMappingURL=migration-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-manager.d.ts","sourceRoot":"","sources":["../../src/core/migration-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAC;AAG3B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAA4B;gBAE5B,UAAU,EAAE,MAAM;IAK9B;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW;IAmBhF;;OAEG;IACH,QAAQ,IAAI,WAAW,GAAG,IAAI;IAU9B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAYhB;;OAEG;IACH,eAAe,IAAI,aAAa;IAgChC;;OAEG;IACH,mBAAmB,IAAI,aAAa,GAAG,IAAI;IAY3C;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAQ9C;;OAEG;IACH,gBAAgB,IAAI,aAAa,EAAE;IAYnC;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnD;;OAEG;IACH,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAkBhE;;OAEG;IACH,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBxE;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAetE;;OAEG;IACH,oBAAoB,IAAI,aAAa,EAAE;IAIvC;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE;IAI9C;;OAEG;IACH,SAAS,IAAI;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;KACxB;IA+BD;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;CAUjC"}