popeye-cli 1.6.0 → 1.8.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 (161) hide show
  1. package/README.md +240 -32
  2. package/cheatsheet.md +407 -0
  3. package/dist/cli/commands/db.d.ts +10 -0
  4. package/dist/cli/commands/db.d.ts.map +1 -0
  5. package/dist/cli/commands/db.js +240 -0
  6. package/dist/cli/commands/db.js.map +1 -0
  7. package/dist/cli/commands/doctor.d.ts +18 -0
  8. package/dist/cli/commands/doctor.d.ts.map +1 -0
  9. package/dist/cli/commands/doctor.js +255 -0
  10. package/dist/cli/commands/doctor.js.map +1 -0
  11. package/dist/cli/commands/index.d.ts +2 -0
  12. package/dist/cli/commands/index.d.ts.map +1 -1
  13. package/dist/cli/commands/index.js +2 -0
  14. package/dist/cli/commands/index.js.map +1 -1
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +3 -1
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/interactive.d.ts.map +1 -1
  19. package/dist/cli/interactive.js +96 -0
  20. package/dist/cli/interactive.js.map +1 -1
  21. package/dist/generators/admin-wizard.d.ts +25 -0
  22. package/dist/generators/admin-wizard.d.ts.map +1 -0
  23. package/dist/generators/admin-wizard.js +123 -0
  24. package/dist/generators/admin-wizard.js.map +1 -0
  25. package/dist/generators/all.d.ts.map +1 -1
  26. package/dist/generators/all.js +10 -3
  27. package/dist/generators/all.js.map +1 -1
  28. package/dist/generators/database.d.ts +58 -0
  29. package/dist/generators/database.d.ts.map +1 -0
  30. package/dist/generators/database.js +229 -0
  31. package/dist/generators/database.js.map +1 -0
  32. package/dist/generators/fullstack.d.ts.map +1 -1
  33. package/dist/generators/fullstack.js +23 -7
  34. package/dist/generators/fullstack.js.map +1 -1
  35. package/dist/generators/index.d.ts +2 -0
  36. package/dist/generators/index.d.ts.map +1 -1
  37. package/dist/generators/index.js +2 -0
  38. package/dist/generators/index.js.map +1 -1
  39. package/dist/generators/templates/admin-wizard-python.d.ts +32 -0
  40. package/dist/generators/templates/admin-wizard-python.d.ts.map +1 -0
  41. package/dist/generators/templates/admin-wizard-python.js +425 -0
  42. package/dist/generators/templates/admin-wizard-python.js.map +1 -0
  43. package/dist/generators/templates/admin-wizard-react.d.ts +48 -0
  44. package/dist/generators/templates/admin-wizard-react.d.ts.map +1 -0
  45. package/dist/generators/templates/admin-wizard-react.js +554 -0
  46. package/dist/generators/templates/admin-wizard-react.js.map +1 -0
  47. package/dist/generators/templates/database-docker.d.ts +23 -0
  48. package/dist/generators/templates/database-docker.d.ts.map +1 -0
  49. package/dist/generators/templates/database-docker.js +221 -0
  50. package/dist/generators/templates/database-docker.js.map +1 -0
  51. package/dist/generators/templates/database-python.d.ts +54 -0
  52. package/dist/generators/templates/database-python.d.ts.map +1 -0
  53. package/dist/generators/templates/database-python.js +723 -0
  54. package/dist/generators/templates/database-python.js.map +1 -0
  55. package/dist/generators/templates/database-typescript.d.ts +34 -0
  56. package/dist/generators/templates/database-typescript.d.ts.map +1 -0
  57. package/dist/generators/templates/database-typescript.js +232 -0
  58. package/dist/generators/templates/database-typescript.js.map +1 -0
  59. package/dist/generators/templates/fullstack.d.ts.map +1 -1
  60. package/dist/generators/templates/fullstack.js +29 -0
  61. package/dist/generators/templates/fullstack.js.map +1 -1
  62. package/dist/generators/templates/index.d.ts +5 -0
  63. package/dist/generators/templates/index.d.ts.map +1 -1
  64. package/dist/generators/templates/index.js +5 -0
  65. package/dist/generators/templates/index.js.map +1 -1
  66. package/dist/state/index.d.ts +10 -0
  67. package/dist/state/index.d.ts.map +1 -1
  68. package/dist/state/index.js +22 -0
  69. package/dist/state/index.js.map +1 -1
  70. package/dist/types/consensus.d.ts +3 -0
  71. package/dist/types/consensus.d.ts.map +1 -1
  72. package/dist/types/consensus.js +1 -0
  73. package/dist/types/consensus.js.map +1 -1
  74. package/dist/types/database-runtime.d.ts +86 -0
  75. package/dist/types/database-runtime.d.ts.map +1 -0
  76. package/dist/types/database-runtime.js +61 -0
  77. package/dist/types/database-runtime.js.map +1 -0
  78. package/dist/types/database.d.ts +85 -0
  79. package/dist/types/database.d.ts.map +1 -0
  80. package/dist/types/database.js +71 -0
  81. package/dist/types/database.js.map +1 -0
  82. package/dist/types/index.d.ts +3 -0
  83. package/dist/types/index.d.ts.map +1 -1
  84. package/dist/types/index.js +6 -0
  85. package/dist/types/index.js.map +1 -1
  86. package/dist/types/tester.d.ts +138 -0
  87. package/dist/types/tester.d.ts.map +1 -0
  88. package/dist/types/tester.js +110 -0
  89. package/dist/types/tester.js.map +1 -0
  90. package/dist/types/workflow.d.ts +166 -0
  91. package/dist/types/workflow.d.ts.map +1 -1
  92. package/dist/types/workflow.js +14 -0
  93. package/dist/types/workflow.js.map +1 -1
  94. package/dist/workflow/db-setup-runner.d.ts +63 -0
  95. package/dist/workflow/db-setup-runner.d.ts.map +1 -0
  96. package/dist/workflow/db-setup-runner.js +336 -0
  97. package/dist/workflow/db-setup-runner.js.map +1 -0
  98. package/dist/workflow/db-state-machine.d.ts +30 -0
  99. package/dist/workflow/db-state-machine.d.ts.map +1 -0
  100. package/dist/workflow/db-state-machine.js +51 -0
  101. package/dist/workflow/db-state-machine.js.map +1 -0
  102. package/dist/workflow/execution-mode.js +2 -2
  103. package/dist/workflow/execution-mode.js.map +1 -1
  104. package/dist/workflow/index.d.ts +3 -0
  105. package/dist/workflow/index.d.ts.map +1 -1
  106. package/dist/workflow/index.js +3 -0
  107. package/dist/workflow/index.js.map +1 -1
  108. package/dist/workflow/task-workflow.d.ts +5 -0
  109. package/dist/workflow/task-workflow.d.ts.map +1 -1
  110. package/dist/workflow/task-workflow.js +172 -6
  111. package/dist/workflow/task-workflow.js.map +1 -1
  112. package/dist/workflow/tester.d.ts +120 -0
  113. package/dist/workflow/tester.d.ts.map +1 -0
  114. package/dist/workflow/tester.js +589 -0
  115. package/dist/workflow/tester.js.map +1 -0
  116. package/dist/workflow/workflow-logger.d.ts +1 -1
  117. package/dist/workflow/workflow-logger.d.ts.map +1 -1
  118. package/dist/workflow/workflow-logger.js.map +1 -1
  119. package/package.json +1 -1
  120. package/src/cli/commands/db.ts +281 -0
  121. package/src/cli/commands/doctor.ts +273 -0
  122. package/src/cli/commands/index.ts +2 -0
  123. package/src/cli/index.ts +4 -0
  124. package/src/cli/interactive.ts +102 -0
  125. package/src/generators/admin-wizard.ts +146 -0
  126. package/src/generators/all.ts +10 -3
  127. package/src/generators/database.ts +286 -0
  128. package/src/generators/fullstack.ts +26 -9
  129. package/src/generators/index.ts +12 -0
  130. package/src/generators/templates/admin-wizard-python.ts +431 -0
  131. package/src/generators/templates/admin-wizard-react.ts +560 -0
  132. package/src/generators/templates/database-docker.ts +227 -0
  133. package/src/generators/templates/database-python.ts +734 -0
  134. package/src/generators/templates/database-typescript.ts +238 -0
  135. package/src/generators/templates/fullstack.ts +29 -0
  136. package/src/generators/templates/index.ts +5 -0
  137. package/src/state/index.ts +29 -0
  138. package/src/types/consensus.ts +3 -0
  139. package/src/types/database-runtime.ts +69 -0
  140. package/src/types/database.ts +84 -0
  141. package/src/types/index.ts +50 -0
  142. package/src/types/tester.ts +136 -0
  143. package/src/types/workflow.ts +31 -0
  144. package/src/workflow/db-setup-runner.ts +391 -0
  145. package/src/workflow/db-state-machine.ts +58 -0
  146. package/src/workflow/execution-mode.ts +2 -2
  147. package/src/workflow/index.ts +3 -0
  148. package/src/workflow/task-workflow.ts +227 -5
  149. package/src/workflow/tester.ts +723 -0
  150. package/src/workflow/workflow-logger.ts +2 -0
  151. package/tests/generators/admin-wizard-orchestrator.test.ts +64 -0
  152. package/tests/generators/admin-wizard-templates.test.ts +366 -0
  153. package/tests/generators/cross-phase-integration.test.ts +383 -0
  154. package/tests/generators/database.test.ts +456 -0
  155. package/tests/generators/fe-be-db-integration.test.ts +613 -0
  156. package/tests/types/database-runtime.test.ts +158 -0
  157. package/tests/types/database.test.ts +187 -0
  158. package/tests/types/tester.test.ts +174 -0
  159. package/tests/workflow/db-setup-runner.test.ts +211 -0
  160. package/tests/workflow/db-state-machine.test.ts +117 -0
  161. package/tests/workflow/tester.test.ts +401 -0
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Database setup pipeline runner
3
+ * Executes sequential steps to configure, migrate, and verify a database
4
+ */
5
+ import { promises as fs } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { exec } from 'node:child_process';
8
+ import { promisify } from 'node:util';
9
+ import { transitionDbStatus } from './db-state-machine.js';
10
+ const execAsync = promisify(exec);
11
+ /**
12
+ * Read and parse a .env file for key=value pairs
13
+ *
14
+ * @param envPath - Path to .env file
15
+ * @returns Map of environment variable key-value pairs
16
+ */
17
+ export async function readEnvFile(envPath) {
18
+ const result = {};
19
+ try {
20
+ const content = await fs.readFile(envPath, 'utf-8');
21
+ for (const line of content.split('\n')) {
22
+ const trimmed = line.trim();
23
+ if (!trimmed || trimmed.startsWith('#'))
24
+ continue;
25
+ const eqIndex = trimmed.indexOf('=');
26
+ if (eqIndex === -1)
27
+ continue;
28
+ const key = trimmed.slice(0, eqIndex).trim();
29
+ let value = trimmed.slice(eqIndex + 1).trim();
30
+ // Strip surrounding quotes
31
+ if ((value.startsWith('"') && value.endsWith('"')) ||
32
+ (value.startsWith("'") && value.endsWith("'"))) {
33
+ value = value.slice(1, -1);
34
+ }
35
+ result[key] = value;
36
+ }
37
+ }
38
+ catch {
39
+ // File doesn't exist or isn't readable
40
+ }
41
+ return result;
42
+ }
43
+ /**
44
+ * Scan migration files for prerequisite extension comments
45
+ * Looks for lines like: # popeye:requires_extension=vector
46
+ *
47
+ * @param migrationsDir - Path to migrations/versions/ directory
48
+ * @returns Array of required extension names
49
+ */
50
+ export async function parseMigrationPrereqs(migrationsDir) {
51
+ const extensions = [];
52
+ const versionsDir = path.join(migrationsDir, 'versions');
53
+ try {
54
+ const files = await fs.readdir(versionsDir);
55
+ for (const file of files) {
56
+ if (!file.endsWith('.py'))
57
+ continue;
58
+ const content = await fs.readFile(path.join(versionsDir, file), 'utf-8');
59
+ const matches = content.matchAll(/# popeye:requires_extension=(\w+)/g);
60
+ for (const match of matches) {
61
+ if (!extensions.includes(match[1])) {
62
+ extensions.push(match[1]);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ catch {
68
+ // Directory doesn't exist or isn't readable
69
+ }
70
+ return extensions;
71
+ }
72
+ /**
73
+ * Derive the snake_case package name from the project state
74
+ *
75
+ * @param projectDir - Project root directory
76
+ * @returns Python package name
77
+ */
78
+ export async function getPackageName(projectDir) {
79
+ try {
80
+ const statePath = path.join(projectDir, '.popeye', 'state.json');
81
+ const content = await fs.readFile(statePath, 'utf-8');
82
+ const state = JSON.parse(content);
83
+ const name = state.name || 'project';
84
+ return name.toLowerCase().replace(/-/g, '_').replace(/[^a-z0-9_]/g, '');
85
+ }
86
+ catch {
87
+ return 'backend';
88
+ }
89
+ }
90
+ /**
91
+ * Resolve the backend directory path
92
+ *
93
+ * @param projectDir - Project root directory
94
+ * @returns Absolute path to apps/backend
95
+ */
96
+ export function resolveBackendDir(projectDir) {
97
+ return path.join(projectDir, 'apps', 'backend');
98
+ }
99
+ /**
100
+ * Execute a single pipeline step and track timing
101
+ */
102
+ async function executeStep(step, fn, options) {
103
+ options?.onStep?.(step, 'start', `Starting ${step}...`);
104
+ const start = Date.now();
105
+ try {
106
+ const message = await fn();
107
+ const durationMs = Date.now() - start;
108
+ options?.onStep?.(step, 'success', message);
109
+ return { step, success: true, message, durationMs };
110
+ }
111
+ catch (err) {
112
+ const durationMs = Date.now() - start;
113
+ const error = err instanceof Error ? err.message : String(err);
114
+ options?.onStep?.(step, 'fail', error);
115
+ return { step, success: false, message: `Step failed: ${step}`, durationMs, error };
116
+ }
117
+ }
118
+ /**
119
+ * Step 1: Check database connection
120
+ */
121
+ async function checkConnection(backendDir) {
122
+ const env = await readEnvFile(path.join(backendDir, '.env'));
123
+ const dbUrl = env['DATABASE_URL'] || '';
124
+ if (!dbUrl) {
125
+ throw new Error('DATABASE_URL not found in apps/backend/.env. ' +
126
+ 'Run "popeye db configure" to set it up.');
127
+ }
128
+ // Test connectivity using Python asyncpg
129
+ const cmd = `cd "${backendDir}" && python3 -c "
130
+ import asyncio, asyncpg, os
131
+ async def check():
132
+ conn = await asyncpg.connect('${dbUrl.replace(/'/g, "\\'")}')
133
+ await conn.execute('SELECT 1')
134
+ await conn.close()
135
+ asyncio.run(check())
136
+ "`;
137
+ try {
138
+ await execAsync(cmd, { timeout: 15000 });
139
+ return 'Database connection verified successfully';
140
+ }
141
+ catch (err) {
142
+ const msg = err instanceof Error ? err.message : String(err);
143
+ throw new Error(`Database connection failed: ${msg}`);
144
+ }
145
+ }
146
+ /**
147
+ * Step 2: Ensure required extensions
148
+ */
149
+ async function ensureExtensions(backendDir) {
150
+ const migrationsDir = path.join(backendDir, 'migrations');
151
+ const extensions = await parseMigrationPrereqs(migrationsDir);
152
+ if (extensions.length === 0) {
153
+ return 'No prerequisite extensions required';
154
+ }
155
+ const env = await readEnvFile(path.join(backendDir, '.env'));
156
+ const dbUrl = env['DATABASE_URL'] || '';
157
+ for (const ext of extensions) {
158
+ const cmd = `cd "${backendDir}" && python3 -c "
159
+ import asyncio, asyncpg
160
+ async def ensure():
161
+ conn = await asyncpg.connect('${dbUrl.replace(/'/g, "\\'")}')
162
+ await conn.execute('CREATE EXTENSION IF NOT EXISTS ${ext}')
163
+ await conn.close()
164
+ asyncio.run(ensure())
165
+ "`;
166
+ try {
167
+ await execAsync(cmd, { timeout: 15000 });
168
+ }
169
+ catch (err) {
170
+ const msg = err instanceof Error ? err.message : String(err);
171
+ throw new Error(`Failed to create extension '${ext}': ${msg}`);
172
+ }
173
+ }
174
+ return `Extensions verified: ${extensions.join(', ')}`;
175
+ }
176
+ /**
177
+ * Step 3: Apply Alembic migrations
178
+ */
179
+ async function applyMigrations(backendDir) {
180
+ const cmd = `cd "${backendDir}" && alembic upgrade head 2>&1`;
181
+ try {
182
+ const { stdout } = await execAsync(cmd, { timeout: 60000 });
183
+ // Count applied migrations from output
184
+ const appliedMatches = stdout.match(/Running upgrade/g);
185
+ const count = appliedMatches ? appliedMatches.length : 0;
186
+ return count > 0
187
+ ? `Applied ${count} migration(s) successfully`
188
+ : 'All migrations already up to date';
189
+ }
190
+ catch (err) {
191
+ const msg = err instanceof Error ? err.message : String(err);
192
+ throw new Error(`Migration failed: ${msg}`);
193
+ }
194
+ }
195
+ /**
196
+ * Step 4: Run seed script (if exists)
197
+ */
198
+ async function seedMinimal(backendDir) {
199
+ const seedPaths = [
200
+ path.join(backendDir, 'scripts', 'seed.py'),
201
+ path.join(backendDir, 'seed.py'),
202
+ ];
203
+ let seedPath = null;
204
+ for (const p of seedPaths) {
205
+ try {
206
+ await fs.access(p);
207
+ seedPath = p;
208
+ break;
209
+ }
210
+ catch {
211
+ // Try next
212
+ }
213
+ }
214
+ if (!seedPath) {
215
+ return 'No seed script found (skipped)';
216
+ }
217
+ const cmd = `cd "${backendDir}" && python3 "${seedPath}" 2>&1`;
218
+ try {
219
+ await execAsync(cmd, { timeout: 30000 });
220
+ return 'Seed script executed successfully';
221
+ }
222
+ catch (err) {
223
+ const msg = err instanceof Error ? err.message : String(err);
224
+ throw new Error(`Seed script failed: ${msg}`);
225
+ }
226
+ }
227
+ /**
228
+ * Step 5: Run readiness tests
229
+ */
230
+ async function runReadinessTests(backendDir) {
231
+ const env = await readEnvFile(path.join(backendDir, '.env'));
232
+ const dbUrl = env['DATABASE_URL'] || '';
233
+ const cmd = `cd "${backendDir}" && python3 -c "
234
+ import asyncio, asyncpg
235
+ async def check():
236
+ conn = await asyncpg.connect('${dbUrl.replace(/'/g, "\\'")}')
237
+ # Verify connectivity
238
+ await conn.execute('SELECT 1')
239
+ # Verify alembic_version table exists and has a version
240
+ row = await conn.fetchrow('SELECT version_num FROM alembic_version LIMIT 1')
241
+ if row is None:
242
+ raise Exception('No migration version found in alembic_version table')
243
+ await conn.close()
244
+ return row['version_num']
245
+ asyncio.run(check())
246
+ "`;
247
+ try {
248
+ await execAsync(cmd, { timeout: 15000 });
249
+ return 'Readiness tests passed: connectivity and migration version verified';
250
+ }
251
+ catch (err) {
252
+ const msg = err instanceof Error ? err.message : String(err);
253
+ throw new Error(`Readiness tests failed: ${msg}`);
254
+ }
255
+ }
256
+ /**
257
+ * Run the complete database setup pipeline
258
+ *
259
+ * Steps execute sequentially. Pipeline stops on first failure.
260
+ *
261
+ * @param projectDir - Project root directory
262
+ * @param options - Pipeline options
263
+ * @returns Full pipeline result
264
+ */
265
+ export async function runDbSetupPipeline(projectDir, options = {}) {
266
+ const backendDir = resolveBackendDir(projectDir);
267
+ const steps = [];
268
+ const pipelineStart = Date.now();
269
+ // Step 1: Check connection
270
+ const connResult = await executeStep('check_connection', () => checkConnection(backendDir), options);
271
+ steps.push(connResult);
272
+ if (!connResult.success) {
273
+ return buildResult(steps, pipelineStart, 'error');
274
+ }
275
+ // Step 2: Ensure extensions
276
+ const extResult = await executeStep('ensure_extensions', () => ensureExtensions(backendDir), options);
277
+ steps.push(extResult);
278
+ if (!extResult.success) {
279
+ return buildResult(steps, pipelineStart, 'error');
280
+ }
281
+ // Step 3: Apply migrations
282
+ const migResult = await executeStep('apply_migrations', () => applyMigrations(backendDir), options);
283
+ steps.push(migResult);
284
+ if (!migResult.success) {
285
+ return buildResult(steps, pipelineStart, 'error');
286
+ }
287
+ // Step 4: Seed (optional)
288
+ if (!options.skipSeed) {
289
+ const seedResult = await executeStep('seed_minimal', () => seedMinimal(backendDir), options);
290
+ steps.push(seedResult);
291
+ if (!seedResult.success) {
292
+ return buildResult(steps, pipelineStart, 'error');
293
+ }
294
+ }
295
+ // Step 5: Readiness tests
296
+ const readyResult = await executeStep('readiness_tests', () => runReadinessTests(backendDir), options);
297
+ steps.push(readyResult);
298
+ if (!readyResult.success) {
299
+ return buildResult(steps, pipelineStart, 'error');
300
+ }
301
+ // Step 6: Mark ready (always succeeds if we got here)
302
+ const markResult = await executeStep('mark_ready', async () => {
303
+ return 'Database marked as ready';
304
+ }, options);
305
+ steps.push(markResult);
306
+ return buildResult(steps, pipelineStart, 'ready');
307
+ }
308
+ /**
309
+ * Build a SetupResult from accumulated steps
310
+ */
311
+ function buildResult(steps, pipelineStart, finalStatus) {
312
+ const totalDurationMs = Date.now() - pipelineStart;
313
+ const success = finalStatus === 'ready';
314
+ const failedStep = steps.find((s) => !s.success);
315
+ return {
316
+ success,
317
+ steps,
318
+ totalDurationMs,
319
+ finalStatus,
320
+ error: failedStep?.error,
321
+ };
322
+ }
323
+ /**
324
+ * Compute the new DB status after a pipeline run and validate the transition
325
+ *
326
+ * @param currentStatus - Current DB status from state
327
+ * @param pipelineResult - Result of the pipeline run
328
+ * @returns New DB status after validated transition
329
+ */
330
+ export function computePostPipelineStatus(currentStatus, pipelineResult) {
331
+ // Transition to 'applying' first
332
+ const applying = transitionDbStatus(currentStatus, 'applying');
333
+ // Then transition to final status
334
+ return transitionDbStatus(applying, pipelineResult.finalStatus);
335
+ }
336
+ //# sourceMappingURL=db-setup-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-setup-runner.js","sourceRoot":"","sources":["../../src/workflow/db-setup-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Database lifecycle state machine
3
+ * Enforces valid transitions between DB status states
4
+ */
5
+ import type { DbStatus } from '../types/database.js';
6
+ /**
7
+ * Check if a transition from current to target is valid
8
+ *
9
+ * @param current - Current DB status
10
+ * @param target - Target DB status
11
+ * @returns True if the transition is allowed
12
+ */
13
+ export declare function canTransition(current: DbStatus, target: DbStatus): boolean;
14
+ /**
15
+ * Validate and execute a state transition
16
+ *
17
+ * @param current - Current DB status
18
+ * @param target - Desired target status
19
+ * @returns The new status
20
+ * @throws Error if the transition is invalid
21
+ */
22
+ export declare function transitionDbStatus(current: DbStatus, target: DbStatus): DbStatus;
23
+ /**
24
+ * Get the list of valid next states from the current status
25
+ *
26
+ * @param current - Current DB status
27
+ * @returns Array of valid target states
28
+ */
29
+ export declare function getAvailableTransitions(current: DbStatus): DbStatus[];
30
+ //# sourceMappingURL=db-state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-state-machine.d.ts","sourceRoot":"","sources":["../../src/workflow/db-state-machine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAcrD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAG1E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAQhF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAErE"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Database lifecycle state machine
3
+ * Enforces valid transitions between DB status states
4
+ */
5
+ /**
6
+ * Valid state transitions map
7
+ * Each key maps to an array of valid target states
8
+ */
9
+ const VALID_TRANSITIONS = {
10
+ unconfigured: ['configured'],
11
+ configured: ['applying', 'unconfigured'],
12
+ applying: ['ready', 'error'],
13
+ ready: ['configured', 'unconfigured'],
14
+ error: ['configured', 'unconfigured'],
15
+ };
16
+ /**
17
+ * Check if a transition from current to target is valid
18
+ *
19
+ * @param current - Current DB status
20
+ * @param target - Target DB status
21
+ * @returns True if the transition is allowed
22
+ */
23
+ export function canTransition(current, target) {
24
+ const allowed = VALID_TRANSITIONS[current];
25
+ return allowed !== undefined && allowed.includes(target);
26
+ }
27
+ /**
28
+ * Validate and execute a state transition
29
+ *
30
+ * @param current - Current DB status
31
+ * @param target - Desired target status
32
+ * @returns The new status
33
+ * @throws Error if the transition is invalid
34
+ */
35
+ export function transitionDbStatus(current, target) {
36
+ if (!canTransition(current, target)) {
37
+ throw new Error(`Invalid DB status transition: '${current}' -> '${target}'. ` +
38
+ `Allowed transitions from '${current}': [${getAvailableTransitions(current).join(', ')}]`);
39
+ }
40
+ return target;
41
+ }
42
+ /**
43
+ * Get the list of valid next states from the current status
44
+ *
45
+ * @param current - Current DB status
46
+ * @returns Array of valid target states
47
+ */
48
+ export function getAvailableTransitions(current) {
49
+ return VALID_TRANSITIONS[current] || [];
50
+ }
51
+ //# sourceMappingURL=db-state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-state-machine.js","sourceRoot":"","sources":["../../src/workflow/db-state-machine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,iBAAiB,GAAiC;IACtD,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,UAAU,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;IACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;IACrC,KAAK,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC;CACtC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAiB,EAAE,MAAgB;IAC/D,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAiB,EAAE,MAAgB;IACpE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,kCAAkC,OAAO,SAAS,MAAM,KAAK;YAC7D,6BAA6B,OAAO,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAiB;IACvD,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC"}
@@ -696,10 +696,10 @@ ${task.name}
696
696
  ## Description
697
697
  ${task.description || task.name}
698
698
 
699
- ${task.testPlan ? `## Test Requirements\n${task.testPlan}\n` : ''}
699
+ ${task.qaTestPlanText ? `## QA Test Plan\nImplement tests according to this approved test plan:\n${task.qaTestPlanText}\n` : ''}
700
700
 
701
701
  Please implement this task completely. After implementing:
702
- 1. Create appropriate tests if needed
702
+ 1. Implement tests as specified in the QA Test Plan above
703
703
  2. Ensure code follows best practices
704
704
  3. Document any complex logic
705
705
  `.trim();