@eldrforge/kodrdriv 1.2.29 → 1.2.124

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 (84) hide show
  1. package/dist/application.js +16 -13
  2. package/dist/application.js.map +1 -1
  3. package/dist/arguments.js +5 -5
  4. package/dist/arguments.js.map +1 -1
  5. package/dist/commands/audio-review.js +2 -5
  6. package/dist/commands/audio-review.js.map +1 -1
  7. package/dist/commands/clean.js +2 -4
  8. package/dist/commands/clean.js.map +1 -1
  9. package/dist/commands/commit.js +3 -6
  10. package/dist/commands/commit.js.map +1 -1
  11. package/dist/commands/development.js +7 -7
  12. package/dist/commands/development.js.map +1 -1
  13. package/dist/commands/link.js +3 -7
  14. package/dist/commands/link.js.map +1 -1
  15. package/dist/commands/precommit.js +99 -0
  16. package/dist/commands/precommit.js.map +1 -0
  17. package/dist/commands/publish.js +47 -32
  18. package/dist/commands/publish.js.map +1 -1
  19. package/dist/commands/release.js +3 -7
  20. package/dist/commands/release.js.map +1 -1
  21. package/dist/commands/review.js +4 -6
  22. package/dist/commands/review.js.map +1 -1
  23. package/dist/commands/tree.js +213 -84
  24. package/dist/commands/tree.js.map +1 -1
  25. package/dist/commands/unlink.js +3 -7
  26. package/dist/commands/unlink.js.map +1 -1
  27. package/dist/commands/updates.js +2 -4
  28. package/dist/commands/updates.js.map +1 -1
  29. package/dist/commands/versions.js +3 -7
  30. package/dist/commands/versions.js.map +1 -1
  31. package/dist/constants.js +4 -2
  32. package/dist/constants.js.map +1 -1
  33. package/dist/content/files.js +2 -4
  34. package/dist/content/files.js.map +1 -1
  35. package/dist/execution/CommandValidator.js +33 -1
  36. package/dist/execution/CommandValidator.js.map +1 -1
  37. package/dist/execution/ResourceMonitor.js +26 -1
  38. package/dist/execution/ResourceMonitor.js.map +1 -1
  39. package/dist/execution/TreeExecutionAdapter.js +2 -2
  40. package/dist/execution/TreeExecutionAdapter.js.map +1 -1
  41. package/dist/util/checkpointManager.js +2 -4
  42. package/dist/util/checkpointManager.js.map +1 -1
  43. package/dist/util/dependencyGraph.js +2 -4
  44. package/dist/util/dependencyGraph.js.map +1 -1
  45. package/dist/util/general.js +8 -219
  46. package/dist/util/general.js.map +1 -1
  47. package/dist/util/gitMutex.js +63 -18
  48. package/dist/util/gitMutex.js.map +1 -1
  49. package/dist/util/precommitOptimizations.js +310 -0
  50. package/dist/util/precommitOptimizations.js.map +1 -0
  51. package/dist/util/storageAdapter.js +2 -6
  52. package/dist/util/storageAdapter.js.map +1 -1
  53. package/dist/util/validation.js +3 -3
  54. package/dist/util/validation.js.map +1 -1
  55. package/dist/utils/branchState.js +178 -45
  56. package/dist/utils/branchState.js.map +1 -1
  57. package/package.json +6 -5
  58. package/AI-FRIENDLY-LOGGING-GUIDE.md +0 -237
  59. package/AI-LOGGING-MIGRATION-COMPLETE.md +0 -371
  60. package/ALREADY-PUBLISHED-PACKAGES-FIX.md +0 -264
  61. package/AUDIT-BRANCHES-PROGRESS-FIX.md +0 -90
  62. package/AUDIT-EXAMPLE-OUTPUT.md +0 -113
  63. package/CHECKPOINT-RECOVERY-FIX.md +0 -450
  64. package/LOGGING-MIGRATION-STATUS.md +0 -186
  65. package/MONOREPO-PUBLISH-IMPROVEMENTS.md +0 -281
  66. package/PARALLEL-EXECUTION-FIXES.md +0 -132
  67. package/PARALLEL-PUBLISH-DEBUGGING-GUIDE.md +0 -441
  68. package/PARALLEL-PUBLISH-FIXES-IMPLEMENTED.md +0 -405
  69. package/PARALLEL-PUBLISH-IMPROVEMENTS-IMPLEMENTED.md +0 -439
  70. package/PARALLEL-PUBLISH-LOGGING-FIXES.md +0 -274
  71. package/PARALLEL-PUBLISH-QUICK-REFERENCE.md +0 -375
  72. package/PARALLEL_EXECUTION_FIX.md +0 -146
  73. package/PUBLISH_IMPROVEMENTS_IMPLEMENTED.md +0 -294
  74. package/RECOVERY-FIXES.md +0 -72
  75. package/SUBMODULE-LOCK-FIX.md +0 -132
  76. package/VERSION-AUDIT-FIX.md +0 -333
  77. package/WORKFLOW-PRECHECK-IMPLEMENTATION.md +0 -239
  78. package/WORKFLOW-SKIP-SUMMARY.md +0 -121
  79. package/dist/util/safety.js +0 -166
  80. package/dist/util/safety.js.map +0 -1
  81. package/dist/util/stdin.js +0 -133
  82. package/dist/util/stdin.js.map +0 -1
  83. package/dist/util/storage.js +0 -187
  84. package/dist/util/storage.js.map +0 -1
@@ -0,0 +1,310 @@
1
+ import path__default from 'path';
2
+ import fs from 'fs/promises';
3
+ import { getLogger } from '../logging.js';
4
+ import { runSecure } from '@eldrforge/git-tools';
5
+ import { createStorage } from '@eldrforge/shared';
6
+
7
+ const logger = getLogger();
8
+ // Cache file to store test run timestamps per package
9
+ const TEST_CACHE_FILE = '.kodrdriv-test-cache.json';
10
+ /**
11
+ * Load test cache from disk
12
+ */ async function loadTestCache(packageDir) {
13
+ const cachePath = path__default.join(packageDir, TEST_CACHE_FILE);
14
+ try {
15
+ const content = await fs.readFile(cachePath, 'utf-8');
16
+ return JSON.parse(content);
17
+ } catch {
18
+ return {};
19
+ }
20
+ }
21
+ /**
22
+ * Save test cache to disk
23
+ */ async function saveTestCache(packageDir, cache) {
24
+ const cachePath = path__default.join(packageDir, TEST_CACHE_FILE);
25
+ try {
26
+ await fs.writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
27
+ } catch (error) {
28
+ logger.debug(`Failed to save test cache: ${error.message}`);
29
+ }
30
+ }
31
+ /**
32
+ * Get the current git commit hash
33
+ */ async function getCurrentCommitHash(packageDir) {
34
+ try {
35
+ const { stdout } = await runSecure('git', [
36
+ 'rev-parse',
37
+ 'HEAD'
38
+ ], {
39
+ cwd: packageDir
40
+ });
41
+ return stdout.trim();
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Check if source files have changed since the last test run
48
+ */ async function hasSourceFilesChanged(packageDir, lastCommitHash) {
49
+ if (!lastCommitHash) {
50
+ return {
51
+ changed: true,
52
+ reason: 'No previous test run recorded'
53
+ };
54
+ }
55
+ try {
56
+ // Get current commit hash
57
+ const currentCommitHash = await getCurrentCommitHash(packageDir);
58
+ if (!currentCommitHash) {
59
+ return {
60
+ changed: true,
61
+ reason: 'Not in a git repository'
62
+ };
63
+ }
64
+ // If commit hash changed, files definitely changed
65
+ if (currentCommitHash !== lastCommitHash) {
66
+ return {
67
+ changed: true,
68
+ reason: `Commit hash changed: ${lastCommitHash.substring(0, 7)} -> ${currentCommitHash.substring(0, 7)}`
69
+ };
70
+ }
71
+ // Check if there are any uncommitted changes to source files
72
+ const { stdout } = await runSecure('git', [
73
+ 'status',
74
+ '--porcelain'
75
+ ], {
76
+ cwd: packageDir
77
+ });
78
+ const changedFiles = stdout.split('\n').filter((line)=>line.trim()).map((line)=>line.substring(3).trim()).filter((file)=>{
79
+ // Only consider source files, not build artifacts or config files
80
+ const ext = path__default.extname(file);
81
+ return(// TypeScript/JavaScript source files
82
+ [
83
+ '.ts',
84
+ '.tsx',
85
+ '.js',
86
+ '.jsx'
87
+ ].includes(ext) || // Test files
88
+ file.includes('.test.') || file.includes('.spec.') || // Config files that affect build/test
89
+ [
90
+ 'tsconfig.json',
91
+ 'vite.config.ts',
92
+ 'vitest.config.ts',
93
+ 'package.json'
94
+ ].includes(path__default.basename(file)));
95
+ });
96
+ if (changedFiles.length > 0) {
97
+ return {
98
+ changed: true,
99
+ reason: `Uncommitted changes in: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? '...' : ''}`
100
+ };
101
+ }
102
+ return {
103
+ changed: false,
104
+ reason: 'No source file changes detected'
105
+ };
106
+ } catch (error) {
107
+ logger.debug(`Error checking for source file changes: ${error.message}`);
108
+ // Conservative: assume changed if we can't verify
109
+ return {
110
+ changed: true,
111
+ reason: `Could not verify changes: ${error.message}`
112
+ };
113
+ }
114
+ }
115
+ /**
116
+ * Check if dist directory needs to be cleaned (is outdated compared to source files)
117
+ */ async function isCleanNeeded(packageDir) {
118
+ const storage = createStorage();
119
+ const distPath = path__default.join(packageDir, 'dist');
120
+ try {
121
+ // Check if dist directory exists
122
+ const distExists = await storage.exists('dist');
123
+ if (!distExists) {
124
+ return {
125
+ needed: false,
126
+ reason: 'dist directory does not exist'
127
+ };
128
+ }
129
+ // Get dist directory modification time
130
+ const distStats = await fs.stat(distPath);
131
+ const distMtime = distStats.mtimeMs;
132
+ // Use git to find source files that are newer than dist
133
+ try {
134
+ // Get all tracked source files
135
+ const { stdout: trackedFiles } = await runSecure('git', [
136
+ 'ls-files'
137
+ ], {
138
+ cwd: packageDir
139
+ });
140
+ const files = trackedFiles.split('\n').filter(Boolean);
141
+ // Check if any source files are newer than dist
142
+ for (const file of files){
143
+ const ext = path__default.extname(file);
144
+ if (![
145
+ '.ts',
146
+ '.tsx',
147
+ '.js',
148
+ '.jsx',
149
+ '.json'
150
+ ].includes(ext)) {
151
+ continue;
152
+ }
153
+ // Skip dist files
154
+ if (file.startsWith('dist/')) {
155
+ continue;
156
+ }
157
+ try {
158
+ const filePath = path__default.join(packageDir, file);
159
+ const fileStats = await fs.stat(filePath);
160
+ if (fileStats.mtimeMs > distMtime) {
161
+ return {
162
+ needed: true,
163
+ reason: `${file} is newer than dist directory`
164
+ };
165
+ }
166
+ } catch {
167
+ continue;
168
+ }
169
+ }
170
+ return {
171
+ needed: false,
172
+ reason: 'dist directory is up to date with source files'
173
+ };
174
+ } catch (error) {
175
+ // If git check fails, fall back to checking common source directories
176
+ logger.debug(`Git-based check failed, using fallback: ${error.message}`);
177
+ const sourceDirs = [
178
+ 'src',
179
+ 'tests'
180
+ ];
181
+ for (const dir of sourceDirs){
182
+ const dirPath = path__default.join(packageDir, dir);
183
+ try {
184
+ const dirStats = await fs.stat(dirPath);
185
+ if (dirStats.mtimeMs > distMtime) {
186
+ return {
187
+ needed: true,
188
+ reason: `${dir} directory is newer than dist`
189
+ };
190
+ }
191
+ } catch {
192
+ continue;
193
+ }
194
+ }
195
+ // Conservative: if we can't verify, assume clean is needed
196
+ return {
197
+ needed: true,
198
+ reason: 'Could not verify dist freshness, cleaning to be safe'
199
+ };
200
+ }
201
+ } catch (error) {
202
+ logger.debug(`Error checking if clean is needed: ${error.message}`);
203
+ // Conservative: assume clean is needed if we can't check
204
+ return {
205
+ needed: true,
206
+ reason: `Could not verify: ${error.message}`
207
+ };
208
+ }
209
+ }
210
+ /**
211
+ * Check if tests need to be run (source files changed since last test run)
212
+ */ async function isTestNeeded(packageDir) {
213
+ try {
214
+ // Load test cache
215
+ const cache = await loadTestCache(packageDir);
216
+ const cacheKey = packageDir;
217
+ // Check if we have a cached test run for this package
218
+ const cached = cache[cacheKey];
219
+ if (!cached) {
220
+ return {
221
+ needed: true,
222
+ reason: 'No previous test run recorded'
223
+ };
224
+ }
225
+ // Check if source files have changed since last test run
226
+ const changeCheck = await hasSourceFilesChanged(packageDir, cached.lastCommitHash);
227
+ if (changeCheck.changed) {
228
+ return {
229
+ needed: true,
230
+ reason: changeCheck.reason
231
+ };
232
+ }
233
+ return {
234
+ needed: false,
235
+ reason: 'No source file changes since last test run'
236
+ };
237
+ } catch (error) {
238
+ logger.debug(`Error checking if test is needed: ${error.message}`);
239
+ // Conservative: assume test is needed if we can't check
240
+ return {
241
+ needed: true,
242
+ reason: `Could not verify: ${error.message}`
243
+ };
244
+ }
245
+ }
246
+ /**
247
+ * Record that tests were run for this package
248
+ */ async function recordTestRun(packageDir) {
249
+ try {
250
+ const cache = await loadTestCache(packageDir);
251
+ const cacheKey = packageDir;
252
+ const commitHash = await getCurrentCommitHash(packageDir);
253
+ cache[cacheKey] = {
254
+ lastTestRun: Date.now(),
255
+ lastCommitHash: commitHash || 'unknown'
256
+ };
257
+ await saveTestCache(packageDir, cache);
258
+ } catch (error) {
259
+ logger.debug(`Failed to record test run: ${error.message}`);
260
+ }
261
+ }
262
+ /**
263
+ * Optimize a precommit command by skipping unnecessary steps
264
+ * Returns the optimized command and information about what was skipped
265
+ */ async function optimizePrecommitCommand(packageDir, originalCommand, options = {}) {
266
+ const { skipClean = true, skipTest = true } = options;
267
+ // Parse the original command to extract individual scripts
268
+ // Common patterns: "npm run precommit", "npm run clean && npm run build && npm run lint && npm run test"
269
+ const isPrecommitScript = originalCommand.includes('precommit') || originalCommand.includes('pre-commit');
270
+ let optimizedCommand = originalCommand;
271
+ const skipped = {
272
+ clean: false,
273
+ test: false
274
+ };
275
+ const reasons = {};
276
+ // If it's a precommit script, we need to check what it actually runs
277
+ // For now, we'll optimize the common pattern: clean && build && lint && test
278
+ if (isPrecommitScript || originalCommand.includes('clean')) {
279
+ if (skipClean) {
280
+ const cleanCheck = await isCleanNeeded(packageDir);
281
+ if (!cleanCheck.needed) {
282
+ // Remove clean from the command
283
+ optimizedCommand = optimizedCommand.replace(/npm\s+run\s+clean\s+&&\s*/g, '').replace(/npm\s+run\s+clean\s+/g, '').replace(/\s*&&\s*npm\s+run\s+clean/g, '').trim();
284
+ skipped.clean = true;
285
+ reasons.clean = cleanCheck.reason;
286
+ }
287
+ }
288
+ }
289
+ if (isPrecommitScript || originalCommand.includes('test')) {
290
+ if (skipTest) {
291
+ const testCheck = await isTestNeeded(packageDir);
292
+ if (!testCheck.needed) {
293
+ // Remove test from the command
294
+ optimizedCommand = optimizedCommand.replace(/\s*&&\s*npm\s+run\s+test\s*/g, '').replace(/\s*&&\s*npm\s+run\s+test$/g, '').replace(/npm\s+run\s+test\s+&&\s*/g, '').trim();
295
+ skipped.test = true;
296
+ reasons.test = testCheck.reason;
297
+ }
298
+ }
299
+ }
300
+ // Clean up any double && or trailing &&
301
+ optimizedCommand = optimizedCommand.replace(/\s*&&\s*&&/g, ' && ').replace(/&&\s*$/, '').trim();
302
+ return {
303
+ optimizedCommand,
304
+ skipped,
305
+ reasons
306
+ };
307
+ }
308
+
309
+ export { isCleanNeeded, isTestNeeded, optimizePrecommitCommand, recordTestRun };
310
+ //# sourceMappingURL=precommitOptimizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precommitOptimizations.js","sources":["../../src/util/precommitOptimizations.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\nimport { getLogger } from '../logging';\nimport { runSecure } from '@eldrforge/git-tools';\nimport { createStorage } from '@eldrforge/shared';\n\nconst logger = getLogger();\n\n// Cache file to store test run timestamps per package\nconst TEST_CACHE_FILE = '.kodrdriv-test-cache.json';\n\ninterface TestCache {\n [packagePath: string]: {\n lastTestRun: number; // timestamp\n lastCommitHash: string; // git commit hash when tests last ran\n };\n}\n\n/**\n * Load test cache from disk\n */\nasync function loadTestCache(packageDir: string): Promise<TestCache> {\n const cachePath = path.join(packageDir, TEST_CACHE_FILE);\n try {\n const content = await fs.readFile(cachePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n}\n\n/**\n * Save test cache to disk\n */\nasync function saveTestCache(packageDir: string, cache: TestCache): Promise<void> {\n const cachePath = path.join(packageDir, TEST_CACHE_FILE);\n try {\n await fs.writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');\n } catch (error: any) {\n logger.debug(`Failed to save test cache: ${error.message}`);\n }\n}\n\n/**\n * Get the current git commit hash\n */\nasync function getCurrentCommitHash(packageDir: string): Promise<string | null> {\n try {\n const { stdout } = await runSecure('git', ['rev-parse', 'HEAD'], { cwd: packageDir });\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Check if source files have changed since the last test run\n */\nasync function hasSourceFilesChanged(\n packageDir: string,\n lastCommitHash: string | null\n): Promise<{ changed: boolean; reason: string }> {\n if (!lastCommitHash) {\n return { changed: true, reason: 'No previous test run recorded' };\n }\n\n try {\n // Get current commit hash\n const currentCommitHash = await getCurrentCommitHash(packageDir);\n if (!currentCommitHash) {\n return { changed: true, reason: 'Not in a git repository' };\n }\n\n // If commit hash changed, files definitely changed\n if (currentCommitHash !== lastCommitHash) {\n return { changed: true, reason: `Commit hash changed: ${lastCommitHash.substring(0, 7)} -> ${currentCommitHash.substring(0, 7)}` };\n }\n\n // Check if there are any uncommitted changes to source files\n const { stdout } = await runSecure('git', ['status', '--porcelain'], { cwd: packageDir });\n const changedFiles = stdout.split('\\n')\n .filter(line => line.trim())\n .map(line => line.substring(3).trim())\n .filter(file => {\n // Only consider source files, not build artifacts or config files\n const ext = path.extname(file);\n return (\n // TypeScript/JavaScript source files\n ['.ts', '.tsx', '.js', '.jsx'].includes(ext) ||\n // Test files\n file.includes('.test.') || file.includes('.spec.') ||\n // Config files that affect build/test\n ['tsconfig.json', 'vite.config.ts', 'vitest.config.ts', 'package.json'].includes(path.basename(file))\n );\n });\n\n if (changedFiles.length > 0) {\n return { changed: true, reason: `Uncommitted changes in: ${changedFiles.slice(0, 3).join(', ')}${changedFiles.length > 3 ? '...' : ''}` };\n }\n\n return { changed: false, reason: 'No source file changes detected' };\n } catch (error: any) {\n logger.debug(`Error checking for source file changes: ${error.message}`);\n // Conservative: assume changed if we can't verify\n return { changed: true, reason: `Could not verify changes: ${error.message}` };\n }\n}\n\n/**\n * Check if dist directory needs to be cleaned (is outdated compared to source files)\n */\nexport async function isCleanNeeded(packageDir: string): Promise<{ needed: boolean; reason: string }> {\n const storage = createStorage();\n const distPath = path.join(packageDir, 'dist');\n\n try {\n // Check if dist directory exists\n const distExists = await storage.exists('dist');\n if (!distExists) {\n return { needed: false, reason: 'dist directory does not exist' };\n }\n\n // Get dist directory modification time\n const distStats = await fs.stat(distPath);\n const distMtime = distStats.mtimeMs;\n\n // Use git to find source files that are newer than dist\n try {\n // Get all tracked source files\n const { stdout: trackedFiles } = await runSecure('git', ['ls-files'], { cwd: packageDir });\n const files = trackedFiles.split('\\n').filter(Boolean);\n\n // Check if any source files are newer than dist\n for (const file of files) {\n const ext = path.extname(file);\n if (!['.ts', '.tsx', '.js', '.jsx', '.json'].includes(ext)) {\n continue;\n }\n\n // Skip dist files\n if (file.startsWith('dist/')) {\n continue;\n }\n\n try {\n const filePath = path.join(packageDir, file);\n const fileStats = await fs.stat(filePath);\n if (fileStats.mtimeMs > distMtime) {\n return { needed: true, reason: `${file} is newer than dist directory` };\n }\n } catch {\n // File might not exist or be inaccessible, skip it\n continue;\n }\n }\n\n return { needed: false, reason: 'dist directory is up to date with source files' };\n } catch (error: any) {\n // If git check fails, fall back to checking common source directories\n logger.debug(`Git-based check failed, using fallback: ${error.message}`);\n\n const sourceDirs = ['src', 'tests'];\n for (const dir of sourceDirs) {\n const dirPath = path.join(packageDir, dir);\n try {\n const dirStats = await fs.stat(dirPath);\n if (dirStats.mtimeMs > distMtime) {\n return { needed: true, reason: `${dir} directory is newer than dist` };\n }\n } catch {\n // Directory doesn't exist, skip it\n continue;\n }\n }\n\n // Conservative: if we can't verify, assume clean is needed\n return { needed: true, reason: 'Could not verify dist freshness, cleaning to be safe' };\n }\n } catch (error: any) {\n logger.debug(`Error checking if clean is needed: ${error.message}`);\n // Conservative: assume clean is needed if we can't check\n return { needed: true, reason: `Could not verify: ${error.message}` };\n }\n}\n\n/**\n * Check if tests need to be run (source files changed since last test run)\n */\nexport async function isTestNeeded(packageDir: string): Promise<{ needed: boolean; reason: string }> {\n try {\n // Load test cache\n const cache = await loadTestCache(packageDir);\n const cacheKey = packageDir;\n\n // Check if we have a cached test run for this package\n const cached = cache[cacheKey];\n if (!cached) {\n return { needed: true, reason: 'No previous test run recorded' };\n }\n\n // Check if source files have changed since last test run\n const changeCheck = await hasSourceFilesChanged(packageDir, cached.lastCommitHash);\n if (changeCheck.changed) {\n return { needed: true, reason: changeCheck.reason };\n }\n\n return { needed: false, reason: 'No source file changes since last test run' };\n } catch (error: any) {\n logger.debug(`Error checking if test is needed: ${error.message}`);\n // Conservative: assume test is needed if we can't check\n return { needed: true, reason: `Could not verify: ${error.message}` };\n }\n}\n\n/**\n * Record that tests were run for this package\n */\nexport async function recordTestRun(packageDir: string): Promise<void> {\n try {\n const cache = await loadTestCache(packageDir);\n const cacheKey = packageDir;\n const commitHash = await getCurrentCommitHash(packageDir);\n\n cache[cacheKey] = {\n lastTestRun: Date.now(),\n lastCommitHash: commitHash || 'unknown'\n };\n\n await saveTestCache(packageDir, cache);\n } catch (error: any) {\n logger.debug(`Failed to record test run: ${error.message}`);\n }\n}\n\n/**\n * Optimize a precommit command by skipping unnecessary steps\n * Returns the optimized command and information about what was skipped\n */\nexport async function optimizePrecommitCommand(\n packageDir: string,\n originalCommand: string,\n options: { skipClean?: boolean; skipTest?: boolean } = {}\n): Promise<{\n optimizedCommand: string;\n skipped: {\n clean: boolean;\n test: boolean;\n };\n reasons: {\n clean?: string;\n test?: string;\n };\n}> {\n const { skipClean = true, skipTest = true } = options;\n\n // Parse the original command to extract individual scripts\n // Common patterns: \"npm run precommit\", \"npm run clean && npm run build && npm run lint && npm run test\"\n const isPrecommitScript = originalCommand.includes('precommit') || originalCommand.includes('pre-commit');\n\n let optimizedCommand = originalCommand;\n const skipped = { clean: false, test: false };\n const reasons: { clean?: string; test?: string } = {};\n\n // If it's a precommit script, we need to check what it actually runs\n // For now, we'll optimize the common pattern: clean && build && lint && test\n if (isPrecommitScript || originalCommand.includes('clean')) {\n if (skipClean) {\n const cleanCheck = await isCleanNeeded(packageDir);\n if (!cleanCheck.needed) {\n // Remove clean from the command\n optimizedCommand = optimizedCommand\n .replace(/npm\\s+run\\s+clean\\s+&&\\s*/g, '')\n .replace(/npm\\s+run\\s+clean\\s+/g, '')\n .replace(/\\s*&&\\s*npm\\s+run\\s+clean/g, '')\n .trim();\n skipped.clean = true;\n reasons.clean = cleanCheck.reason;\n }\n }\n }\n\n if (isPrecommitScript || originalCommand.includes('test')) {\n if (skipTest) {\n const testCheck = await isTestNeeded(packageDir);\n if (!testCheck.needed) {\n // Remove test from the command\n optimizedCommand = optimizedCommand\n .replace(/\\s*&&\\s*npm\\s+run\\s+test\\s*/g, '')\n .replace(/\\s*&&\\s*npm\\s+run\\s+test$/g, '')\n .replace(/npm\\s+run\\s+test\\s+&&\\s*/g, '')\n .trim();\n skipped.test = true;\n reasons.test = testCheck.reason;\n }\n }\n }\n\n // Clean up any double && or trailing &&\n optimizedCommand = optimizedCommand.replace(/\\s*&&\\s*&&/g, ' && ').replace(/&&\\s*$/, '').trim();\n\n return { optimizedCommand, skipped, reasons };\n}\n\n"],"names":["logger","getLogger","TEST_CACHE_FILE","loadTestCache","packageDir","cachePath","path","join","content","fs","readFile","JSON","parse","saveTestCache","cache","writeFile","stringify","error","debug","message","getCurrentCommitHash","stdout","runSecure","cwd","trim","hasSourceFilesChanged","lastCommitHash","changed","reason","currentCommitHash","substring","changedFiles","split","filter","line","map","file","ext","extname","includes","basename","length","slice","isCleanNeeded","storage","createStorage","distPath","distExists","exists","needed","distStats","stat","distMtime","mtimeMs","trackedFiles","files","Boolean","startsWith","filePath","fileStats","sourceDirs","dir","dirPath","dirStats","isTestNeeded","cacheKey","cached","changeCheck","recordTestRun","commitHash","lastTestRun","Date","now","optimizePrecommitCommand","originalCommand","options","skipClean","skipTest","isPrecommitScript","optimizedCommand","skipped","clean","test","reasons","cleanCheck","replace","testCheck"],"mappings":";;;;;;AAMA,MAAMA,MAAAA,GAASC,SAAAA,EAAAA;AAEf;AACA,MAAMC,eAAAA,GAAkB,2BAAA;AASxB;;IAGA,eAAeC,cAAcC,UAAkB,EAAA;AAC3C,IAAA,MAAMC,SAAAA,GAAYC,aAAAA,CAAKC,IAAI,CAACH,UAAAA,EAAYF,eAAAA,CAAAA;IACxC,IAAI;AACA,QAAA,MAAMM,OAAAA,GAAU,MAAMC,EAAAA,CAAGC,QAAQ,CAACL,SAAAA,EAAW,OAAA,CAAA;QAC7C,OAAOM,IAAAA,CAAKC,KAAK,CAACJ,OAAAA,CAAAA;AACtB,IAAA,CAAA,CAAE,OAAM;AACJ,QAAA,OAAO,EAAC;AACZ,IAAA;AACJ;AAEA;;AAEC,IACD,eAAeK,aAAAA,CAAcT,UAAkB,EAAEU,KAAgB,EAAA;AAC7D,IAAA,MAAMT,SAAAA,GAAYC,aAAAA,CAAKC,IAAI,CAACH,UAAAA,EAAYF,eAAAA,CAAAA;IACxC,IAAI;QACA,MAAMO,EAAAA,CAAGM,SAAS,CAACV,SAAAA,EAAWM,KAAKK,SAAS,CAACF,KAAAA,EAAO,IAAA,EAAM,CAAA,CAAA,EAAI,OAAA,CAAA;AAClE,IAAA,CAAA,CAAE,OAAOG,KAAAA,EAAY;AACjBjB,QAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,2BAA2B,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC9D,IAAA;AACJ;AAEA;;IAGA,eAAeC,qBAAqBhB,UAAkB,EAAA;IAClD,IAAI;AACA,QAAA,MAAM,EAAEiB,MAAM,EAAE,GAAG,MAAMC,UAAU,KAAA,EAAO;AAAC,YAAA,WAAA;AAAa,YAAA;SAAO,EAAE;YAAEC,GAAAA,EAAKnB;AAAW,SAAA,CAAA;AACnF,QAAA,OAAOiB,OAAOG,IAAI,EAAA;AACtB,IAAA,CAAA,CAAE,OAAM;QACJ,OAAO,IAAA;AACX,IAAA;AACJ;AAEA;;AAEC,IACD,eAAeC,qBAAAA,CACXrB,UAAkB,EAClBsB,cAA6B,EAAA;AAE7B,IAAA,IAAI,CAACA,cAAAA,EAAgB;QACjB,OAAO;YAAEC,OAAAA,EAAS,IAAA;YAAMC,MAAAA,EAAQ;AAAgC,SAAA;AACpE,IAAA;IAEA,IAAI;;QAEA,MAAMC,iBAAAA,GAAoB,MAAMT,oBAAAA,CAAqBhB,UAAAA,CAAAA;AACrD,QAAA,IAAI,CAACyB,iBAAAA,EAAmB;YACpB,OAAO;gBAAEF,OAAAA,EAAS,IAAA;gBAAMC,MAAAA,EAAQ;AAA0B,aAAA;AAC9D,QAAA;;AAGA,QAAA,IAAIC,sBAAsBH,cAAAA,EAAgB;YACtC,OAAO;gBAAEC,OAAAA,EAAS,IAAA;AAAMC,gBAAAA,MAAAA,EAAQ,CAAC,qBAAqB,EAAEF,cAAAA,CAAeI,SAAS,CAAC,CAAA,EAAG,CAAA,CAAA,CAAG,IAAI,EAAED,iBAAAA,CAAkBC,SAAS,CAAC,GAAG,CAAA,CAAA,CAAA;AAAK,aAAA;AACrI,QAAA;;AAGA,QAAA,MAAM,EAAET,MAAM,EAAE,GAAG,MAAMC,UAAU,KAAA,EAAO;AAAC,YAAA,QAAA;AAAU,YAAA;SAAc,EAAE;YAAEC,GAAAA,EAAKnB;AAAW,SAAA,CAAA;QACvF,MAAM2B,YAAAA,GAAeV,MAAAA,CAAOW,KAAK,CAAC,IAAA,CAAA,CAC7BC,MAAM,CAACC,CAAAA,IAAAA,GAAQA,IAAAA,CAAKV,IAAI,EAAA,CAAA,CACxBW,GAAG,CAACD,CAAAA,IAAAA,GAAQA,IAAAA,CAAKJ,SAAS,CAAC,GAAGN,IAAI,EAAA,CAAA,CAClCS,MAAM,CAACG,CAAAA,IAAAA,GAAAA;;YAEJ,MAAMC,GAAAA,GAAM/B,aAAAA,CAAKgC,OAAO,CAACF,IAAAA,CAAAA;AACzB,YAAA;AAEI,YAAA;AAAC,gBAAA,KAAA;AAAO,gBAAA,MAAA;AAAQ,gBAAA,KAAA;AAAO,gBAAA;aAAO,CAACG,QAAQ,CAACF,GAAAA,CAAAA;AAExCD,YAAAA,IAAAA,CAAKG,QAAQ,CAAC,QAAA,CAAA,IAAaH,KAAKG,QAAQ,CAAC;AAEzC,YAAA;AAAC,gBAAA,eAAA;AAAiB,gBAAA,gBAAA;AAAkB,gBAAA,kBAAA;AAAoB,gBAAA;AAAe,aAAA,CAACA,QAAQ,CAACjC,aAAAA,CAAKkC,QAAQ,CAACJ,IAAAA,CAAAA,CAAAA;AAEvG,QAAA,CAAA,CAAA;QAEJ,IAAIL,YAAAA,CAAaU,MAAM,GAAG,CAAA,EAAG;YACzB,OAAO;gBAAEd,OAAAA,EAAS,IAAA;AAAMC,gBAAAA,MAAAA,EAAQ,CAAC,wBAAwB,EAAEG,YAAAA,CAAaW,KAAK,CAAC,CAAA,EAAG,CAAA,CAAA,CAAGnC,IAAI,CAAC,QAAQwB,YAAAA,CAAaU,MAAM,GAAG,CAAA,GAAI,QAAQ,EAAA,CAAA;AAAK,aAAA;AAC5I,QAAA;QAEA,OAAO;YAAEd,OAAAA,EAAS,KAAA;YAAOC,MAAAA,EAAQ;AAAkC,SAAA;AACvE,IAAA,CAAA,CAAE,OAAOX,KAAAA,EAAY;AACjBjB,QAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,wCAAwC,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;;QAEvE,OAAO;YAAEQ,OAAAA,EAAS,IAAA;AAAMC,YAAAA,MAAAA,EAAQ,CAAC,0BAA0B,EAAEX,KAAAA,CAAME,OAAO,CAAA;AAAG,SAAA;AACjF,IAAA;AACJ;AAEA;;IAGO,eAAewB,aAAAA,CAAcvC,UAAkB,EAAA;AAClD,IAAA,MAAMwC,OAAAA,GAAUC,aAAAA,EAAAA;AAChB,IAAA,MAAMC,QAAAA,GAAWxC,aAAAA,CAAKC,IAAI,CAACH,UAAAA,EAAY,MAAA,CAAA;IAEvC,IAAI;;AAEA,QAAA,MAAM2C,UAAAA,GAAa,MAAMH,OAAAA,CAAQI,MAAM,CAAC,MAAA,CAAA;AACxC,QAAA,IAAI,CAACD,UAAAA,EAAY;YACb,OAAO;gBAAEE,MAAAA,EAAQ,KAAA;gBAAOrB,MAAAA,EAAQ;AAAgC,aAAA;AACpE,QAAA;;AAGA,QAAA,MAAMsB,SAAAA,GAAY,MAAMzC,EAAAA,CAAG0C,IAAI,CAACL,QAAAA,CAAAA;QAChC,MAAMM,SAAAA,GAAYF,UAAUG,OAAO;;QAGnC,IAAI;;AAEA,YAAA,MAAM,EAAEhC,MAAAA,EAAQiC,YAAY,EAAE,GAAG,MAAMhC,UAAU,KAAA,EAAO;AAAC,gBAAA;aAAW,EAAE;gBAAEC,GAAAA,EAAKnB;AAAW,aAAA,CAAA;AACxF,YAAA,MAAMmD,QAAQD,YAAAA,CAAatB,KAAK,CAAC,IAAA,CAAA,CAAMC,MAAM,CAACuB,OAAAA,CAAAA;;YAG9C,KAAK,MAAMpB,QAAQmB,KAAAA,CAAO;gBACtB,MAAMlB,GAAAA,GAAM/B,aAAAA,CAAKgC,OAAO,CAACF,IAAAA,CAAAA;AACzB,gBAAA,IAAI,CAAC;AAAC,oBAAA,KAAA;AAAO,oBAAA,MAAA;AAAQ,oBAAA,KAAA;AAAO,oBAAA,MAAA;AAAQ,oBAAA;iBAAQ,CAACG,QAAQ,CAACF,GAAAA,CAAAA,EAAM;AACxD,oBAAA;AACJ,gBAAA;;gBAGA,IAAID,IAAAA,CAAKqB,UAAU,CAAC,OAAA,CAAA,EAAU;AAC1B,oBAAA;AACJ,gBAAA;gBAEA,IAAI;AACA,oBAAA,MAAMC,QAAAA,GAAWpD,aAAAA,CAAKC,IAAI,CAACH,UAAAA,EAAYgC,IAAAA,CAAAA;AACvC,oBAAA,MAAMuB,SAAAA,GAAY,MAAMlD,EAAAA,CAAG0C,IAAI,CAACO,QAAAA,CAAAA;oBAChC,IAAIC,SAAAA,CAAUN,OAAO,GAAGD,SAAAA,EAAW;wBAC/B,OAAO;4BAAEH,MAAAA,EAAQ,IAAA;4BAAMrB,MAAAA,EAAQ,CAAA,EAAGQ,IAAAA,CAAK,6BAA6B;AAAE,yBAAA;AAC1E,oBAAA;AACJ,gBAAA,CAAA,CAAE,OAAM;AAEJ,oBAAA;AACJ,gBAAA;AACJ,YAAA;YAEA,OAAO;gBAAEa,MAAAA,EAAQ,KAAA;gBAAOrB,MAAAA,EAAQ;AAAiD,aAAA;AACrF,QAAA,CAAA,CAAE,OAAOX,KAAAA,EAAY;;AAEjBjB,YAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,wCAAwC,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAEvE,YAAA,MAAMyC,UAAAA,GAAa;AAAC,gBAAA,KAAA;AAAO,gBAAA;AAAQ,aAAA;YACnC,KAAK,MAAMC,OAAOD,UAAAA,CAAY;AAC1B,gBAAA,MAAME,OAAAA,GAAUxD,aAAAA,CAAKC,IAAI,CAACH,UAAAA,EAAYyD,GAAAA,CAAAA;gBACtC,IAAI;AACA,oBAAA,MAAME,QAAAA,GAAW,MAAMtD,EAAAA,CAAG0C,IAAI,CAACW,OAAAA,CAAAA;oBAC/B,IAAIC,QAAAA,CAASV,OAAO,GAAGD,SAAAA,EAAW;wBAC9B,OAAO;4BAAEH,MAAAA,EAAQ,IAAA;4BAAMrB,MAAAA,EAAQ,CAAA,EAAGiC,GAAAA,CAAI,6BAA6B;AAAE,yBAAA;AACzE,oBAAA;AACJ,gBAAA,CAAA,CAAE,OAAM;AAEJ,oBAAA;AACJ,gBAAA;AACJ,YAAA;;YAGA,OAAO;gBAAEZ,MAAAA,EAAQ,IAAA;gBAAMrB,MAAAA,EAAQ;AAAuD,aAAA;AAC1F,QAAA;AACJ,IAAA,CAAA,CAAE,OAAOX,KAAAA,EAAY;AACjBjB,QAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,mCAAmC,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;;QAElE,OAAO;YAAE8B,MAAAA,EAAQ,IAAA;AAAMrB,YAAAA,MAAAA,EAAQ,CAAC,kBAAkB,EAAEX,KAAAA,CAAME,OAAO,CAAA;AAAG,SAAA;AACxE,IAAA;AACJ;AAEA;;IAGO,eAAe6C,YAAAA,CAAa5D,UAAkB,EAAA;IACjD,IAAI;;QAEA,MAAMU,KAAAA,GAAQ,MAAMX,aAAAA,CAAcC,UAAAA,CAAAA;AAClC,QAAA,MAAM6D,QAAAA,GAAW7D,UAAAA;;QAGjB,MAAM8D,MAAAA,GAASpD,KAAK,CAACmD,QAAAA,CAAS;AAC9B,QAAA,IAAI,CAACC,MAAAA,EAAQ;YACT,OAAO;gBAAEjB,MAAAA,EAAQ,IAAA;gBAAMrB,MAAAA,EAAQ;AAAgC,aAAA;AACnE,QAAA;;AAGA,QAAA,MAAMuC,WAAAA,GAAc,MAAM1C,qBAAAA,CAAsBrB,UAAAA,EAAY8D,OAAOxC,cAAc,CAAA;QACjF,IAAIyC,WAAAA,CAAYxC,OAAO,EAAE;YACrB,OAAO;gBAAEsB,MAAAA,EAAQ,IAAA;AAAMrB,gBAAAA,MAAAA,EAAQuC,YAAYvC;AAAO,aAAA;AACtD,QAAA;QAEA,OAAO;YAAEqB,MAAAA,EAAQ,KAAA;YAAOrB,MAAAA,EAAQ;AAA6C,SAAA;AACjF,IAAA,CAAA,CAAE,OAAOX,KAAAA,EAAY;AACjBjB,QAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,kCAAkC,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;;QAEjE,OAAO;YAAE8B,MAAAA,EAAQ,IAAA;AAAMrB,YAAAA,MAAAA,EAAQ,CAAC,kBAAkB,EAAEX,KAAAA,CAAME,OAAO,CAAA;AAAG,SAAA;AACxE,IAAA;AACJ;AAEA;;IAGO,eAAeiD,aAAAA,CAAchE,UAAkB,EAAA;IAClD,IAAI;QACA,MAAMU,KAAAA,GAAQ,MAAMX,aAAAA,CAAcC,UAAAA,CAAAA;AAClC,QAAA,MAAM6D,QAAAA,GAAW7D,UAAAA;QACjB,MAAMiE,UAAAA,GAAa,MAAMjD,oBAAAA,CAAqBhB,UAAAA,CAAAA;QAE9CU,KAAK,CAACmD,SAAS,GAAG;AACdK,YAAAA,WAAAA,EAAaC,KAAKC,GAAG,EAAA;AACrB9C,YAAAA,cAAAA,EAAgB2C,UAAAA,IAAc;AAClC,SAAA;AAEA,QAAA,MAAMxD,cAAcT,UAAAA,EAAYU,KAAAA,CAAAA;AACpC,IAAA,CAAA,CAAE,OAAOG,KAAAA,EAAY;AACjBjB,QAAAA,MAAAA,CAAOkB,KAAK,CAAC,CAAC,2BAA2B,EAAED,KAAAA,CAAME,OAAO,CAAA,CAAE,CAAA;AAC9D,IAAA;AACJ;AAEA;;;IAIO,eAAesD,wBAAAA,CAClBrE,UAAkB,EAClBsE,eAAuB,EACvBC,OAAAA,GAAuD,EAAE,EAAA;AAYzD,IAAA,MAAM,EAAEC,SAAAA,GAAY,IAAI,EAAEC,QAAAA,GAAW,IAAI,EAAE,GAAGF,OAAAA;;;AAI9C,IAAA,MAAMG,oBAAoBJ,eAAAA,CAAgBnC,QAAQ,CAAC,WAAA,CAAA,IAAgBmC,eAAAA,CAAgBnC,QAAQ,CAAC,YAAA,CAAA;AAE5F,IAAA,IAAIwC,gBAAAA,GAAmBL,eAAAA;AACvB,IAAA,MAAMM,OAAAA,GAAU;QAAEC,KAAAA,EAAO,KAAA;QAAOC,IAAAA,EAAM;AAAM,KAAA;AAC5C,IAAA,MAAMC,UAA6C,EAAC;;;AAIpD,IAAA,IAAIL,iBAAAA,IAAqBJ,eAAAA,CAAgBnC,QAAQ,CAAC,OAAA,CAAA,EAAU;AACxD,QAAA,IAAIqC,SAAAA,EAAW;YACX,MAAMQ,UAAAA,GAAa,MAAMzC,aAAAA,CAAcvC,UAAAA,CAAAA;YACvC,IAAI,CAACgF,UAAAA,CAAWnC,MAAM,EAAE;;AAEpB8B,gBAAAA,gBAAAA,GAAmBA,gBAAAA,CACdM,OAAO,CAAC,4BAAA,EAA8B,EAAA,CAAA,CACtCA,OAAO,CAAC,uBAAA,EAAyB,EAAA,CAAA,CACjCA,OAAO,CAAC,4BAAA,EAA8B,IACtC7D,IAAI,EAAA;AACTwD,gBAAAA,OAAAA,CAAQC,KAAK,GAAG,IAAA;gBAChBE,OAAAA,CAAQF,KAAK,GAAGG,UAAAA,CAAWxD,MAAM;AACrC,YAAA;AACJ,QAAA;AACJ,IAAA;AAEA,IAAA,IAAIkD,iBAAAA,IAAqBJ,eAAAA,CAAgBnC,QAAQ,CAAC,MAAA,CAAA,EAAS;AACvD,QAAA,IAAIsC,QAAAA,EAAU;YACV,MAAMS,SAAAA,GAAY,MAAMtB,YAAAA,CAAa5D,UAAAA,CAAAA;YACrC,IAAI,CAACkF,SAAAA,CAAUrC,MAAM,EAAE;;AAEnB8B,gBAAAA,gBAAAA,GAAmBA,gBAAAA,CACdM,OAAO,CAAC,8BAAA,EAAgC,EAAA,CAAA,CACxCA,OAAO,CAAC,4BAAA,EAA8B,EAAA,CAAA,CACtCA,OAAO,CAAC,2BAAA,EAA6B,IACrC7D,IAAI,EAAA;AACTwD,gBAAAA,OAAAA,CAAQE,IAAI,GAAG,IAAA;gBACfC,OAAAA,CAAQD,IAAI,GAAGI,SAAAA,CAAU1D,MAAM;AACnC,YAAA;AACJ,QAAA;AACJ,IAAA;;IAGAmD,gBAAAA,GAAmBA,gBAAAA,CAAiBM,OAAO,CAAC,aAAA,EAAe,QAAQA,OAAO,CAAC,QAAA,EAAU,EAAA,CAAA,CAAI7D,IAAI,EAAA;IAE7F,OAAO;AAAEuD,QAAAA,gBAAAA;AAAkBC,QAAAA,OAAAA;AAASG,QAAAA;AAAQ,KAAA;AAChD;;;;"}
@@ -1,13 +1,9 @@
1
- import { create } from './storage.js';
2
- import { getLogger } from '../logging.js';
1
+ import { createStorage } from '@eldrforge/shared';
3
2
 
4
- const logger = getLogger();
5
3
  /**
6
4
  * Create a StorageAdapter implementation using kodrdriv Storage
7
5
  */ function createStorageAdapter() {
8
- const storage = create({
9
- log: logger.debug
10
- });
6
+ const storage = createStorage();
11
7
  return {
12
8
  async writeOutput (fileName, content) {
13
9
  await storage.writeFile(fileName, content, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"storageAdapter.js","sources":["../../src/util/storageAdapter.ts"],"sourcesContent":["/**\n * Adapter for ai-service StorageAdapter using kodrdriv Storage\n */\n\nimport type { StorageAdapter } from '@eldrforge/ai-service';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\n\nconst logger = getLogger();\n\n/**\n * Create a StorageAdapter implementation using kodrdriv Storage\n */\nexport function createStorageAdapter(): StorageAdapter {\n const storage = Storage.create({ log: logger.debug });\n\n return {\n async writeOutput(fileName: string, content: string): Promise<void> {\n await storage.writeFile(fileName, content, 'utf8');\n },\n\n async readTemp(fileName: string): Promise<string> {\n return await storage.readFile(fileName, 'utf8');\n },\n\n async writeTemp(fileName: string, content: string): Promise<void> {\n await storage.writeFile(fileName, content, 'utf8');\n },\n };\n}\n\n"],"names":["logger","getLogger","createStorageAdapter","storage","Storage","log","debug","writeOutput","fileName","content","writeFile","readTemp","readFile","writeTemp"],"mappings":";;;AAQA,MAAMA,MAAAA,GAASC,SAAAA,EAAAA;AAEf;;AAEC,IACM,SAASC,oBAAAA,GAAAA;IACZ,MAAMC,OAAAA,GAAUC,MAAc,CAAC;AAAEC,QAAAA,GAAAA,EAAKL,OAAOM;AAAM,KAAA,CAAA;IAEnD,OAAO;QACH,MAAMC,WAAAA,CAAAA,CAAYC,QAAgB,EAAEC,OAAe,EAAA;AAC/C,YAAA,MAAMN,OAAAA,CAAQO,SAAS,CAACF,QAAAA,EAAUC,OAAAA,EAAS,MAAA,CAAA;AAC/C,QAAA,CAAA;AAEA,QAAA,MAAME,UAASH,QAAgB,EAAA;AAC3B,YAAA,OAAO,MAAML,OAAAA,CAAQS,QAAQ,CAACJ,QAAAA,EAAU,MAAA,CAAA;AAC5C,QAAA,CAAA;QAEA,MAAMK,SAAAA,CAAAA,CAAUL,QAAgB,EAAEC,OAAe,EAAA;AAC7C,YAAA,MAAMN,OAAAA,CAAQO,SAAS,CAACF,QAAAA,EAAUC,OAAAA,EAAS,MAAA,CAAA;AAC/C,QAAA;AACJ,KAAA;AACJ;;;;"}
1
+ {"version":3,"file":"storageAdapter.js","sources":["../../src/util/storageAdapter.ts"],"sourcesContent":["/**\n * Adapter for ai-service StorageAdapter using kodrdriv Storage\n */\n\nimport type { StorageAdapter } from '@eldrforge/ai-service';\nimport { createStorage } from '@eldrforge/shared';\n\n/**\n * Create a StorageAdapter implementation using kodrdriv Storage\n */\nexport function createStorageAdapter(): StorageAdapter {\n const storage = createStorage();\n\n return {\n async writeOutput(fileName: string, content: string): Promise<void> {\n await storage.writeFile(fileName, content, 'utf8');\n },\n\n async readTemp(fileName: string): Promise<string> {\n return await storage.readFile(fileName, 'utf8');\n },\n\n async writeTemp(fileName: string, content: string): Promise<void> {\n await storage.writeFile(fileName, content, 'utf8');\n },\n };\n}\n\n"],"names":["createStorageAdapter","storage","createStorage","writeOutput","fileName","content","writeFile","readTemp","readFile","writeTemp"],"mappings":";;AAOA;;AAEC,IACM,SAASA,oBAAAA,GAAAA;AACZ,IAAA,MAAMC,OAAAA,GAAUC,aAAAA,EAAAA;IAEhB,OAAO;QACH,MAAMC,WAAAA,CAAAA,CAAYC,QAAgB,EAAEC,OAAe,EAAA;AAC/C,YAAA,MAAMJ,OAAAA,CAAQK,SAAS,CAACF,QAAAA,EAAUC,OAAAA,EAAS,MAAA,CAAA;AAC/C,QAAA,CAAA;AAEA,QAAA,MAAME,UAASH,QAAgB,EAAA;AAC3B,YAAA,OAAO,MAAMH,OAAAA,CAAQO,QAAQ,CAACJ,QAAAA,EAAU,MAAA,CAAA;AAC5C,QAAA,CAAA;QAEA,MAAMK,SAAAA,CAAAA,CAAUL,QAAgB,EAAEC,OAAe,EAAA;AAC7C,YAAA,MAAMJ,OAAAA,CAAQK,SAAS,CAACF,QAAAA,EAAUC,OAAAA,EAAS,MAAA,CAAA;AAC/C,QAAA;AACJ,KAAA;AACJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Runtime validation utilities for safe type handling
2
+ * Kodrdriv-specific validation utilities
3
3
  *
4
- * Note: Generic validation functions (safeJsonParse, validateString, etc.)
5
- * have been moved to @eldrforge/git-tools
4
+ * Note: Generic validation functions (validateString, validateNumber, etc.)
5
+ * are in @eldrforge/shared
6
6
  */ /**
7
7
  * Validates and safely casts data to ReleaseSummary type
8
8
  */ const validateReleaseSummary = (data)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sources":["../../src/util/validation.ts"],"sourcesContent":["/**\n * Runtime validation utilities for safe type handling\n *\n * Note: Generic validation functions (safeJsonParse, validateString, etc.)\n * have been moved to @eldrforge/git-tools\n */\n\nexport interface ReleaseSummary {\n title: string;\n body: string;\n}\n\nexport interface TranscriptionResult {\n text: string;\n [key: string]: any;\n}\n\n/**\n * Validates and safely casts data to ReleaseSummary type\n */\nexport const validateReleaseSummary = (data: any): ReleaseSummary => {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid release summary: not an object');\n }\n if (typeof data.title !== 'string') {\n throw new Error('Invalid release summary: title must be a string');\n }\n if (typeof data.body !== 'string') {\n throw new Error('Invalid release summary: body must be a string');\n }\n return data as ReleaseSummary;\n};\n\n/**\n * Validates transcription result has required text property\n */\nexport const validateTranscriptionResult = (data: any): TranscriptionResult => {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid transcription result: not an object');\n }\n if (typeof data.text !== 'string') {\n throw new Error('Invalid transcription result: text property must be a string');\n }\n return data as TranscriptionResult;\n};\n\n/**\n * Sanitizes and truncates direction parameter for safe use in prompts\n * @param direction The direction string to sanitize\n * @param maxLength Maximum length before truncation (default: 2000)\n * @returns Sanitized and truncated direction string\n */\nexport const sanitizeDirection = (direction: string | undefined, maxLength: number = 2000): string | undefined => {\n if (!direction) {\n return undefined;\n }\n\n // Remove newlines and excessive whitespace to prevent template breakage\n const sanitized = direction\n .replace(/\\r?\\n/g, ' ') // Replace newlines with spaces\n .replace(/\\s+/g, ' ') // Replace multiple whitespace with single space\n .trim();\n\n // Truncate if too long\n if (sanitized.length > maxLength) {\n const truncated = sanitized.substring(0, maxLength - 3) + '...';\n // Log truncation for debugging\n // eslint-disable-next-line no-console\n console.warn(`Direction truncated from ${sanitized.length} to ${truncated.length} characters`);\n return truncated;\n }\n\n return sanitized;\n};\n"],"names":["validateReleaseSummary","data","Error","title","body","sanitizeDirection","direction","maxLength","undefined","sanitized","replace","trim","length","truncated","substring","console","warn"],"mappings":"AAAA;;;;;;;IAoBO,MAAMA,sBAAAA,GAAyB,CAACC,IAAAA,GAAAA;AACnC,IAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;AACnC,QAAA,MAAM,IAAIC,KAAAA,CAAM,wCAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAI,OAAOD,IAAAA,CAAKE,KAAK,KAAK,QAAA,EAAU;AAChC,QAAA,MAAM,IAAID,KAAAA,CAAM,iDAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAI,OAAOD,IAAAA,CAAKG,IAAI,KAAK,QAAA,EAAU;AAC/B,QAAA,MAAM,IAAIF,KAAAA,CAAM,gDAAA,CAAA;AACpB,IAAA;IACA,OAAOD,IAAAA;AACX;AAeA;;;;;AAKC,IACM,MAAMI,iBAAAA,GAAoB,CAACC,SAAAA,EAA+BC,YAAoB,IAAI,GAAA;AACrF,IAAA,IAAI,CAACD,SAAAA,EAAW;QACZ,OAAOE,SAAAA;AACX,IAAA;;AAGA,IAAA,MAAMC,YAAYH,SAAAA,CACbI,OAAO,CAAC,QAAA,EAAU;KAClBA,OAAO,CAAC,MAAA,EAAQ,GAAA,CAAA;KAChBC,IAAI,EAAA;;IAGT,IAAIF,SAAAA,CAAUG,MAAM,GAAGL,SAAAA,EAAW;AAC9B,QAAA,MAAMM,YAAYJ,SAAAA,CAAUK,SAAS,CAAC,CAAA,EAAGP,YAAY,CAAA,CAAA,GAAK,KAAA;;;AAG1DQ,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAC,yBAAyB,EAAEP,SAAAA,CAAUG,MAAM,CAAC,IAAI,EAAEC,SAAAA,CAAUD,MAAM,CAAC,WAAW,CAAC,CAAA;QAC7F,OAAOC,SAAAA;AACX,IAAA;IAEA,OAAOJ,SAAAA;AACX;;;;"}
1
+ {"version":3,"file":"validation.js","sources":["../../src/util/validation.ts"],"sourcesContent":["/**\n * Kodrdriv-specific validation utilities\n *\n * Note: Generic validation functions (validateString, validateNumber, etc.)\n * are in @eldrforge/shared\n */\n\nexport interface ReleaseSummary {\n title: string;\n body: string;\n}\n\nexport interface TranscriptionResult {\n text: string;\n [key: string]: any;\n}\n\n/**\n * Validates and safely casts data to ReleaseSummary type\n */\nexport const validateReleaseSummary = (data: any): ReleaseSummary => {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid release summary: not an object');\n }\n if (typeof data.title !== 'string') {\n throw new Error('Invalid release summary: title must be a string');\n }\n if (typeof data.body !== 'string') {\n throw new Error('Invalid release summary: body must be a string');\n }\n return data as ReleaseSummary;\n};\n\n/**\n * Validates transcription result has required text property\n */\nexport const validateTranscriptionResult = (data: any): TranscriptionResult => {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid transcription result: not an object');\n }\n if (typeof data.text !== 'string') {\n throw new Error('Invalid transcription result: text property must be a string');\n }\n return data as TranscriptionResult;\n};\n\n/**\n * Sanitizes and truncates direction parameter for safe use in prompts\n * @param direction The direction string to sanitize\n * @param maxLength Maximum length before truncation (default: 2000)\n * @returns Sanitized and truncated direction string\n */\nexport const sanitizeDirection = (direction: string | undefined, maxLength: number = 2000): string | undefined => {\n if (!direction) {\n return undefined;\n }\n\n // Remove newlines and excessive whitespace to prevent template breakage\n const sanitized = direction\n .replace(/\\r?\\n/g, ' ') // Replace newlines with spaces\n .replace(/\\s+/g, ' ') // Replace multiple whitespace with single space\n .trim();\n\n // Truncate if too long\n if (sanitized.length > maxLength) {\n const truncated = sanitized.substring(0, maxLength - 3) + '...';\n // Log truncation for debugging\n // eslint-disable-next-line no-console\n console.warn(`Direction truncated from ${sanitized.length} to ${truncated.length} characters`);\n return truncated;\n }\n\n return sanitized;\n};\n\n"],"names":["validateReleaseSummary","data","Error","title","body","sanitizeDirection","direction","maxLength","undefined","sanitized","replace","trim","length","truncated","substring","console","warn"],"mappings":"AAAA;;;;;;;IAoBO,MAAMA,sBAAAA,GAAyB,CAACC,IAAAA,GAAAA;AACnC,IAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;AACnC,QAAA,MAAM,IAAIC,KAAAA,CAAM,wCAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAI,OAAOD,IAAAA,CAAKE,KAAK,KAAK,QAAA,EAAU;AAChC,QAAA,MAAM,IAAID,KAAAA,CAAM,iDAAA,CAAA;AACpB,IAAA;AACA,IAAA,IAAI,OAAOD,IAAAA,CAAKG,IAAI,KAAK,QAAA,EAAU;AAC/B,QAAA,MAAM,IAAIF,KAAAA,CAAM,gDAAA,CAAA;AACpB,IAAA;IACA,OAAOD,IAAAA;AACX;AAeA;;;;;AAKC,IACM,MAAMI,iBAAAA,GAAoB,CAACC,SAAAA,EAA+BC,YAAoB,IAAI,GAAA;AACrF,IAAA,IAAI,CAACD,SAAAA,EAAW;QACZ,OAAOE,SAAAA;AACX,IAAA;;AAGA,IAAA,MAAMC,YAAYH,SAAAA,CACbI,OAAO,CAAC,QAAA,EAAU;KAClBA,OAAO,CAAC,MAAA,EAAQ,GAAA,CAAA;KAChBC,IAAI,EAAA;;IAGT,IAAIF,SAAAA,CAAUG,MAAM,GAAGL,SAAAA,EAAW;AAC9B,QAAA,MAAMM,YAAYJ,SAAAA,CAAUK,SAAS,CAAC,CAAA,EAAGP,YAAY,CAAA,CAAA,GAAK,KAAA;;;AAG1DQ,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAC,yBAAyB,EAAEP,SAAAA,CAAUG,MAAM,CAAC,IAAI,EAAEC,SAAAA,CAAUD,MAAM,CAAC,WAAW,CAAC,CAAA;QAC7F,OAAOC,SAAAA;AACX,IAAA;IAEA,OAAOJ,SAAAA;AACX;;;;"}