devmind 1.0.2 → 1.1.1

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 (134) hide show
  1. package/README.md +138 -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 +48 -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/generators/architecture-extractor.d.ts +41 -0
  23. package/dist/codebase/generators/architecture-extractor.js +388 -0
  24. package/dist/codebase/generators/architecture-extractor.js.map +1 -0
  25. package/dist/codebase/generators/architecture.d.ts +2 -4
  26. package/dist/codebase/generators/architecture.js +123 -30
  27. package/dist/codebase/generators/architecture.js.map +1 -1
  28. package/dist/codebase/generators/modules.js +8 -8
  29. package/dist/codebase/generators/overview.js +24 -24
  30. package/dist/codebase/index.js +3 -3
  31. package/dist/codebase/index.js.map +1 -1
  32. package/dist/codebase/parsers/typescript.d.ts +1 -0
  33. package/dist/codebase/parsers/typescript.js +12 -0
  34. package/dist/codebase/parsers/typescript.js.map +1 -1
  35. package/dist/codebase/scanners/filesystem.d.ts +1 -0
  36. package/dist/codebase/scanners/filesystem.js +128 -4
  37. package/dist/codebase/scanners/filesystem.js.map +1 -1
  38. package/dist/commands/analyze.d.ts +1 -0
  39. package/dist/commands/analyze.js +172 -24
  40. package/dist/commands/analyze.js.map +1 -1
  41. package/dist/commands/audit-design.d.ts +8 -0
  42. package/dist/commands/audit-design.js +158 -0
  43. package/dist/commands/audit-design.js.map +1 -0
  44. package/dist/commands/audit-report.d.ts +18 -0
  45. package/dist/commands/audit-report.js +30 -0
  46. package/dist/commands/audit-report.js.map +1 -0
  47. package/dist/commands/audit-source.d.ts +21 -0
  48. package/dist/commands/audit-source.js +59 -0
  49. package/dist/commands/audit-source.js.map +1 -0
  50. package/dist/commands/audit.d.ts +1 -0
  51. package/dist/commands/audit.js +174 -73
  52. package/dist/commands/audit.js.map +1 -1
  53. package/dist/commands/claude-plugin.d.ts +8 -0
  54. package/dist/commands/claude-plugin.js +123 -0
  55. package/dist/commands/claude-plugin.js.map +1 -0
  56. package/dist/commands/codex-plugin.d.ts +9 -0
  57. package/dist/commands/codex-plugin.js +145 -0
  58. package/dist/commands/codex-plugin.js.map +1 -0
  59. package/dist/commands/context.js +66 -5
  60. package/dist/commands/context.js.map +1 -1
  61. package/dist/commands/design-system.d.ts +8 -0
  62. package/dist/commands/design-system.js +95 -0
  63. package/dist/commands/design-system.js.map +1 -0
  64. package/dist/commands/extract.d.ts +13 -0
  65. package/dist/commands/extract.js +83 -17
  66. package/dist/commands/extract.js.map +1 -1
  67. package/dist/commands/openclaw-plugin.d.ts +8 -0
  68. package/dist/commands/openclaw-plugin.js +103 -0
  69. package/dist/commands/openclaw-plugin.js.map +1 -0
  70. package/dist/commands/retrieve.d.ts +12 -0
  71. package/dist/commands/retrieve.js +234 -0
  72. package/dist/commands/retrieve.js.map +1 -0
  73. package/dist/commands/status.d.ts +1 -0
  74. package/dist/commands/status.js +54 -18
  75. package/dist/commands/status.js.map +1 -1
  76. package/dist/core/cache-json.d.ts +7 -0
  77. package/dist/core/cache-json.js +60 -0
  78. package/dist/core/cache-json.js.map +1 -0
  79. package/dist/core/errors.d.ts +2 -0
  80. package/dist/core/errors.js +49 -1
  81. package/dist/core/errors.js.map +1 -1
  82. package/dist/core/index.d.ts +4 -0
  83. package/dist/core/index.js +4 -0
  84. package/dist/core/index.js.map +1 -1
  85. package/dist/core/learning-parser.d.ts +6 -0
  86. package/dist/core/learning-parser.js +23 -0
  87. package/dist/core/learning-parser.js.map +1 -0
  88. package/dist/core/profile.d.ts +18 -0
  89. package/dist/core/profile.js +37 -0
  90. package/dist/core/profile.js.map +1 -0
  91. package/dist/core/source-file-cache.d.ts +13 -0
  92. package/dist/core/source-file-cache.js +88 -0
  93. package/dist/core/source-file-cache.js.map +1 -0
  94. package/dist/database/cli/register-all.d.ts +2 -0
  95. package/dist/database/cli/register-all.js +9 -0
  96. package/dist/database/cli/register-all.js.map +1 -0
  97. package/dist/database/cli/register-database.d.ts +2 -0
  98. package/dist/database/cli/register-database.js +48 -0
  99. package/dist/database/cli/register-database.js.map +1 -0
  100. package/dist/database/cli/register-interactive.d.ts +2 -0
  101. package/dist/database/cli/register-interactive.js +29 -0
  102. package/dist/database/cli/register-interactive.js.map +1 -0
  103. package/dist/database/cli/register-memory.d.ts +2 -0
  104. package/dist/database/cli/register-memory.js +47 -0
  105. package/dist/database/cli/register-memory.js.map +1 -0
  106. package/dist/database/cli.js +5 -112
  107. package/dist/database/cli.js.map +1 -1
  108. package/dist/database/commands/checkpoint.js +8 -10
  109. package/dist/database/commands/checkpoint.js.map +1 -1
  110. package/dist/database/commands/generate.d.ts +1 -0
  111. package/dist/database/commands/generate.js +28 -20
  112. package/dist/database/commands/generate.js.map +1 -1
  113. package/dist/database/commands/handoff.js +126 -125
  114. package/dist/database/commands/handoff.js.map +1 -1
  115. package/dist/database/commands/learn.d.ts +4 -0
  116. package/dist/database/commands/learn.js +249 -43
  117. package/dist/database/commands/learn.js.map +1 -1
  118. package/dist/database/commands/memory.js +114 -114
  119. package/dist/database/commands/validate.js +6 -4
  120. package/dist/database/commands/validate.js.map +1 -1
  121. package/dist/database/commands/watch.js +2 -2
  122. package/dist/database/commands/watch.js.map +1 -1
  123. package/dist/database/extractors/mysql.js +45 -45
  124. package/dist/database/extractors/postgres.js +54 -54
  125. package/dist/database/extractors/sqlite.js +8 -8
  126. package/dist/database/generators/templates.js +534 -534
  127. package/dist/database/generators/templates.js.map +1 -1
  128. package/dist/database/utils/json-output.d.ts +4 -0
  129. package/dist/database/utils/json-output.js +7 -0
  130. package/dist/database/utils/json-output.js.map +1 -1
  131. package/dist/generators/unified.d.ts +13 -0
  132. package/dist/generators/unified.js +391 -46
  133. package/dist/generators/unified.js.map +1 -1
  134. package/package.json +86 -78
@@ -0,0 +1,103 @@
1
+ import * as os from 'os';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs/promises';
4
+ import { logger, ensureDir, readFileSafe, writeFileSafe } from '../core/index.js';
5
+ async function fileExists(filePath) {
6
+ try {
7
+ await fs.access(filePath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function resolveSkillSource() {
15
+ const candidates = [
16
+ path.resolve(process.cwd(), 'integrations', 'openclaw', 'SKILL.md'),
17
+ path.resolve(process.cwd(), 'SKILL.md'),
18
+ ];
19
+ for (const candidate of candidates) {
20
+ if (await fileExists(candidate)) {
21
+ return candidate;
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ function resolveTargets(skillName, includeProject) {
27
+ const homeDir = os.homedir();
28
+ const cwd = process.cwd();
29
+ const userSkillsRoot = path.join(homeDir, '.openclaw', 'skills');
30
+ const targets = [
31
+ {
32
+ kind: 'user',
33
+ skillDir: path.join(userSkillsRoot, skillName),
34
+ skillPath: path.join(userSkillsRoot, skillName, 'SKILL.md'),
35
+ },
36
+ ];
37
+ if (includeProject) {
38
+ const projectRoot = path.join(cwd, '.openclaw', 'skills');
39
+ targets.push({
40
+ kind: 'project',
41
+ skillDir: path.join(projectRoot, skillName),
42
+ skillPath: path.join(projectRoot, skillName, 'SKILL.md'),
43
+ });
44
+ }
45
+ return targets;
46
+ }
47
+ export async function openclawPlugin(options) {
48
+ const skillName = options.name || 'devmind';
49
+ const force = !!options.force;
50
+ const jsonMode = !!options.json;
51
+ const includeProject = !!options.project;
52
+ const skillSource = await resolveSkillSource();
53
+ if (!skillSource) {
54
+ const message = 'No SKILL.md found to install for OpenClaw plugin.';
55
+ if (jsonMode) {
56
+ console.log(JSON.stringify({ success: false, error: message }, null, 2));
57
+ return;
58
+ }
59
+ logger.error(message);
60
+ return;
61
+ }
62
+ const skillContent = await readFileSafe(skillSource);
63
+ const targets = resolveTargets(skillName, includeProject);
64
+ const conflicts = [];
65
+ for (const target of targets) {
66
+ if ((await fileExists(target.skillPath)) && !force) {
67
+ conflicts.push(target.skillPath);
68
+ }
69
+ }
70
+ if (conflicts.length > 0) {
71
+ const message = `OpenClaw skill already exists. Use --force to overwrite. Conflicts: ${conflicts.join(', ')}`;
72
+ if (jsonMode) {
73
+ console.log(JSON.stringify({ success: false, error: message, conflicts }, null, 2));
74
+ return;
75
+ }
76
+ logger.warn(message);
77
+ return;
78
+ }
79
+ for (const target of targets) {
80
+ await ensureDir(target.skillDir);
81
+ await writeFileSafe(target.skillPath, skillContent);
82
+ }
83
+ const installed = targets.map((target) => target.skillPath);
84
+ if (jsonMode) {
85
+ console.log(JSON.stringify({
86
+ success: true,
87
+ skill: skillName,
88
+ source: skillSource,
89
+ installed,
90
+ notes: ['Restart OpenClaw session to pick up installed skills.'],
91
+ }, null, 2));
92
+ return;
93
+ }
94
+ logger.success('OpenClaw skill installed for DevMind.');
95
+ logger.info(` Skill: ${skillName}`);
96
+ logger.info(` Source: ${skillSource}`);
97
+ logger.info(' Installed paths:');
98
+ for (const installedPath of installed) {
99
+ logger.info(` - ${installedPath}`);
100
+ }
101
+ logger.info('Restart OpenClaw session to pick up installed skills.');
102
+ }
103
+ //# sourceMappingURL=openclaw-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-plugin.js","sourceRoot":"","sources":["../../src/commands/openclaw-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface RetrieveOptions {
2
+ output?: string;
3
+ query: string;
4
+ type?: string;
5
+ tags?: string;
6
+ limit?: string | number;
7
+ maxWords?: string | number;
8
+ json?: boolean;
9
+ profile?: boolean;
10
+ }
11
+ export declare function retrieve(options: RetrieveOptions): Promise<void>;
12
+ export {};
@@ -0,0 +1,234 @@
1
+ import * as path from 'path';
2
+ import { createHash } from 'crypto';
3
+ import { logger, readFileSafe, createProfiler } from '../core/index.js';
4
+ function isJsonFlagEnabled(options) {
5
+ if (options.json === true)
6
+ return true;
7
+ try {
8
+ return options.opts?.().json === true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ function jsonFail(message) {
15
+ console.log(JSON.stringify({
16
+ success: false,
17
+ error: message,
18
+ timestamp: new Date().toISOString(),
19
+ }, null, 2));
20
+ }
21
+ function tokenize(input) {
22
+ return input
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9_\s-]/g, ' ')
25
+ .split(/\s+/)
26
+ .map((token) => token.trim())
27
+ .filter((token) => token.length >= 2);
28
+ }
29
+ function hashContent(content) {
30
+ return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 16);
31
+ }
32
+ function metadataScore(section, tokens) {
33
+ const haystack = `${section.id} ${section.title} ${section.type} ${section.tags.join(' ')}`.toLowerCase();
34
+ let score = section.priority === 'high' ? 2 : section.priority === 'medium' ? 1 : 0;
35
+ for (const token of tokens) {
36
+ if (haystack.includes(token))
37
+ score += 3;
38
+ }
39
+ return score;
40
+ }
41
+ function contentScore(content, tokens) {
42
+ const lc = content.toLowerCase();
43
+ let score = 0;
44
+ for (const token of tokens) {
45
+ if (lc.includes(token))
46
+ score += 2;
47
+ }
48
+ return score;
49
+ }
50
+ function parseIndexSections(indexContent) {
51
+ const parsed = JSON.parse(indexContent);
52
+ return parsed.sections || [];
53
+ }
54
+ function sliceByLines(content, startLine, endLine) {
55
+ const lines = content.split('\n');
56
+ return lines
57
+ .slice(startLine - 1, endLine)
58
+ .join('\n')
59
+ .trim();
60
+ }
61
+ function parseTags(tagsRaw) {
62
+ if (!tagsRaw)
63
+ return [];
64
+ return tagsRaw
65
+ .split(',')
66
+ .map((tag) => tag.trim().toLowerCase())
67
+ .filter(Boolean);
68
+ }
69
+ function clampInt(value, fallback) {
70
+ if (value === undefined)
71
+ return fallback;
72
+ const parsed = Number(value);
73
+ if (!Number.isFinite(parsed))
74
+ return fallback;
75
+ return Math.max(1, Math.floor(parsed));
76
+ }
77
+ export async function retrieve(options) {
78
+ const jsonMode = isJsonFlagEnabled(options);
79
+ const profiler = createProfiler(!!options.profile);
80
+ const outputDir = options.output || '.devmind';
81
+ const query = options.query || '';
82
+ const tokens = tokenize(query);
83
+ const typeFilter = options.type?.toLowerCase();
84
+ const tagFilter = parseTags(options.tags);
85
+ const limit = clampInt(options.limit, 6);
86
+ const maxWords = clampInt(options.maxWords, 1400);
87
+ const indexPath = path.join(outputDir, 'index.json');
88
+ const agentsPath = path.join(outputDir, 'AGENTS.md');
89
+ let indexSections = [];
90
+ let agentsContent = '';
91
+ try {
92
+ indexSections = parseIndexSections(await profiler.section('retrieve.loadIndex', async () => readFileSafe(indexPath)));
93
+ agentsContent = await profiler.section('retrieve.loadAgents', async () => readFileSafe(agentsPath));
94
+ }
95
+ catch (error) {
96
+ const message = `Failed to load retrieval files in ${outputDir}. Run "devmind scan" or "devmind generate --all".`;
97
+ if (jsonMode) {
98
+ jsonFail(message);
99
+ return;
100
+ }
101
+ logger.error(message);
102
+ return;
103
+ }
104
+ if (indexSections.length === 0) {
105
+ const message = 'No section metadata found in index.json. Regenerate context first.';
106
+ if (jsonMode) {
107
+ jsonFail(message);
108
+ return;
109
+ }
110
+ logger.error(message);
111
+ return;
112
+ }
113
+ let filtered = indexSections.filter((section) => {
114
+ if (typeFilter && section.type !== typeFilter)
115
+ return false;
116
+ if (tagFilter.length > 0 &&
117
+ !tagFilter.every((tag) => section.tags.map((t) => t.toLowerCase()).includes(tag))) {
118
+ return false;
119
+ }
120
+ return true;
121
+ });
122
+ if (filtered.length === 0) {
123
+ if (jsonMode) {
124
+ console.log(JSON.stringify({
125
+ success: true,
126
+ query,
127
+ outputDir,
128
+ selected: [],
129
+ message: 'No sections matched the requested filters.',
130
+ timestamp: new Date().toISOString(),
131
+ }, null, 2));
132
+ return;
133
+ }
134
+ logger.warn('No sections matched the requested filters.');
135
+ return;
136
+ }
137
+ // Stage 1: metadata filter + ranking
138
+ filtered = filtered
139
+ .map((section) => ({ section, stage1Score: metadataScore(section, tokens) }))
140
+ .sort((a, b) => b.stage1Score - a.stage1Score ||
141
+ a.section.id.localeCompare(b.section.id) ||
142
+ a.section.startLine - b.section.startLine)
143
+ .slice(0, Math.min(24, filtered.length))
144
+ .map((item) => item.section);
145
+ // Stage 2: content ranking
146
+ const ranked = filtered.map((section) => {
147
+ const content = sliceByLines(agentsContent, section.startLine, section.endLine);
148
+ const hash = hashContent(content);
149
+ if (hash !== section.contentHash) {
150
+ if (!jsonMode) {
151
+ logger.warn(`Section hash mismatch for ${section.id}; consider regenerating context.`);
152
+ }
153
+ }
154
+ const score = metadataScore(section, tokens) * 2 + contentScore(content, tokens);
155
+ return {
156
+ section,
157
+ stage1Score: metadataScore(section, tokens),
158
+ content,
159
+ score,
160
+ };
161
+ });
162
+ ranked.sort((a, b) => b.score - a.score ||
163
+ b.stage1Score - a.stage1Score ||
164
+ a.section.id.localeCompare(b.section.id) ||
165
+ a.section.startLine - b.section.startLine);
166
+ const selected = ranked.slice(0, limit);
167
+ const picked = [];
168
+ let wordBudget = 0;
169
+ for (const item of selected) {
170
+ const words = item.content.split(/\s+/).filter(Boolean).length;
171
+ if (wordBudget + words > maxWords && picked.length > 0)
172
+ continue;
173
+ picked.push(item);
174
+ wordBudget += words;
175
+ }
176
+ if (jsonMode) {
177
+ const profile = profiler.report();
178
+ console.log(JSON.stringify(profile
179
+ ? {
180
+ query,
181
+ outputDir,
182
+ selected: picked.map((item) => ({
183
+ id: item.section.id,
184
+ title: item.section.title,
185
+ type: item.section.type,
186
+ tags: item.section.tags,
187
+ source: item.section.source,
188
+ startLine: item.section.startLine,
189
+ endLine: item.section.endLine,
190
+ score: item.score,
191
+ content: item.content,
192
+ })),
193
+ profile,
194
+ }
195
+ : {
196
+ query,
197
+ outputDir,
198
+ selected: picked.map((item) => ({
199
+ id: item.section.id,
200
+ title: item.section.title,
201
+ type: item.section.type,
202
+ tags: item.section.tags,
203
+ source: item.section.source,
204
+ startLine: item.section.startLine,
205
+ endLine: item.section.endLine,
206
+ score: item.score,
207
+ content: item.content,
208
+ })),
209
+ }, null, 2));
210
+ return;
211
+ }
212
+ let output = '# Retrieved Context\n\n';
213
+ output += `Query: ${query || '(none)'}\n`;
214
+ output += `Selected sections: ${picked.length}\n\n`;
215
+ for (const item of picked) {
216
+ output += `## ${item.section.title}\n\n`;
217
+ output += `- ID: \`${item.section.id}\`\n`;
218
+ output += `- Type: \`${item.section.type}\`\n`;
219
+ output += `- Tags: ${item.section.tags.map((tag) => `\`${tag}\``).join(', ') || '(none)'}\n`;
220
+ output += `- Source: \`${item.section.source}\`\n`;
221
+ output += `- Lines: \`${item.section.startLine}-${item.section.endLine}\`\n\n`;
222
+ output += `${item.content}\n\n`;
223
+ }
224
+ console.log(output.trim());
225
+ const profile = profiler.report();
226
+ if (profile) {
227
+ logger.info('Performance Profile');
228
+ logger.info(`Total: ${profile.totalMs.toFixed(1)}ms`);
229
+ for (const step of profile.steps) {
230
+ logger.info(`- ${step.name}: ${step.ms.toFixed(1)}ms`);
231
+ }
232
+ }
233
+ }
234
+ //# sourceMappingURL=retrieve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../src/commands/retrieve.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ interface StatusOptions {
2
2
  output?: string;
3
3
  path?: string;
4
4
  json?: boolean;
5
+ profile?: boolean;
5
6
  }
6
7
  export declare function status(options: StatusOptions): Promise<void>;
7
8
  export {};
@@ -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>;