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,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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnD,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IAEzB,YAAY,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ;QACtD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,QAAQ;gBACtB,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,mBAAmB,QAAQ,EAAE;aACvC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,QAAQ;gBACtB,KAAK,EAAE,CAAC,QAAQ,CAAC;gBACjB,OAAO,EAAE,iCAAiC,KAAK,SAAS;aACzD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,OAAO,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEnD,MAAM,YAAY,GAAG,GAAG,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEzC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErB,WAAW,GAAG,OAAO,CAAC;YACtB,SAAS,EAAE,CAAC;QACd,CAAC;QAED,UAAU,CAAC,QAAQ,CAAC,CAAC;QAErB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,SAAS,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7D,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,QAAQ;YACtB,KAAK;YACL,OAAO,EAAE,cAAc,SAAS,QAAQ;SACzC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAW,EAAE,QAAgB;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,UAAU,GAAG,GAAG,CAAC,CAAC;QAEzD,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAa,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAG,KAAK;aAChB,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtC,IAAI,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;YAClD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,SAAS,GAAG,EAAE,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAgB,EAAE,KAAe;QACzD,MAAM,KAAK,GAAG;YACZ,KAAK,QAAQ,gBAAgB;YAC7B,EAAE;YACF,uDAAuD;YACvD,EAAE;YACF,UAAU;YACV,EAAE;SACH,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAgB,EAAE,OAAe;QAClD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,QAAQ;YACtB,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,OAAO,EAAE,2BAA2B;SACrC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -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"}
|