@t1mmen/srtd 0.0.0-next-20251227000343
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/LICENSE +21 -0
- package/README.md +363 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/apply.d.ts +2 -0
- package/dist/commands/apply.js +105 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/build.d.ts +2 -0
- package/dist/commands/build.js +134 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/clear.d.ts +2 -0
- package/dist/commands/clear.js +161 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +91 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/menu.d.ts +4 -0
- package/dist/commands/menu.js +76 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/promote.d.ts +2 -0
- package/dist/commands/promote.js +181 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/register.d.ts +2 -0
- package/dist/commands/register.js +192 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/watch.d.ts +14 -0
- package/dist/commands/watch.js +190 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/services/DatabaseService.d.ts +113 -0
- package/dist/services/DatabaseService.js +343 -0
- package/dist/services/DatabaseService.js.map +1 -0
- package/dist/services/FileSystemService.d.ts +100 -0
- package/dist/services/FileSystemService.js +237 -0
- package/dist/services/FileSystemService.js.map +1 -0
- package/dist/services/MigrationBuilder.d.ts +106 -0
- package/dist/services/MigrationBuilder.js +193 -0
- package/dist/services/MigrationBuilder.js.map +1 -0
- package/dist/services/Orchestrator.d.ts +155 -0
- package/dist/services/Orchestrator.js +622 -0
- package/dist/services/Orchestrator.js.map +1 -0
- package/dist/services/StateService.d.ts +169 -0
- package/dist/services/StateService.js +463 -0
- package/dist/services/StateService.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/badge.d.ts +14 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/branding.d.ts +9 -0
- package/dist/ui/branding.js +35 -0
- package/dist/ui/branding.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/results.d.ts +10 -0
- package/dist/ui/results.js +62 -0
- package/dist/ui/results.js.map +1 -0
- package/dist/ui/spinner.d.ts +5 -0
- package/dist/ui/spinner.js +8 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/utils/config.d.ts +12 -0
- package/dist/utils/config.js +67 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/createEmptyBuildLog.d.ts +1 -0
- package/dist/utils/createEmptyBuildLog.js +10 -0
- package/dist/utils/createEmptyBuildLog.js.map +1 -0
- package/dist/utils/ensureDirectories.d.ts +4 -0
- package/dist/utils/ensureDirectories.js +23 -0
- package/dist/utils/ensureDirectories.js.map +1 -0
- package/dist/utils/fileExists.d.ts +1 -0
- package/dist/utils/fileExists.js +11 -0
- package/dist/utils/fileExists.js.map +1 -0
- package/dist/utils/findProjectRoot.d.ts +1 -0
- package/dist/utils/findProjectRoot.js +25 -0
- package/dist/utils/findProjectRoot.js.map +1 -0
- package/dist/utils/getErrorMessage.d.ts +9 -0
- package/dist/utils/getErrorMessage.js +14 -0
- package/dist/utils/getErrorMessage.js.map +1 -0
- package/dist/utils/getNextTimestamp.d.ts +2 -0
- package/dist/utils/getNextTimestamp.js +12 -0
- package/dist/utils/getNextTimestamp.js.map +1 -0
- package/dist/utils/isWipTemplate.d.ts +1 -0
- package/dist/utils/isWipTemplate.js +6 -0
- package/dist/utils/isWipTemplate.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/safeCreate.d.ts +1 -0
- package/dist/utils/safeCreate.js +16 -0
- package/dist/utils/safeCreate.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateService - Centralized state management for template status
|
|
3
|
+
* Single source of truth for all template states and transitions
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import type { BuildLog, TemplateBuildState } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Template states in the state machine
|
|
9
|
+
*/
|
|
10
|
+
export declare enum TemplateState {
|
|
11
|
+
UNSEEN = "unseen",
|
|
12
|
+
SYNCED = "synced",
|
|
13
|
+
CHANGED = "changed",
|
|
14
|
+
APPLIED = "applied",
|
|
15
|
+
BUILT = "built",
|
|
16
|
+
ERROR = "error"
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Template state information
|
|
20
|
+
*/
|
|
21
|
+
export interface TemplateStateInfo {
|
|
22
|
+
state: TemplateState;
|
|
23
|
+
templatePath: string;
|
|
24
|
+
currentHash?: string;
|
|
25
|
+
lastAppliedHash?: string;
|
|
26
|
+
lastBuiltHash?: string;
|
|
27
|
+
lastAppliedDate?: string;
|
|
28
|
+
lastBuiltDate?: string;
|
|
29
|
+
lastError?: string;
|
|
30
|
+
metadata?: TemplateBuildState;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* State transition event
|
|
34
|
+
*/
|
|
35
|
+
export interface StateTransitionEvent {
|
|
36
|
+
templatePath: string;
|
|
37
|
+
fromState: TemplateState;
|
|
38
|
+
toState: TemplateState;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Configuration for StateService
|
|
43
|
+
*/
|
|
44
|
+
export interface StateServiceConfig {
|
|
45
|
+
baseDir: string;
|
|
46
|
+
buildLogPath?: string;
|
|
47
|
+
localBuildLogPath?: string;
|
|
48
|
+
autoSave?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare class StateService extends EventEmitter {
|
|
51
|
+
private config;
|
|
52
|
+
private templateStates;
|
|
53
|
+
private buildLog;
|
|
54
|
+
private localBuildLog;
|
|
55
|
+
private saveTimer;
|
|
56
|
+
constructor(config: StateServiceConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Initialize the service by loading existing build logs
|
|
59
|
+
*/
|
|
60
|
+
initialize(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Create an empty build log
|
|
63
|
+
*/
|
|
64
|
+
private createEmptyBuildLog;
|
|
65
|
+
/**
|
|
66
|
+
* Load build logs from disk
|
|
67
|
+
*/
|
|
68
|
+
private loadBuildLogs;
|
|
69
|
+
/**
|
|
70
|
+
* Save build logs to disk
|
|
71
|
+
*/
|
|
72
|
+
saveBuildLogs(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Schedule auto-save if enabled
|
|
75
|
+
*/
|
|
76
|
+
private scheduleAutoSave;
|
|
77
|
+
/**
|
|
78
|
+
* Sync build log states to in-memory map
|
|
79
|
+
*/
|
|
80
|
+
private syncStatesToMemory;
|
|
81
|
+
/**
|
|
82
|
+
* Determine template state from metadata
|
|
83
|
+
*/
|
|
84
|
+
private determineStateFromMetadata;
|
|
85
|
+
/**
|
|
86
|
+
* Validate if a state transition is allowed
|
|
87
|
+
*/
|
|
88
|
+
private validateTransition;
|
|
89
|
+
/**
|
|
90
|
+
* Perform a state transition
|
|
91
|
+
*/
|
|
92
|
+
private transitionState;
|
|
93
|
+
/**
|
|
94
|
+
* Get the current state of a template
|
|
95
|
+
*/
|
|
96
|
+
getTemplateStatus(templatePath: string): TemplateStateInfo | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Get all template statuses
|
|
99
|
+
*/
|
|
100
|
+
getAllTemplateStatuses(): Map<string, TemplateStateInfo>;
|
|
101
|
+
/**
|
|
102
|
+
* Check if template has changed based on hash comparison
|
|
103
|
+
*/
|
|
104
|
+
hasTemplateChanged(templatePath: string, currentHash: string): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Mark template as unseen (new template)
|
|
107
|
+
*/
|
|
108
|
+
markAsUnseen(templatePath: string, currentHash?: string): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Mark template as synced
|
|
111
|
+
*/
|
|
112
|
+
markAsSynced(templatePath: string, currentHash: string): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Mark template as changed
|
|
115
|
+
*/
|
|
116
|
+
markAsChanged(templatePath: string, currentHash: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Mark template as applied
|
|
119
|
+
*/
|
|
120
|
+
markAsApplied(templatePath: string, hash: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Mark template as built
|
|
123
|
+
*/
|
|
124
|
+
markAsBuilt(templatePath: string, hash: string, migrationFile?: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Mark template as having an error
|
|
127
|
+
*/
|
|
128
|
+
markAsError(templatePath: string, error: string, type?: 'apply' | 'build'): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Clear all states (reset)
|
|
131
|
+
*/
|
|
132
|
+
clearAllStates(): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Clear build logs selectively
|
|
135
|
+
* @param type - 'local' clears local only, 'shared' clears shared only, 'both' clears all
|
|
136
|
+
*/
|
|
137
|
+
clearBuildLogs(type: 'local' | 'shared' | 'both'): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Update template timestamp
|
|
140
|
+
*/
|
|
141
|
+
updateTimestamp(timestamp: string): void;
|
|
142
|
+
/**
|
|
143
|
+
* Get the last timestamp for generating migration filenames
|
|
144
|
+
*/
|
|
145
|
+
getLastTimestamp(): string;
|
|
146
|
+
/**
|
|
147
|
+
* Get combined build state for a template (merges common and local logs)
|
|
148
|
+
* @see Orchestrator.getTemplateStatus - primary consumer
|
|
149
|
+
*/
|
|
150
|
+
getTemplateBuildState(templatePath: string): TemplateBuildState | undefined;
|
|
151
|
+
/**
|
|
152
|
+
* Get build log reference for MigrationBuilder (read-only access)
|
|
153
|
+
* @see MigrationBuilder.generateAndWriteBundledMigration
|
|
154
|
+
*/
|
|
155
|
+
getBuildLogForMigration(): Readonly<BuildLog>;
|
|
156
|
+
/**
|
|
157
|
+
* Rename template entry in build logs (used when promoting WIP templates)
|
|
158
|
+
* Moves the build state from old path to new path in both common and local logs
|
|
159
|
+
*/
|
|
160
|
+
renameTemplate(oldPath: string, newPath: string): Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* Convert template path to relative path for build log keys
|
|
163
|
+
*/
|
|
164
|
+
private toRelativePath;
|
|
165
|
+
/**
|
|
166
|
+
* Dispose of the service
|
|
167
|
+
*/
|
|
168
|
+
dispose(): Promise<void>;
|
|
169
|
+
}
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateService - Centralized state management for template status
|
|
3
|
+
* Single source of truth for all template states and transitions
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Template states in the state machine
|
|
10
|
+
*/
|
|
11
|
+
export var TemplateState;
|
|
12
|
+
(function (TemplateState) {
|
|
13
|
+
TemplateState["UNSEEN"] = "unseen";
|
|
14
|
+
TemplateState["SYNCED"] = "synced";
|
|
15
|
+
TemplateState["CHANGED"] = "changed";
|
|
16
|
+
TemplateState["APPLIED"] = "applied";
|
|
17
|
+
TemplateState["BUILT"] = "built";
|
|
18
|
+
TemplateState["ERROR"] = "error";
|
|
19
|
+
})(TemplateState || (TemplateState = {}));
|
|
20
|
+
/**
|
|
21
|
+
* Valid state transitions matrix
|
|
22
|
+
*/
|
|
23
|
+
const VALID_TRANSITIONS = {
|
|
24
|
+
[TemplateState.UNSEEN]: [
|
|
25
|
+
TemplateState.UNSEEN, // Allow self-transition for updates
|
|
26
|
+
TemplateState.SYNCED,
|
|
27
|
+
TemplateState.CHANGED,
|
|
28
|
+
TemplateState.APPLIED, // Allow direct apply for new templates
|
|
29
|
+
TemplateState.BUILT, // Allow direct build for new templates
|
|
30
|
+
TemplateState.ERROR,
|
|
31
|
+
],
|
|
32
|
+
[TemplateState.SYNCED]: [
|
|
33
|
+
TemplateState.SYNCED, // Allow self-transition for updates
|
|
34
|
+
TemplateState.CHANGED,
|
|
35
|
+
TemplateState.APPLIED,
|
|
36
|
+
TemplateState.BUILT,
|
|
37
|
+
TemplateState.ERROR,
|
|
38
|
+
],
|
|
39
|
+
[TemplateState.CHANGED]: [
|
|
40
|
+
TemplateState.CHANGED, // Allow self-transition for updates
|
|
41
|
+
TemplateState.SYNCED,
|
|
42
|
+
TemplateState.APPLIED,
|
|
43
|
+
TemplateState.BUILT,
|
|
44
|
+
TemplateState.ERROR,
|
|
45
|
+
],
|
|
46
|
+
[TemplateState.APPLIED]: [
|
|
47
|
+
TemplateState.APPLIED, // Allow self-transition for force apply
|
|
48
|
+
TemplateState.SYNCED,
|
|
49
|
+
TemplateState.CHANGED,
|
|
50
|
+
TemplateState.BUILT,
|
|
51
|
+
TemplateState.ERROR,
|
|
52
|
+
],
|
|
53
|
+
[TemplateState.BUILT]: [
|
|
54
|
+
TemplateState.BUILT, // Allow self-transition for force rebuild
|
|
55
|
+
TemplateState.SYNCED,
|
|
56
|
+
TemplateState.CHANGED,
|
|
57
|
+
TemplateState.APPLIED,
|
|
58
|
+
TemplateState.ERROR,
|
|
59
|
+
],
|
|
60
|
+
[TemplateState.ERROR]: [
|
|
61
|
+
TemplateState.ERROR, // Allow self-transition for updating error details
|
|
62
|
+
TemplateState.UNSEEN,
|
|
63
|
+
TemplateState.SYNCED,
|
|
64
|
+
TemplateState.CHANGED,
|
|
65
|
+
TemplateState.APPLIED,
|
|
66
|
+
TemplateState.BUILT,
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
export class StateService extends EventEmitter {
|
|
70
|
+
config;
|
|
71
|
+
templateStates = new Map();
|
|
72
|
+
buildLog;
|
|
73
|
+
localBuildLog;
|
|
74
|
+
saveTimer = null;
|
|
75
|
+
constructor(config) {
|
|
76
|
+
super();
|
|
77
|
+
this.config = config;
|
|
78
|
+
this.buildLog = this.createEmptyBuildLog();
|
|
79
|
+
this.localBuildLog = this.createEmptyBuildLog();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Initialize the service by loading existing build logs
|
|
83
|
+
*/
|
|
84
|
+
async initialize() {
|
|
85
|
+
await this.loadBuildLogs();
|
|
86
|
+
this.syncStatesToMemory();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create an empty build log
|
|
90
|
+
*/
|
|
91
|
+
createEmptyBuildLog() {
|
|
92
|
+
return {
|
|
93
|
+
version: '1.0',
|
|
94
|
+
lastTimestamp: '',
|
|
95
|
+
templates: {},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Load build logs from disk
|
|
100
|
+
*/
|
|
101
|
+
async loadBuildLogs() {
|
|
102
|
+
const buildLogPath = this.config.buildLogPath || path.join(this.config.baseDir, '.buildlog.json');
|
|
103
|
+
const localBuildLogPath = this.config.localBuildLogPath || path.join(this.config.baseDir, '.buildlog.local.json');
|
|
104
|
+
// Load remote build log
|
|
105
|
+
try {
|
|
106
|
+
const content = await fs.readFile(buildLogPath, 'utf-8');
|
|
107
|
+
this.buildLog = JSON.parse(content);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error.code !== 'ENOENT') {
|
|
111
|
+
this.emit('error', new Error(`Failed to load build log: ${error}`));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Load local build log
|
|
115
|
+
try {
|
|
116
|
+
const content = await fs.readFile(localBuildLogPath, 'utf-8');
|
|
117
|
+
this.localBuildLog = JSON.parse(content);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error.code !== 'ENOENT') {
|
|
121
|
+
this.emit('error', new Error(`Failed to load local build log: ${error}`));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Save build logs to disk
|
|
127
|
+
*/
|
|
128
|
+
async saveBuildLogs() {
|
|
129
|
+
const buildLogPath = this.config.buildLogPath || path.join(this.config.baseDir, '.buildlog.json');
|
|
130
|
+
const localBuildLogPath = this.config.localBuildLogPath || path.join(this.config.baseDir, '.buildlog.local.json');
|
|
131
|
+
try {
|
|
132
|
+
await fs.writeFile(buildLogPath, JSON.stringify(this.buildLog, null, 2), 'utf-8');
|
|
133
|
+
await fs.writeFile(localBuildLogPath, JSON.stringify(this.localBuildLog, null, 2), 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
this.emit('error', new Error(`Failed to save build logs: ${error}`));
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Schedule auto-save if enabled
|
|
142
|
+
*/
|
|
143
|
+
scheduleAutoSave() {
|
|
144
|
+
if (!this.config.autoSave)
|
|
145
|
+
return;
|
|
146
|
+
if (this.saveTimer) {
|
|
147
|
+
clearTimeout(this.saveTimer);
|
|
148
|
+
}
|
|
149
|
+
this.saveTimer = setTimeout(() => {
|
|
150
|
+
void this.saveBuildLogs();
|
|
151
|
+
}, 1000); // Save after 1 second of inactivity
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Sync build log states to in-memory map
|
|
155
|
+
*/
|
|
156
|
+
syncStatesToMemory() {
|
|
157
|
+
// Merge templates from both build logs
|
|
158
|
+
const allTemplates = new Set([
|
|
159
|
+
...Object.keys(this.buildLog.templates),
|
|
160
|
+
...Object.keys(this.localBuildLog.templates),
|
|
161
|
+
]);
|
|
162
|
+
for (const templatePath of allTemplates) {
|
|
163
|
+
const remoteMeta = this.buildLog.templates[templatePath];
|
|
164
|
+
const localMeta = this.localBuildLog.templates[templatePath];
|
|
165
|
+
// Merge metadata with local taking precedence
|
|
166
|
+
const metadata = { ...remoteMeta, ...localMeta };
|
|
167
|
+
// Determine state based on metadata
|
|
168
|
+
const state = this.determineStateFromMetadata(metadata);
|
|
169
|
+
// Convert relative path to absolute path for storage key
|
|
170
|
+
const absolutePath = path.resolve(this.config.baseDir, templatePath);
|
|
171
|
+
this.templateStates.set(absolutePath, {
|
|
172
|
+
state,
|
|
173
|
+
templatePath: absolutePath,
|
|
174
|
+
lastAppliedHash: metadata.lastAppliedHash,
|
|
175
|
+
lastBuiltHash: metadata.lastBuildHash,
|
|
176
|
+
lastAppliedDate: metadata.lastAppliedDate,
|
|
177
|
+
lastBuiltDate: metadata.lastBuildDate,
|
|
178
|
+
lastError: metadata.lastAppliedError || metadata.lastBuildError,
|
|
179
|
+
metadata,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Determine template state from metadata
|
|
185
|
+
*/
|
|
186
|
+
determineStateFromMetadata(metadata) {
|
|
187
|
+
if (metadata.lastAppliedError || metadata.lastBuildError) {
|
|
188
|
+
return TemplateState.ERROR;
|
|
189
|
+
}
|
|
190
|
+
if (metadata.lastBuildHash) {
|
|
191
|
+
return TemplateState.BUILT;
|
|
192
|
+
}
|
|
193
|
+
if (metadata.lastAppliedHash) {
|
|
194
|
+
return TemplateState.APPLIED;
|
|
195
|
+
}
|
|
196
|
+
return TemplateState.UNSEEN;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate if a state transition is allowed
|
|
200
|
+
*/
|
|
201
|
+
validateTransition(fromState, toState) {
|
|
202
|
+
const allowedTransitions = VALID_TRANSITIONS[fromState];
|
|
203
|
+
return allowedTransitions.includes(toState);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Perform a state transition
|
|
207
|
+
*/
|
|
208
|
+
async transitionState(templatePath, toState, updates) {
|
|
209
|
+
const currentInfo = this.templateStates.get(templatePath) || {
|
|
210
|
+
state: TemplateState.UNSEEN,
|
|
211
|
+
templatePath,
|
|
212
|
+
};
|
|
213
|
+
if (!this.validateTransition(currentInfo.state, toState)) {
|
|
214
|
+
throw new Error(`Invalid state transition for ${templatePath}: ${currentInfo.state} -> ${toState}`);
|
|
215
|
+
}
|
|
216
|
+
const fromState = currentInfo.state;
|
|
217
|
+
// Update in-memory state
|
|
218
|
+
const newInfo = {
|
|
219
|
+
...currentInfo,
|
|
220
|
+
...updates,
|
|
221
|
+
state: toState,
|
|
222
|
+
templatePath,
|
|
223
|
+
};
|
|
224
|
+
this.templateStates.set(templatePath, newInfo);
|
|
225
|
+
// Update build logs
|
|
226
|
+
const relPath = path.relative(this.config.baseDir, templatePath);
|
|
227
|
+
if (toState === TemplateState.APPLIED || updates?.lastAppliedHash) {
|
|
228
|
+
if (!this.localBuildLog.templates[relPath]) {
|
|
229
|
+
this.localBuildLog.templates[relPath] = {};
|
|
230
|
+
}
|
|
231
|
+
this.localBuildLog.templates[relPath] = {
|
|
232
|
+
...this.localBuildLog.templates[relPath],
|
|
233
|
+
lastAppliedHash: updates?.lastAppliedHash || newInfo.lastAppliedHash,
|
|
234
|
+
lastAppliedDate: updates?.lastAppliedDate || new Date().toISOString(),
|
|
235
|
+
lastAppliedError: updates?.lastError,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (toState === TemplateState.BUILT || updates?.lastBuiltHash) {
|
|
239
|
+
if (!this.buildLog.templates[relPath]) {
|
|
240
|
+
this.buildLog.templates[relPath] = {};
|
|
241
|
+
}
|
|
242
|
+
this.buildLog.templates[relPath] = {
|
|
243
|
+
...this.buildLog.templates[relPath],
|
|
244
|
+
lastBuildHash: updates?.lastBuiltHash || newInfo.lastBuiltHash,
|
|
245
|
+
lastBuildDate: updates?.lastBuiltDate || new Date().toISOString(),
|
|
246
|
+
lastBuildError: updates?.lastError,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Emit transition event
|
|
250
|
+
const event = {
|
|
251
|
+
templatePath,
|
|
252
|
+
fromState,
|
|
253
|
+
toState,
|
|
254
|
+
timestamp: new Date().toISOString(),
|
|
255
|
+
};
|
|
256
|
+
this.emit('state:transition', event);
|
|
257
|
+
this.scheduleAutoSave();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get the current state of a template
|
|
261
|
+
*/
|
|
262
|
+
getTemplateStatus(templatePath) {
|
|
263
|
+
return this.templateStates.get(templatePath);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get all template statuses
|
|
267
|
+
*/
|
|
268
|
+
getAllTemplateStatuses() {
|
|
269
|
+
return new Map(this.templateStates);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Check if template has changed based on hash comparison
|
|
273
|
+
*/
|
|
274
|
+
hasTemplateChanged(templatePath, currentHash) {
|
|
275
|
+
const info = this.templateStates.get(templatePath);
|
|
276
|
+
if (!info)
|
|
277
|
+
return true;
|
|
278
|
+
return currentHash !== info.lastAppliedHash && currentHash !== info.lastBuiltHash;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Mark template as unseen (new template)
|
|
282
|
+
*/
|
|
283
|
+
async markAsUnseen(templatePath, currentHash) {
|
|
284
|
+
await this.transitionState(templatePath, TemplateState.UNSEEN, {
|
|
285
|
+
currentHash,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Mark template as synced
|
|
290
|
+
*/
|
|
291
|
+
async markAsSynced(templatePath, currentHash) {
|
|
292
|
+
await this.transitionState(templatePath, TemplateState.SYNCED, {
|
|
293
|
+
currentHash,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Mark template as changed
|
|
298
|
+
*/
|
|
299
|
+
async markAsChanged(templatePath, currentHash) {
|
|
300
|
+
await this.transitionState(templatePath, TemplateState.CHANGED, {
|
|
301
|
+
currentHash,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Mark template as applied
|
|
306
|
+
*/
|
|
307
|
+
async markAsApplied(templatePath, hash) {
|
|
308
|
+
await this.transitionState(templatePath, TemplateState.APPLIED, {
|
|
309
|
+
lastAppliedHash: hash,
|
|
310
|
+
lastAppliedDate: new Date().toISOString(),
|
|
311
|
+
currentHash: hash,
|
|
312
|
+
lastError: undefined, // Clear any previous errors on successful apply
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Mark template as built
|
|
317
|
+
*/
|
|
318
|
+
async markAsBuilt(templatePath, hash, migrationFile) {
|
|
319
|
+
const relPath = path.relative(this.config.baseDir, templatePath);
|
|
320
|
+
await this.transitionState(templatePath, TemplateState.BUILT, {
|
|
321
|
+
lastBuiltHash: hash,
|
|
322
|
+
lastBuiltDate: new Date().toISOString(),
|
|
323
|
+
currentHash: hash,
|
|
324
|
+
lastError: undefined, // Clear any previous errors on successful build
|
|
325
|
+
});
|
|
326
|
+
// Update migration file reference
|
|
327
|
+
if (migrationFile) {
|
|
328
|
+
this.buildLog.templates[relPath] = {
|
|
329
|
+
...this.buildLog.templates[relPath],
|
|
330
|
+
lastMigrationFile: migrationFile,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Mark template as having an error
|
|
336
|
+
*/
|
|
337
|
+
async markAsError(templatePath, error, type = 'apply') {
|
|
338
|
+
const updates = {
|
|
339
|
+
lastError: error,
|
|
340
|
+
};
|
|
341
|
+
const relPath = path.relative(this.config.baseDir, templatePath);
|
|
342
|
+
if (type === 'apply') {
|
|
343
|
+
this.localBuildLog.templates[relPath] = {
|
|
344
|
+
...this.localBuildLog.templates[relPath],
|
|
345
|
+
lastAppliedError: error,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
this.buildLog.templates[relPath] = {
|
|
350
|
+
...this.buildLog.templates[relPath],
|
|
351
|
+
lastBuildError: error,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
await this.transitionState(templatePath, TemplateState.ERROR, updates);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Clear all states (reset)
|
|
358
|
+
*/
|
|
359
|
+
async clearAllStates() {
|
|
360
|
+
this.templateStates.clear();
|
|
361
|
+
this.buildLog = this.createEmptyBuildLog();
|
|
362
|
+
this.localBuildLog = this.createEmptyBuildLog();
|
|
363
|
+
await this.saveBuildLogs();
|
|
364
|
+
this.emit('state:cleared');
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Clear build logs selectively
|
|
368
|
+
* @param type - 'local' clears local only, 'shared' clears shared only, 'both' clears all
|
|
369
|
+
*/
|
|
370
|
+
async clearBuildLogs(type) {
|
|
371
|
+
if (type === 'local' || type === 'both') {
|
|
372
|
+
this.localBuildLog = this.createEmptyBuildLog();
|
|
373
|
+
}
|
|
374
|
+
if (type === 'shared' || type === 'both') {
|
|
375
|
+
this.buildLog = this.createEmptyBuildLog();
|
|
376
|
+
}
|
|
377
|
+
// Clear in-memory state when clearing both
|
|
378
|
+
if (type === 'both') {
|
|
379
|
+
this.templateStates.clear();
|
|
380
|
+
}
|
|
381
|
+
await this.saveBuildLogs();
|
|
382
|
+
this.emit('state:cleared');
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Update template timestamp
|
|
386
|
+
*/
|
|
387
|
+
updateTimestamp(timestamp) {
|
|
388
|
+
this.buildLog.lastTimestamp = timestamp;
|
|
389
|
+
this.localBuildLog.lastTimestamp = timestamp;
|
|
390
|
+
this.scheduleAutoSave();
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Get the last timestamp for generating migration filenames
|
|
394
|
+
*/
|
|
395
|
+
getLastTimestamp() {
|
|
396
|
+
return this.buildLog.lastTimestamp;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get combined build state for a template (merges common and local logs)
|
|
400
|
+
* @see Orchestrator.getTemplateStatus - primary consumer
|
|
401
|
+
*/
|
|
402
|
+
getTemplateBuildState(templatePath) {
|
|
403
|
+
const relPath = this.toRelativePath(templatePath);
|
|
404
|
+
const common = this.buildLog.templates[relPath];
|
|
405
|
+
const local = this.localBuildLog.templates[relPath];
|
|
406
|
+
if (!common && !local)
|
|
407
|
+
return undefined;
|
|
408
|
+
return { ...common, ...local };
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get build log reference for MigrationBuilder (read-only access)
|
|
412
|
+
* @see MigrationBuilder.generateAndWriteBundledMigration
|
|
413
|
+
*/
|
|
414
|
+
getBuildLogForMigration() {
|
|
415
|
+
return this.buildLog;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Rename template entry in build logs (used when promoting WIP templates)
|
|
419
|
+
* Moves the build state from old path to new path in both common and local logs
|
|
420
|
+
*/
|
|
421
|
+
async renameTemplate(oldPath, newPath) {
|
|
422
|
+
const oldRelPath = this.toRelativePath(oldPath);
|
|
423
|
+
const newRelPath = this.toRelativePath(newPath);
|
|
424
|
+
// Move entry in common build log
|
|
425
|
+
if (this.buildLog.templates[oldRelPath]) {
|
|
426
|
+
this.buildLog.templates[newRelPath] = this.buildLog.templates[oldRelPath];
|
|
427
|
+
delete this.buildLog.templates[oldRelPath];
|
|
428
|
+
}
|
|
429
|
+
// Move entry in local build log
|
|
430
|
+
if (this.localBuildLog.templates[oldRelPath]) {
|
|
431
|
+
this.localBuildLog.templates[newRelPath] = this.localBuildLog.templates[oldRelPath];
|
|
432
|
+
delete this.localBuildLog.templates[oldRelPath];
|
|
433
|
+
}
|
|
434
|
+
// Update in-memory state map
|
|
435
|
+
const oldAbsPath = path.resolve(this.config.baseDir, oldRelPath);
|
|
436
|
+
const newAbsPath = path.resolve(this.config.baseDir, newRelPath);
|
|
437
|
+
const state = this.templateStates.get(oldAbsPath);
|
|
438
|
+
if (state) {
|
|
439
|
+
this.templateStates.delete(oldAbsPath);
|
|
440
|
+
this.templateStates.set(newAbsPath, { ...state, templatePath: newAbsPath });
|
|
441
|
+
}
|
|
442
|
+
this.scheduleAutoSave();
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Convert template path to relative path for build log keys
|
|
446
|
+
*/
|
|
447
|
+
toRelativePath(templatePath) {
|
|
448
|
+
return path.isAbsolute(templatePath)
|
|
449
|
+
? path.relative(this.config.baseDir, templatePath)
|
|
450
|
+
: templatePath;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Dispose of the service
|
|
454
|
+
*/
|
|
455
|
+
async dispose() {
|
|
456
|
+
if (this.saveTimer) {
|
|
457
|
+
clearTimeout(this.saveTimer);
|
|
458
|
+
await this.saveBuildLogs();
|
|
459
|
+
}
|
|
460
|
+
this.removeAllListeners();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=StateService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateService.js","sourceRoot":"","sources":["../../src/services/StateService.ts"],"names":[],"mappings":"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"}
|