devmind 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +126 -162
  2. package/dist/cli/handlers.d.ts +2 -0
  3. package/dist/cli/handlers.js +140 -0
  4. package/dist/cli/handlers.js.map +1 -0
  5. package/dist/cli/register-all.d.ts +2 -0
  6. package/dist/cli/register-all.js +11 -0
  7. package/dist/cli/register-all.js.map +1 -0
  8. package/dist/cli/register-analysis.d.ts +2 -0
  9. package/dist/cli/register-analysis.js +137 -0
  10. package/dist/cli/register-analysis.js.map +1 -0
  11. package/dist/cli/register-codebase.d.ts +2 -0
  12. package/dist/cli/register-codebase.js +22 -0
  13. package/dist/cli/register-codebase.js.map +1 -0
  14. package/dist/cli/register-database.d.ts +2 -0
  15. package/dist/cli/register-database.js +44 -0
  16. package/dist/cli/register-database.js.map +1 -0
  17. package/dist/cli/register-memory.d.ts +2 -0
  18. package/dist/cli/register-memory.js +58 -0
  19. package/dist/cli/register-memory.js.map +1 -0
  20. package/dist/cli.js +9 -316
  21. package/dist/cli.js.map +1 -1
  22. package/dist/codebase/index.js +2 -2
  23. package/dist/codebase/index.js.map +1 -1
  24. package/dist/codebase/parsers/typescript.d.ts +1 -0
  25. package/dist/codebase/parsers/typescript.js +3 -0
  26. package/dist/codebase/parsers/typescript.js.map +1 -1
  27. package/dist/codebase/scanners/filesystem.d.ts +1 -0
  28. package/dist/codebase/scanners/filesystem.js +131 -4
  29. package/dist/codebase/scanners/filesystem.js.map +1 -1
  30. package/dist/commands/analyze.d.ts +1 -0
  31. package/dist/commands/analyze.js +166 -24
  32. package/dist/commands/analyze.js.map +1 -1
  33. package/dist/commands/audit-design.d.ts +8 -0
  34. package/dist/commands/audit-design.js +158 -0
  35. package/dist/commands/audit-design.js.map +1 -0
  36. package/dist/commands/audit-report.d.ts +18 -0
  37. package/dist/commands/audit-report.js +30 -0
  38. package/dist/commands/audit-report.js.map +1 -0
  39. package/dist/commands/audit-source.d.ts +21 -0
  40. package/dist/commands/audit-source.js +57 -0
  41. package/dist/commands/audit-source.js.map +1 -0
  42. package/dist/commands/audit.d.ts +1 -0
  43. package/dist/commands/audit.js +174 -73
  44. package/dist/commands/audit.js.map +1 -1
  45. package/dist/commands/claude-plugin.d.ts +8 -0
  46. package/dist/commands/claude-plugin.js +123 -0
  47. package/dist/commands/claude-plugin.js.map +1 -0
  48. package/dist/commands/codex-plugin.d.ts +9 -0
  49. package/dist/commands/codex-plugin.js +145 -0
  50. package/dist/commands/codex-plugin.js.map +1 -0
  51. package/dist/commands/context.js +66 -5
  52. package/dist/commands/context.js.map +1 -1
  53. package/dist/commands/design-system.d.ts +8 -0
  54. package/dist/commands/design-system.js +95 -0
  55. package/dist/commands/design-system.js.map +1 -0
  56. package/dist/commands/extract.d.ts +13 -0
  57. package/dist/commands/extract.js +79 -16
  58. package/dist/commands/extract.js.map +1 -1
  59. package/dist/commands/openclaw-plugin.d.ts +8 -0
  60. package/dist/commands/openclaw-plugin.js +103 -0
  61. package/dist/commands/openclaw-plugin.js.map +1 -0
  62. package/dist/commands/retrieve.d.ts +12 -0
  63. package/dist/commands/retrieve.js +230 -0
  64. package/dist/commands/retrieve.js.map +1 -0
  65. package/dist/commands/status.d.ts +1 -0
  66. package/dist/commands/status.js +54 -18
  67. package/dist/commands/status.js.map +1 -1
  68. package/dist/core/cache-json.d.ts +7 -0
  69. package/dist/core/cache-json.js +60 -0
  70. package/dist/core/cache-json.js.map +1 -0
  71. package/dist/core/errors.d.ts +2 -0
  72. package/dist/core/errors.js +49 -1
  73. package/dist/core/errors.js.map +1 -1
  74. package/dist/core/index.d.ts +4 -0
  75. package/dist/core/index.js +4 -0
  76. package/dist/core/index.js.map +1 -1
  77. package/dist/core/learning-parser.d.ts +6 -0
  78. package/dist/core/learning-parser.js +23 -0
  79. package/dist/core/learning-parser.js.map +1 -0
  80. package/dist/core/profile.d.ts +18 -0
  81. package/dist/core/profile.js +37 -0
  82. package/dist/core/profile.js.map +1 -0
  83. package/dist/core/source-file-cache.d.ts +13 -0
  84. package/dist/core/source-file-cache.js +85 -0
  85. package/dist/core/source-file-cache.js.map +1 -0
  86. package/dist/database/cli/register-all.d.ts +2 -0
  87. package/dist/database/cli/register-all.js +9 -0
  88. package/dist/database/cli/register-all.js.map +1 -0
  89. package/dist/database/cli/register-database.d.ts +2 -0
  90. package/dist/database/cli/register-database.js +44 -0
  91. package/dist/database/cli/register-database.js.map +1 -0
  92. package/dist/database/cli/register-interactive.d.ts +2 -0
  93. package/dist/database/cli/register-interactive.js +29 -0
  94. package/dist/database/cli/register-interactive.js.map +1 -0
  95. package/dist/database/cli/register-memory.d.ts +2 -0
  96. package/dist/database/cli/register-memory.js +47 -0
  97. package/dist/database/cli/register-memory.js.map +1 -0
  98. package/dist/database/cli.js +5 -112
  99. package/dist/database/cli.js.map +1 -1
  100. package/dist/database/commands/checkpoint.js +8 -10
  101. package/dist/database/commands/checkpoint.js.map +1 -1
  102. package/dist/database/commands/generate.js +6 -7
  103. package/dist/database/commands/generate.js.map +1 -1
  104. package/dist/database/commands/handoff.js +9 -8
  105. package/dist/database/commands/handoff.js.map +1 -1
  106. package/dist/database/commands/learn.d.ts +4 -0
  107. package/dist/database/commands/learn.js +245 -43
  108. package/dist/database/commands/learn.js.map +1 -1
  109. package/dist/database/commands/memory.js +1 -1
  110. package/dist/database/commands/validate.js +6 -4
  111. package/dist/database/commands/validate.js.map +1 -1
  112. package/dist/database/commands/watch.js +1 -1
  113. package/dist/database/commands/watch.js.map +1 -1
  114. package/dist/database/generators/templates.js +26 -26
  115. package/dist/database/generators/templates.js.map +1 -1
  116. package/dist/database/utils/json-output.d.ts +4 -0
  117. package/dist/database/utils/json-output.js +7 -0
  118. package/dist/database/utils/json-output.js.map +1 -1
  119. package/dist/generators/unified.d.ts +13 -0
  120. package/dist/generators/unified.js +390 -46
  121. package/dist/generators/unified.js.map +1 -1
  122. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
- import { glob } from 'glob';
4
- import { logger, readFileSafe } from '../core/index.js';
3
+ import * as fsPromises from 'fs/promises';
4
+ import { logger, readFileSafe, createProfiler, getSourceFilesWithCache } from '../core/index.js';
5
5
  function latestMtimeMs(paths) {
6
6
  let latest = null;
7
7
  for (const filePath of paths) {
@@ -14,26 +14,46 @@ function latestMtimeMs(paths) {
14
14
  }
15
15
  return latest;
16
16
  }
17
- async function getSourceLastModifiedMs(rootPath) {
18
- const files = await glob('**/*.{ts,tsx,js,jsx,py,go,java,rb,php,rs}', {
19
- cwd: rootPath,
17
+ async function getSourceLastModifiedMs(outputDir, rootPath, newerThanMs) {
18
+ const sourceList = await getSourceFilesWithCache({
19
+ outputDir,
20
+ rootPath,
21
+ includeGlob: '**/*.{ts,tsx,js,jsx,py,go,java,rb,php,rs}',
20
22
  ignore: ['node_modules/**', '.git/**', '.devmind/**', 'dist/**', 'build/**'],
21
- nodir: true,
22
23
  });
24
+ const files = sourceList.files;
25
+ if (files.length === 0)
26
+ return { latest: null, sourceListCacheHit: sourceList.cacheHit };
27
+ const maxConcurrency = 64;
28
+ const batches = [];
29
+ for (let i = 0; i < files.length; i += maxConcurrency) {
30
+ batches.push(files.slice(i, i + maxConcurrency));
31
+ }
23
32
  let latest = null;
24
- for (const relPath of files) {
25
- const fullPath = path.join(rootPath, relPath);
26
- try {
27
- const stat = fs.statSync(fullPath);
28
- if (latest === null || stat.mtimeMs > latest) {
29
- latest = stat.mtimeMs;
33
+ for (const batch of batches) {
34
+ const stats = await Promise.all(batch.map(async (relPath) => {
35
+ try {
36
+ const stat = await fsPromises.stat(path.join(rootPath, relPath));
37
+ return stat.mtimeMs;
38
+ }
39
+ catch {
40
+ return null;
30
41
  }
42
+ }));
43
+ let batchMax = null;
44
+ for (const mtime of stats) {
45
+ if (mtime === null)
46
+ continue;
47
+ if (batchMax === null || mtime > batchMax)
48
+ batchMax = mtime;
49
+ if (latest === null || mtime > latest)
50
+ latest = mtime;
31
51
  }
32
- catch {
33
- // Ignore files that disappeared during scan.
52
+ if (newerThanMs !== undefined && batchMax !== null && batchMax > newerThanMs) {
53
+ return { latest: batchMax, sourceListCacheHit: sourceList.cacheHit };
34
54
  }
35
55
  }
36
- return latest;
56
+ return { latest, sourceListCacheHit: sourceList.cacheHit };
37
57
  }
38
58
  async function getLastGeneratedTimestamp(contextIndexPath, contextFiles) {
39
59
  if (fs.existsSync(contextIndexPath)) {
@@ -64,6 +84,7 @@ function chooseRecommendation(files, stale) {
64
84
  return 'None (context is up to date)';
65
85
  }
66
86
  export async function status(options) {
87
+ const profiler = createProfiler(!!options.profile);
67
88
  const outputDir = options.output || '.devmind';
68
89
  const rootPath = path.resolve(options.path || '.');
69
90
  const agentsPath = path.join(outputDir, 'AGENTS.md');
@@ -77,8 +98,12 @@ export async function status(options) {
77
98
  overview: fs.existsSync(overviewPath),
78
99
  };
79
100
  const contextFiles = [agentsPath, indexPath, schemaPath, overviewPath];
80
- const generatedMs = await getLastGeneratedTimestamp(indexPath, contextFiles);
81
- const sourceMs = await getSourceLastModifiedMs(rootPath);
101
+ const generatedMs = await profiler.section('status.loadContextTimestamp', async () => getLastGeneratedTimestamp(indexPath, contextFiles));
102
+ const needsSourceScan = files.agents && files.index && generatedMs !== null;
103
+ const sourceScan = needsSourceScan
104
+ ? await profiler.section('status.scanSourceMtime', async () => getSourceLastModifiedMs(outputDir, rootPath, generatedMs || undefined))
105
+ : { latest: null, sourceListCacheHit: false };
106
+ const sourceMs = sourceScan.latest;
82
107
  const stale = !files.agents ||
83
108
  !files.index ||
84
109
  generatedMs === null ||
@@ -90,10 +115,12 @@ export async function status(options) {
90
115
  lastGeneratedAt: generatedMs ? new Date(generatedMs).toISOString() : null,
91
116
  stale,
92
117
  sourceLastModifiedAt: sourceMs ? new Date(sourceMs).toISOString() : null,
118
+ sourceListCacheHit: sourceScan.sourceListCacheHit,
93
119
  recommendedCommand: chooseRecommendation(files, stale),
94
120
  };
95
121
  if (options.json) {
96
- console.log(JSON.stringify(result, null, 2));
122
+ const profile = profiler.report();
123
+ console.log(JSON.stringify(profile ? { ...result, profile } : result, null, 2));
97
124
  return;
98
125
  }
99
126
  logger.info('DevMind Status');
@@ -108,5 +135,14 @@ export async function status(options) {
108
135
  logger.info(`Last source change: ${result.sourceLastModifiedAt || 'unknown'}`);
109
136
  logger.info(`Context freshness: ${result.stale ? 'stale' : 'fresh'}`);
110
137
  logger.info(`Recommended command: ${result.recommendedCommand}`);
138
+ logger.info(`Source list cache: ${sourceScan.sourceListCacheHit ? 'hit' : 'miss'}`);
139
+ const profile = profiler.report();
140
+ if (profile) {
141
+ logger.info('Performance Profile');
142
+ logger.info(`Total: ${profile.totalMs.toFixed(1)}ms`);
143
+ for (const step of profile.steps) {
144
+ logger.info(`- ${step.name}: ${step.ms.toFixed(1)}ms`);
145
+ }
146
+ }
111
147
  }
112
148
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface CacheWriteOptions {
2
+ compressAboveBytes?: number;
3
+ pretty?: boolean;
4
+ }
5
+ export declare function readCacheJson<T>(jsonPath: string): Promise<T | null>;
6
+ export declare function writeCacheJson(jsonPath: string, value: unknown, options?: CacheWriteOptions): Promise<void>;
7
+ export {};
@@ -0,0 +1,60 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { gzipSync, gunzipSync } from 'zlib';
4
+ import { ensureDir } from './fileio.js';
5
+ async function tryRead(filePath) {
6
+ try {
7
+ return await fs.readFile(filePath);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ async function atomicWrite(filePath, data) {
14
+ const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;
15
+ await fs.writeFile(tempPath, data);
16
+ try {
17
+ await fs.rm(filePath, { force: true });
18
+ }
19
+ catch {
20
+ // Best effort; rename below will still surface hard failures.
21
+ }
22
+ await fs.rename(tempPath, filePath);
23
+ }
24
+ export async function readCacheJson(jsonPath) {
25
+ const jsonBuf = await tryRead(jsonPath);
26
+ if (jsonBuf) {
27
+ try {
28
+ return JSON.parse(jsonBuf.toString('utf-8'));
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ const gzipBuf = await tryRead(`${jsonPath}.gz`);
35
+ if (!gzipBuf)
36
+ return null;
37
+ try {
38
+ const unzipped = gunzipSync(gzipBuf).toString('utf-8');
39
+ return JSON.parse(unzipped);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export async function writeCacheJson(jsonPath, value, options = {}) {
46
+ const pretty = options.pretty ?? false;
47
+ const compressAboveBytes = options.compressAboveBytes ?? 512 * 1024;
48
+ const content = pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value);
49
+ const buffer = Buffer.from(content, 'utf-8');
50
+ await ensureDir(path.dirname(jsonPath));
51
+ if (buffer.byteLength >= compressAboveBytes) {
52
+ const gzPath = `${jsonPath}.gz`;
53
+ await atomicWrite(gzPath, gzipSync(buffer));
54
+ await fs.rm(jsonPath, { force: true });
55
+ return;
56
+ }
57
+ await atomicWrite(jsonPath, buffer);
58
+ await fs.rm(`${jsonPath}.gz`, { force: true });
59
+ }
60
+ //# sourceMappingURL=cache-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-json.js","sourceRoot":"","sources":["../../src/core/cache-json.ts"],"names":[],"mappings":"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"}
@@ -16,3 +16,5 @@ export declare class ConfigError extends DevMindError {
16
16
  }
17
17
  export declare function handleError(error: Error, verbose?: boolean): never;
18
18
  export declare function wrapAsync<T extends any[], R>(fn: (...args: T) => Promise<R>): (...args: T) => Promise<R>;
19
+ export declare function failCommand(message: string, error?: unknown, exitCode?: number): void;
20
+ export declare function withCliErrorHandling<TArgs extends unknown[]>(command: string, handler: (...args: TArgs) => Promise<void> | void): (...args: TArgs) => Promise<void>;
@@ -38,7 +38,7 @@ export function handleError(error, verbose = false) {
38
38
  if (verbose) {
39
39
  console.error(error.stack);
40
40
  }
41
- process.exit(1);
41
+ throw error;
42
42
  }
43
43
  export function wrapAsync(fn) {
44
44
  return async (...args) => {
@@ -50,4 +50,52 @@ export function wrapAsync(fn) {
50
50
  }
51
51
  };
52
52
  }
53
+ export function failCommand(message, error, exitCode = 1) {
54
+ logger.error(message);
55
+ if (error) {
56
+ if (error instanceof Error) {
57
+ logger.error(error.message);
58
+ }
59
+ else {
60
+ logger.error(String(error));
61
+ }
62
+ }
63
+ process.exitCode = exitCode;
64
+ }
65
+ function extractJsonMode(args) {
66
+ for (let i = args.length - 1; i >= 0; i -= 1) {
67
+ const candidate = args[i];
68
+ if (!candidate || typeof candidate !== 'object')
69
+ continue;
70
+ const maybe = candidate;
71
+ if (typeof maybe.json === 'boolean') {
72
+ return maybe.json === true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ function emitCliJsonError(command, error) {
78
+ const message = error instanceof Error ? error.message : String(error);
79
+ console.log(JSON.stringify({
80
+ success: false,
81
+ error: message,
82
+ command,
83
+ timestamp: new Date().toISOString(),
84
+ }, null, 2));
85
+ }
86
+ export function withCliErrorHandling(command, handler) {
87
+ return async (...args) => {
88
+ try {
89
+ await handler(...args);
90
+ }
91
+ catch (error) {
92
+ if (extractJsonMode(args)) {
93
+ emitCliJsonError(command, error);
94
+ process.exitCode = 1;
95
+ return;
96
+ }
97
+ failCommand(`Command "${command}" failed`, error);
98
+ }
99
+ };
100
+ }
53
101
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG5B;IAFT,YACE,OAAe,EACR,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,UAAmB,KAAK;IAChE,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAA8B;IAE9B,OAAO,KAAK,EAAE,GAAG,IAAO,EAAc,EAAE;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG5B;IAFT,YACE,OAAe,EACR,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,UAAmB,KAAK;IAChE,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAA8B;IAE9B,OAAO,KAAK,EAAE,GAAG,IAAO,EAAc,EAAE;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,KAAe,EAAE,WAAmB,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,IAAe;IACtC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,SAAS;QAC1D,MAAM,KAAK,GAAG,SAA+B,CAAC;QAC9C,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAc;IACvD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;QACE,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QACd,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,OAAiD;IAEjD,OAAO,KAAK,EAAE,GAAG,IAAW,EAAiB,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,WAAW,CAAC,YAAY,OAAO,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -6,3 +6,7 @@ export * from './logger.js';
6
6
  export * from './errors.js';
7
7
  export * from './fileio.js';
8
8
  export * from './config.js';
9
+ export * from './profile.js';
10
+ export * from './cache-json.js';
11
+ export * from './source-file-cache.js';
12
+ export * from './learning-parser.js';
@@ -6,4 +6,8 @@ export * from './logger.js';
6
6
  export * from './errors.js';
7
7
  export * from './fileio.js';
8
8
  export * from './config.js';
9
+ export * from './profile.js';
10
+ export * from './cache-json.js';
11
+ export * from './source-file-cache.js';
12
+ export * from './learning-parser.js';
9
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface LearningEntry {
2
+ timestamp: string;
3
+ category: string;
4
+ content: string;
5
+ }
6
+ export declare function parseLearningEntries(content: string): LearningEntry[];
@@ -0,0 +1,23 @@
1
+ export function parseLearningEntries(content) {
2
+ const sections = content
3
+ .split('\n---')
4
+ .map((section) => section.trim())
5
+ .filter((section) => section.startsWith('## '));
6
+ const parsed = [];
7
+ for (const section of sections) {
8
+ const lines = section.split('\n').filter((line) => line.trim().length > 0);
9
+ if (lines.length === 0)
10
+ continue;
11
+ const header = lines[0].replace(/^##\s+/, '');
12
+ const match = header.match(/^(.+?)\s+-\s+(.+)$/);
13
+ if (!match)
14
+ continue;
15
+ parsed.push({
16
+ timestamp: match[1].trim(),
17
+ category: match[2].trim(),
18
+ content: lines.slice(1).join('\n').trim(),
19
+ });
20
+ }
21
+ return parsed;
22
+ }
23
+ //# sourceMappingURL=learning-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-parser.js","sourceRoot":"","sources":["../../src/core/learning-parser.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,IAAI,CAAC;YACV,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC1B,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACzB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface ProfileStep {
2
+ name: string;
3
+ ms: number;
4
+ }
5
+ export interface ProfileReport {
6
+ totalMs: number;
7
+ steps: ProfileStep[];
8
+ }
9
+ export declare class Profiler {
10
+ private readonly enabled;
11
+ private readonly startNs;
12
+ private readonly steps;
13
+ constructor(enabled?: boolean);
14
+ isEnabled(): boolean;
15
+ section<T>(name: string, fn: () => Promise<T>): Promise<T>;
16
+ report(): ProfileReport | null;
17
+ }
18
+ export declare function createProfiler(enabled?: boolean): Profiler;
@@ -0,0 +1,37 @@
1
+ export class Profiler {
2
+ enabled;
3
+ startNs;
4
+ steps = [];
5
+ constructor(enabled = false) {
6
+ this.enabled = enabled;
7
+ this.startNs = process.hrtime.bigint();
8
+ }
9
+ isEnabled() {
10
+ return this.enabled;
11
+ }
12
+ async section(name, fn) {
13
+ if (!this.enabled)
14
+ return fn();
15
+ const sectionStart = process.hrtime.bigint();
16
+ const value = await fn();
17
+ const sectionEnd = process.hrtime.bigint();
18
+ this.steps.push({
19
+ name,
20
+ ms: Number(sectionEnd - sectionStart) / 1_000_000,
21
+ });
22
+ return value;
23
+ }
24
+ report() {
25
+ if (!this.enabled)
26
+ return null;
27
+ const totalMs = Number(process.hrtime.bigint() - this.startNs) / 1_000_000;
28
+ return {
29
+ totalMs,
30
+ steps: this.steps,
31
+ };
32
+ }
33
+ }
34
+ export function createProfiler(enabled = false) {
35
+ return new Profiler(enabled);
36
+ }
37
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/core/profile.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,QAAQ;IACF,OAAO,CAAU;IACjB,OAAO,CAAS;IAChB,KAAK,GAAkB,EAAE,CAAC;IAE3C,YAAY,UAAmB,KAAK;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,EAAoB;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,IAAI;YACJ,EAAE,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,GAAG,SAAS;SAClD,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;QAC3E,OAAO;YACL,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,UAAmB,KAAK;IACrD,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface SourceFileCacheOptions {
2
+ outputDir: string;
3
+ rootPath: string;
4
+ includeGlob: string;
5
+ ignore: string[];
6
+ ttlMs?: number;
7
+ }
8
+ interface SourceFileCacheResult {
9
+ files: string[];
10
+ cacheHit: boolean;
11
+ }
12
+ export declare function getSourceFilesWithCache(options: SourceFileCacheOptions): Promise<SourceFileCacheResult>;
13
+ export {};
@@ -0,0 +1,85 @@
1
+ import { createHash } from 'crypto';
2
+ import { glob } from 'glob';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs/promises';
5
+ import { readCacheJson, writeCacheJson } from './cache-json.js';
6
+ const CACHE_VERSION = 2;
7
+ function makeKey(rootPath, includeGlob, ignore) {
8
+ const stable = `${rootPath}::${includeGlob}::${[...ignore].sort().join(',')}`;
9
+ return createHash('sha256').update(stable, 'utf8').digest('hex').slice(0, 16);
10
+ }
11
+ function normalizeRelDir(value) {
12
+ const normalized = value.replace(/\\/g, '/');
13
+ return normalized === '' ? '.' : normalized;
14
+ }
15
+ async function collectDirectoryMtimes(rootPath, files) {
16
+ const dirs = new Set(['.']);
17
+ for (const file of files) {
18
+ const relDir = normalizeRelDir(path.posix.dirname(file.replace(/\\/g, '/')));
19
+ dirs.add(relDir);
20
+ }
21
+ const entries = [...dirs];
22
+ const result = {};
23
+ for (const relDir of entries) {
24
+ const absDir = relDir === '.' ? rootPath : path.join(rootPath, relDir);
25
+ try {
26
+ const stat = await fs.stat(absDir);
27
+ result[relDir] = stat.mtimeMs;
28
+ }
29
+ catch {
30
+ // Skip transiently missing or inaccessible directories.
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ async function isDirectoryStateFresh(rootPath, dirMtimes) {
36
+ if (!dirMtimes || Object.keys(dirMtimes).length === 0) {
37
+ return false;
38
+ }
39
+ const entries = Object.entries(dirMtimes);
40
+ for (const [relDir, recordedMtime] of entries) {
41
+ const absDir = relDir === '.' ? rootPath : path.join(rootPath, relDir);
42
+ let stat;
43
+ try {
44
+ stat = await fs.stat(absDir);
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ if (stat.mtimeMs !== recordedMtime) {
50
+ return false;
51
+ }
52
+ }
53
+ return true;
54
+ }
55
+ export async function getSourceFilesWithCache(options) {
56
+ const ttlMs = options.ttlMs ?? 30000;
57
+ const cachePath = `${options.outputDir}/cache/file-list.json`;
58
+ const key = makeKey(options.rootPath, options.includeGlob, options.ignore);
59
+ const now = Date.now();
60
+ const store = (await readCacheJson(cachePath)) || { version: CACHE_VERSION, entries: {} };
61
+ const entry = store.version === CACHE_VERSION ? store.entries[key] : undefined;
62
+ if (entry && now - entry.createdAtMs <= ttlMs) {
63
+ if (await isDirectoryStateFresh(options.rootPath, entry.dirMtimes || {})) {
64
+ return { files: entry.files, cacheHit: true };
65
+ }
66
+ }
67
+ const files = await glob(options.includeGlob, {
68
+ cwd: options.rootPath,
69
+ ignore: options.ignore,
70
+ nodir: true,
71
+ });
72
+ files.sort((a, b) => a.localeCompare(b));
73
+ const nextStore = store.version === CACHE_VERSION ? { ...store } : { version: CACHE_VERSION, entries: {} };
74
+ nextStore.entries[key] = {
75
+ createdAtMs: now,
76
+ files,
77
+ dirMtimes: await collectDirectoryMtimes(options.rootPath, files),
78
+ };
79
+ const maxEntries = 16;
80
+ const sorted = Object.entries(nextStore.entries).sort((a, b) => b[1].createdAtMs - a[1].createdAtMs);
81
+ nextStore.entries = Object.fromEntries(sorted.slice(0, maxEntries));
82
+ await writeCacheJson(cachePath, nextStore, { compressAboveBytes: 1024 * 1024, pretty: false });
83
+ return { files, cacheHit: false };
84
+ }
85
+ //# sourceMappingURL=source-file-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-file-cache.js","sourceRoot":"","sources":["../../src/core/source-file-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAllCommands(program: Command): void;
@@ -0,0 +1,9 @@
1
+ import { registerDatabaseCommands } from './register-database.js';
2
+ import { registerMemoryCommands } from './register-memory.js';
3
+ import { registerInteractiveCommand } from './register-interactive.js';
4
+ export function registerAllCommands(program) {
5
+ registerDatabaseCommands(program);
6
+ registerMemoryCommands(program);
7
+ registerInteractiveCommand(program);
8
+ }
9
+ //# sourceMappingURL=register-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-all.js","sourceRoot":"","sources":["../../../src/database/cli/register-all.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAClC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDatabaseCommands(program: Command): void;
@@ -0,0 +1,44 @@
1
+ import { withCliErrorHandling } from '../../core/index.js';
2
+ import { generate } from '../commands/generate.js';
3
+ import { init } from '../commands/init.js';
4
+ import { validate } from '../commands/validate.js';
5
+ import { watch } from '../commands/watch.js';
6
+ export function registerDatabaseCommands(program) {
7
+ program
8
+ .command('init')
9
+ .description('Initialize SchemaWise in your project')
10
+ .option('-u, --url <url>', 'Database connection URL')
11
+ .option('-d, --dir <dir>', 'Output directory', '.devmind')
12
+ .action(withCliErrorHandling('init', init));
13
+ program
14
+ .command('generate')
15
+ .description('Generate context from database or ORM schema')
16
+ .option('-u, --url <url>', 'Database connection URL')
17
+ .option('--orm <orm>', 'ORM type (prisma, drizzle)')
18
+ .option('--mysql', 'Use MySQL extractor')
19
+ .option('--sqlite <path>', 'Use SQLite extractor with file path')
20
+ .option('--prisma [path]', 'Use Prisma extractor (optional path)')
21
+ .option('--drizzle [path]', 'Use Drizzle extractor (optional path)')
22
+ .option('-o, --output <dir>', 'Output directory', '.devmind')
23
+ .option('--format <format>', 'Output format (markdown, json)', 'markdown')
24
+ .action(withCliErrorHandling('generate', generate));
25
+ program
26
+ .command('validate')
27
+ .description('Validate generated context against database')
28
+ .option('--strict', 'Fail on any mismatches')
29
+ .action(withCliErrorHandling('validate', validate));
30
+ program
31
+ .command('watch')
32
+ .description('Watch for schema changes and regenerate')
33
+ .option('-d, --debounce <ms>', 'Debounce time in ms', '2000')
34
+ .action(withCliErrorHandling('watch', watch));
35
+ program
36
+ .command('show')
37
+ .description('Show current database schema')
38
+ .option('-f, --format <format>', 'Output format', 'markdown')
39
+ .action(withCliErrorHandling('show', async (options) => {
40
+ const { show } = await import('../commands/show.js');
41
+ await show(options);
42
+ }));
43
+ }
44
+ //# sourceMappingURL=register-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-database.js","sourceRoot":"","sources":["../../../src/database/cli/register-database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,CAAC;SACzD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,aAAa,EAAE,4BAA4B,CAAC;SACnD,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;SACxC,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,UAAU,CAAC;SAC5D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,UAAU,CAAC;SACzE,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,wBAAwB,CAAC;SAC5C,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,uBAAuB,EAAE,eAAe,EAAE,UAAU,CAAC;SAC5D,MAAM,CACL,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInteractiveCommand(program: Command): void;