@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.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +50 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/apply.d.ts +2 -0
  7. package/dist/commands/apply.js +105 -0
  8. package/dist/commands/apply.js.map +1 -0
  9. package/dist/commands/build.d.ts +2 -0
  10. package/dist/commands/build.js +134 -0
  11. package/dist/commands/build.js.map +1 -0
  12. package/dist/commands/clear.d.ts +2 -0
  13. package/dist/commands/clear.js +161 -0
  14. package/dist/commands/clear.js.map +1 -0
  15. package/dist/commands/init.d.ts +2 -0
  16. package/dist/commands/init.js +91 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/menu.d.ts +4 -0
  19. package/dist/commands/menu.js +76 -0
  20. package/dist/commands/menu.js.map +1 -0
  21. package/dist/commands/promote.d.ts +2 -0
  22. package/dist/commands/promote.js +181 -0
  23. package/dist/commands/promote.js.map +1 -0
  24. package/dist/commands/register.d.ts +2 -0
  25. package/dist/commands/register.js +192 -0
  26. package/dist/commands/register.js.map +1 -0
  27. package/dist/commands/watch.d.ts +14 -0
  28. package/dist/commands/watch.js +190 -0
  29. package/dist/commands/watch.js.map +1 -0
  30. package/dist/constants.d.ts +1 -0
  31. package/dist/constants.js +2 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/services/DatabaseService.d.ts +113 -0
  34. package/dist/services/DatabaseService.js +343 -0
  35. package/dist/services/DatabaseService.js.map +1 -0
  36. package/dist/services/FileSystemService.d.ts +100 -0
  37. package/dist/services/FileSystemService.js +237 -0
  38. package/dist/services/FileSystemService.js.map +1 -0
  39. package/dist/services/MigrationBuilder.d.ts +106 -0
  40. package/dist/services/MigrationBuilder.js +193 -0
  41. package/dist/services/MigrationBuilder.js.map +1 -0
  42. package/dist/services/Orchestrator.d.ts +155 -0
  43. package/dist/services/Orchestrator.js +622 -0
  44. package/dist/services/Orchestrator.js.map +1 -0
  45. package/dist/services/StateService.d.ts +169 -0
  46. package/dist/services/StateService.js +463 -0
  47. package/dist/services/StateService.js.map +1 -0
  48. package/dist/types.d.ts +48 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/ui/badge.d.ts +14 -0
  52. package/dist/ui/badge.js +28 -0
  53. package/dist/ui/badge.js.map +1 -0
  54. package/dist/ui/branding.d.ts +9 -0
  55. package/dist/ui/branding.js +35 -0
  56. package/dist/ui/branding.js.map +1 -0
  57. package/dist/ui/index.d.ts +4 -0
  58. package/dist/ui/index.js +5 -0
  59. package/dist/ui/index.js.map +1 -0
  60. package/dist/ui/results.d.ts +10 -0
  61. package/dist/ui/results.js +62 -0
  62. package/dist/ui/results.js.map +1 -0
  63. package/dist/ui/spinner.d.ts +5 -0
  64. package/dist/ui/spinner.js +8 -0
  65. package/dist/ui/spinner.js.map +1 -0
  66. package/dist/utils/config.d.ts +12 -0
  67. package/dist/utils/config.js +67 -0
  68. package/dist/utils/config.js.map +1 -0
  69. package/dist/utils/createEmptyBuildLog.d.ts +1 -0
  70. package/dist/utils/createEmptyBuildLog.js +10 -0
  71. package/dist/utils/createEmptyBuildLog.js.map +1 -0
  72. package/dist/utils/ensureDirectories.d.ts +4 -0
  73. package/dist/utils/ensureDirectories.js +23 -0
  74. package/dist/utils/ensureDirectories.js.map +1 -0
  75. package/dist/utils/fileExists.d.ts +1 -0
  76. package/dist/utils/fileExists.js +11 -0
  77. package/dist/utils/fileExists.js.map +1 -0
  78. package/dist/utils/findProjectRoot.d.ts +1 -0
  79. package/dist/utils/findProjectRoot.js +25 -0
  80. package/dist/utils/findProjectRoot.js.map +1 -0
  81. package/dist/utils/getErrorMessage.d.ts +9 -0
  82. package/dist/utils/getErrorMessage.js +14 -0
  83. package/dist/utils/getErrorMessage.js.map +1 -0
  84. package/dist/utils/getNextTimestamp.d.ts +2 -0
  85. package/dist/utils/getNextTimestamp.js +12 -0
  86. package/dist/utils/getNextTimestamp.js.map +1 -0
  87. package/dist/utils/isWipTemplate.d.ts +1 -0
  88. package/dist/utils/isWipTemplate.js +6 -0
  89. package/dist/utils/isWipTemplate.js.map +1 -0
  90. package/dist/utils/logger.d.ts +9 -0
  91. package/dist/utils/logger.js +12 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/safeCreate.d.ts +1 -0
  94. package/dist/utils/safeCreate.js +16 -0
  95. package/dist/utils/safeCreate.js.map +1 -0
  96. 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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"}