@mmnto/cli 1.4.3 → 1.5.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 (95) hide show
  1. package/dist/assets/baseline-packs.d.ts +16 -0
  2. package/dist/assets/baseline-packs.d.ts.map +1 -0
  3. package/dist/assets/baseline-packs.js +137 -0
  4. package/dist/assets/baseline-packs.js.map +1 -0
  5. package/dist/commands/config-drift.test.js +5 -4
  6. package/dist/commands/config-drift.test.js.map +1 -1
  7. package/dist/commands/docs.d.ts +7 -0
  8. package/dist/commands/docs.d.ts.map +1 -1
  9. package/dist/commands/docs.js +14 -3
  10. package/dist/commands/docs.js.map +1 -1
  11. package/dist/commands/docs.test.js +38 -1
  12. package/dist/commands/docs.test.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +15 -0
  14. package/dist/commands/doctor.d.ts.map +1 -0
  15. package/dist/commands/doctor.js +409 -0
  16. package/dist/commands/doctor.js.map +1 -0
  17. package/dist/commands/doctor.test.d.ts +2 -0
  18. package/dist/commands/doctor.test.d.ts.map +1 -0
  19. package/dist/commands/doctor.test.js +269 -0
  20. package/dist/commands/doctor.test.js.map +1 -0
  21. package/dist/commands/extract.d.ts.map +1 -1
  22. package/dist/commands/extract.js +8 -1
  23. package/dist/commands/extract.js.map +1 -1
  24. package/dist/commands/init-detect.d.ts +5 -0
  25. package/dist/commands/init-detect.d.ts.map +1 -1
  26. package/dist/commands/init-detect.js +52 -0
  27. package/dist/commands/init-detect.js.map +1 -1
  28. package/dist/commands/init-templates.d.ts +16 -1
  29. package/dist/commands/init-templates.d.ts.map +1 -1
  30. package/dist/commands/init-templates.js +80 -0
  31. package/dist/commands/init-templates.js.map +1 -1
  32. package/dist/commands/init.d.ts +3 -2
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +52 -14
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/init.test.js +112 -0
  37. package/dist/commands/init.test.js.map +1 -1
  38. package/dist/commands/install-hooks.d.ts +24 -3
  39. package/dist/commands/install-hooks.d.ts.map +1 -1
  40. package/dist/commands/install-hooks.js +105 -57
  41. package/dist/commands/install-hooks.js.map +1 -1
  42. package/dist/commands/install-hooks.test.js +137 -20
  43. package/dist/commands/install-hooks.test.js.map +1 -1
  44. package/dist/commands/lint.d.ts +2 -0
  45. package/dist/commands/lint.d.ts.map +1 -1
  46. package/dist/commands/lint.js +30 -1
  47. package/dist/commands/lint.js.map +1 -1
  48. package/dist/commands/list.d.ts +3 -0
  49. package/dist/commands/list.d.ts.map +1 -0
  50. package/dist/commands/list.js +44 -0
  51. package/dist/commands/list.js.map +1 -0
  52. package/dist/commands/list.test.d.ts +2 -0
  53. package/dist/commands/list.test.d.ts.map +1 -0
  54. package/dist/commands/list.test.js +131 -0
  55. package/dist/commands/list.test.js.map +1 -0
  56. package/dist/commands/run-compiled-rules.d.ts +1 -2
  57. package/dist/commands/run-compiled-rules.d.ts.map +1 -1
  58. package/dist/commands/run-compiled-rules.js +1 -2
  59. package/dist/commands/run-compiled-rules.js.map +1 -1
  60. package/dist/commands/shield-hints.d.ts +6 -0
  61. package/dist/commands/shield-hints.d.ts.map +1 -0
  62. package/dist/commands/shield-hints.js +44 -0
  63. package/dist/commands/shield-hints.js.map +1 -0
  64. package/dist/commands/shield-hints.test.d.ts +2 -0
  65. package/dist/commands/shield-hints.test.d.ts.map +1 -0
  66. package/dist/commands/shield-hints.test.js +151 -0
  67. package/dist/commands/shield-hints.test.js.map +1 -0
  68. package/dist/commands/shield.d.ts +6 -4
  69. package/dist/commands/shield.d.ts.map +1 -1
  70. package/dist/commands/shield.js +76 -34
  71. package/dist/commands/shield.js.map +1 -1
  72. package/dist/commands/shield.test.js +34 -3
  73. package/dist/commands/shield.test.js.map +1 -1
  74. package/dist/commands/sync.d.ts.map +1 -1
  75. package/dist/commands/sync.js +18 -1
  76. package/dist/commands/sync.js.map +1 -1
  77. package/dist/commands/sync.test.js +17 -1
  78. package/dist/commands/sync.test.js.map +1 -1
  79. package/dist/index.js +38 -5
  80. package/dist/index.js.map +1 -1
  81. package/dist/pr-comment.d.ts +52 -0
  82. package/dist/pr-comment.d.ts.map +1 -0
  83. package/dist/pr-comment.js +166 -0
  84. package/dist/pr-comment.js.map +1 -0
  85. package/dist/pr-comment.test.d.ts +2 -0
  86. package/dist/pr-comment.test.d.ts.map +1 -0
  87. package/dist/pr-comment.test.js +169 -0
  88. package/dist/pr-comment.test.js.map +1 -0
  89. package/dist/utils.d.ts +10 -3
  90. package/dist/utils.d.ts.map +1 -1
  91. package/dist/utils.js +59 -13
  92. package/dist/utils.js.map +1 -1
  93. package/dist/utils.test.js +52 -3
  94. package/dist/utils.test.js.map +1 -1
  95. package/package.json +5 -3
@@ -0,0 +1,409 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import pc from 'picocolors';
4
+ import { resolveGitRoot } from '../git.js';
5
+ import { CONFIG_FILES } from '../utils.js';
6
+ // ─── Secret leak patterns ───────────────────────────────
7
+ const SECRET_PATTERNS = [
8
+ /sk-[a-zA-Z0-9_-]{20,}/,
9
+ /sk-ant-[a-zA-Z0-9_-]{20,}/,
10
+ /ghp_[a-zA-Z0-9]{36}/,
11
+ /ghu_[a-zA-Z0-9]{36}/,
12
+ /AIza[a-zA-Z0-9_-]{35}/,
13
+ ];
14
+ const PLACEHOLDER_PATTERNS = [
15
+ /<YOUR_KEY>/i,
16
+ /your_token_here/i,
17
+ /sk-your-key-here/i,
18
+ /<your[_-].*?>/i,
19
+ /your[_-]api[_-]key/i,
20
+ /replace[_-]with[_-]/i,
21
+ /placeholder/i,
22
+ /xxx+/i,
23
+ ];
24
+ // ─── Individual checks ──────────────────────────────────
25
+ export function checkConfig(cwd) {
26
+ for (const file of CONFIG_FILES) {
27
+ const candidate = path.join(cwd, file);
28
+ if (fs.existsSync(candidate)) {
29
+ return {
30
+ name: 'Config',
31
+ status: 'pass',
32
+ message: `${file} found`,
33
+ };
34
+ }
35
+ }
36
+ return {
37
+ name: 'Config',
38
+ status: 'fail',
39
+ message: 'No config file found',
40
+ remediation: 'totem init',
41
+ };
42
+ }
43
+ export function checkCompiledRules(cwd, totemDir = '.totem') {
44
+ const rulesPath = path.join(cwd, totemDir, 'compiled-rules.json');
45
+ if (!fs.existsSync(rulesPath)) {
46
+ return {
47
+ name: 'Compiled Rules',
48
+ status: 'warn',
49
+ message: 'compiled-rules.json missing',
50
+ remediation: 'totem compile',
51
+ };
52
+ }
53
+ try {
54
+ const content = fs.readFileSync(rulesPath, 'utf-8');
55
+ const parsed = JSON.parse(content);
56
+ // Handle both { version, rules } wrapper and bare array formats
57
+ const rules = Array.isArray(parsed?.rules)
58
+ ? parsed.rules
59
+ : Array.isArray(parsed)
60
+ ? parsed
61
+ : [];
62
+ return {
63
+ name: 'Compiled Rules',
64
+ status: 'pass',
65
+ message: `${rules.length} rules loaded`,
66
+ };
67
+ }
68
+ catch {
69
+ return {
70
+ name: 'Compiled Rules',
71
+ status: 'warn',
72
+ message: 'compiled-rules.json unreadable',
73
+ remediation: 'totem compile',
74
+ };
75
+ }
76
+ }
77
+ export function checkGitHooks(cwd) {
78
+ const gitRoot = resolveGitRoot(cwd);
79
+ if (!gitRoot) {
80
+ return {
81
+ name: 'Git Hooks',
82
+ status: 'skip',
83
+ message: 'Not a git repository',
84
+ };
85
+ }
86
+ const hooksDir = path.join(gitRoot, '.git', 'hooks');
87
+ const markers = [
88
+ { file: 'pre-commit', marker: '[totem] pre-commit hook' },
89
+ { file: 'pre-push', marker: '[totem] pre-push hook' },
90
+ { file: 'post-merge', marker: '[totem] post-merge hook' },
91
+ { file: 'post-checkout', marker: '[totem] post-checkout hook' },
92
+ ];
93
+ let installed = 0;
94
+ const missing = [];
95
+ for (const { file, marker } of markers) {
96
+ const hookPath = path.join(hooksDir, file);
97
+ if (fs.existsSync(hookPath)) {
98
+ try {
99
+ const content = fs.readFileSync(hookPath, 'utf-8');
100
+ if (content.includes(marker)) {
101
+ installed++;
102
+ continue;
103
+ }
104
+ }
105
+ catch {
106
+ // Fall through to missing
107
+ }
108
+ }
109
+ missing.push(file);
110
+ }
111
+ if (missing.length === 0) {
112
+ return {
113
+ name: 'Git Hooks',
114
+ status: 'pass',
115
+ message: `All ${markers.length} hooks installed`,
116
+ };
117
+ }
118
+ return {
119
+ name: 'Git Hooks',
120
+ status: 'warn',
121
+ message: `${installed}/${markers.length} hooks installed (missing: ${missing.join(', ')})`,
122
+ remediation: 'totem hooks',
123
+ };
124
+ }
125
+ /** Check if a config file content has an embedding provider configured. */
126
+ function hasEmbeddingProvider(content) {
127
+ return /provider:\s*['"]?(openai|gemini|ollama)['"]?/.test(content);
128
+ }
129
+ /** Find and read the first totem config file. Returns [path, content] or null. */
130
+ function readConfigFile(cwd) {
131
+ for (const file of CONFIG_FILES) {
132
+ const candidate = path.join(cwd, file);
133
+ if (fs.existsSync(candidate)) {
134
+ try {
135
+ return [candidate, fs.readFileSync(candidate, 'utf-8')];
136
+ }
137
+ catch {
138
+ return null;
139
+ }
140
+ }
141
+ }
142
+ return null;
143
+ }
144
+ export function checkEmbeddingConfig(cwd) {
145
+ const configResult = readConfigFile(cwd);
146
+ if (!configResult) {
147
+ return {
148
+ name: 'Embedding',
149
+ status: 'skip',
150
+ message: 'No config (skipped)',
151
+ };
152
+ }
153
+ const [, content] = configResult;
154
+ if (!hasEmbeddingProvider(content)) {
155
+ return {
156
+ name: 'Embedding',
157
+ status: 'warn',
158
+ message: 'No embedding configured (Lite tier)',
159
+ };
160
+ }
161
+ try {
162
+ // Detect which provider and check for API keys
163
+ const isOpenAI = /provider:\s*['"]?openai['"]?/.test(content);
164
+ const isGemini = /provider:\s*['"]?gemini['"]?/.test(content);
165
+ const isOllama = /provider:\s*['"]?ollama['"]?/.test(content);
166
+ // Read .env for key checks
167
+ let envContent = '';
168
+ try {
169
+ const envPath = path.join(cwd, '.env');
170
+ if (fs.existsSync(envPath))
171
+ envContent = fs.readFileSync(envPath, 'utf-8');
172
+ }
173
+ catch {
174
+ // .env unreadable — proceed with env vars only
175
+ }
176
+ const hasEnvKey = (key) => !!(process.env[key] && /\S/.test(process.env[key])) ||
177
+ new RegExp(`^\\s*${key}\\s*=\\s*\\S+`, 'm').test(envContent);
178
+ if (isOpenAI) {
179
+ if (hasEnvKey('OPENAI_API_KEY')) {
180
+ return {
181
+ name: 'Embedding',
182
+ status: 'pass',
183
+ message: 'openai (text-embedding-3-small)',
184
+ };
185
+ }
186
+ return {
187
+ name: 'Embedding',
188
+ status: 'fail',
189
+ message: 'OpenAI configured but OPENAI_API_KEY missing',
190
+ remediation: 'Set OPENAI_API_KEY in your .env file',
191
+ };
192
+ }
193
+ if (isGemini) {
194
+ if (hasEnvKey('GEMINI_API_KEY') || hasEnvKey('GOOGLE_API_KEY')) {
195
+ return {
196
+ name: 'Embedding',
197
+ status: 'pass',
198
+ message: 'gemini (gemini-embedding-2-preview)',
199
+ };
200
+ }
201
+ return {
202
+ name: 'Embedding',
203
+ status: 'fail',
204
+ message: 'Gemini configured but API key missing',
205
+ remediation: 'Set GEMINI_API_KEY or GOOGLE_API_KEY in your .env file',
206
+ };
207
+ }
208
+ if (isOllama) {
209
+ return {
210
+ name: 'Embedding',
211
+ status: 'pass',
212
+ message: 'ollama (nomic-embed-text)',
213
+ };
214
+ }
215
+ return {
216
+ name: 'Embedding',
217
+ status: 'warn',
218
+ message: 'No embedding configured (Lite tier)',
219
+ };
220
+ }
221
+ catch {
222
+ return {
223
+ name: 'Embedding',
224
+ status: 'skip',
225
+ message: 'Could not read config',
226
+ };
227
+ }
228
+ }
229
+ export function checkIndex(cwd, lanceDir = '.lancedb') {
230
+ const configResult = readConfigFile(cwd);
231
+ if (!configResult || !hasEmbeddingProvider(configResult[1])) {
232
+ return {
233
+ name: 'Index',
234
+ status: 'skip',
235
+ message: 'Lite tier (no embedding)',
236
+ };
237
+ }
238
+ const lanceDbPath = path.join(cwd, lanceDir);
239
+ if (!fs.existsSync(lanceDbPath)) {
240
+ return {
241
+ name: 'Index',
242
+ status: 'warn',
243
+ message: `${lanceDir}/ missing`,
244
+ remediation: 'totem sync',
245
+ };
246
+ }
247
+ try {
248
+ const entries = fs.readdirSync(lanceDbPath);
249
+ if (entries.length === 0) {
250
+ return {
251
+ name: 'Index',
252
+ status: 'warn',
253
+ message: `${lanceDir}/ is empty`,
254
+ remediation: 'totem sync',
255
+ };
256
+ }
257
+ }
258
+ catch {
259
+ return {
260
+ name: 'Index',
261
+ status: 'warn',
262
+ message: `${lanceDir}/ unreadable`,
263
+ remediation: 'totem sync',
264
+ };
265
+ }
266
+ return {
267
+ name: 'Index',
268
+ status: 'pass',
269
+ message: `${lanceDir}/ exists`,
270
+ };
271
+ }
272
+ export function checkSecretLeaks(cwd, totemDir = '.totem') {
273
+ const filesToScan = [];
274
+ // Collect files to scan
275
+ const candidates = ['CLAUDE.md', '.cursorrules'];
276
+ for (const file of candidates) {
277
+ const fullPath = path.join(cwd, file);
278
+ if (fs.existsSync(fullPath)) {
279
+ filesToScan.push(fullPath);
280
+ }
281
+ }
282
+ // Scan .totem/lessons/*.md
283
+ const lessonsDir = path.join(cwd, totemDir, 'lessons');
284
+ if (fs.existsSync(lessonsDir)) {
285
+ try {
286
+ const entries = fs.readdirSync(lessonsDir);
287
+ for (const entry of entries) {
288
+ if (entry.endsWith('.md')) {
289
+ filesToScan.push(path.join(lessonsDir, entry));
290
+ }
291
+ }
292
+ }
293
+ catch {
294
+ // lessons dir unreadable — skip
295
+ }
296
+ }
297
+ if (filesToScan.length === 0) {
298
+ return {
299
+ name: 'Secret Scan',
300
+ status: 'pass',
301
+ message: 'No files to scan',
302
+ };
303
+ }
304
+ const leaks = [];
305
+ for (const filePath of filesToScan) {
306
+ try {
307
+ const content = fs.readFileSync(filePath, 'utf-8');
308
+ for (const pattern of SECRET_PATTERNS) {
309
+ const matches = content.match(new RegExp(pattern.source, 'g'));
310
+ if (matches) {
311
+ for (const match of matches) {
312
+ // Check if this looks like a placeholder
313
+ const isPlaceholder = PLACEHOLDER_PATTERNS.some((pp) => pp.test(match));
314
+ if (!isPlaceholder) {
315
+ const rel = path.relative(cwd, filePath);
316
+ leaks.push(`${rel}: ${match.slice(0, 8)}...`);
317
+ }
318
+ }
319
+ }
320
+ }
321
+ }
322
+ catch {
323
+ // File unreadable — skip
324
+ }
325
+ }
326
+ if (leaks.length > 0) {
327
+ return {
328
+ name: 'Secret Scan',
329
+ status: 'fail',
330
+ message: `${leaks.length} potential leaked key(s) found`,
331
+ remediation: 'Rotate keys immediately and remove from tracked files',
332
+ };
333
+ }
334
+ return {
335
+ name: 'Secret Scan',
336
+ status: 'pass',
337
+ message: 'No leaked keys detected',
338
+ };
339
+ }
340
+ // ─── Output formatting ──────────────────────────────────
341
+ function statusIcon(status) {
342
+ switch (status) {
343
+ case 'pass':
344
+ return pc.green('\u2713');
345
+ case 'warn':
346
+ return pc.yellow('!');
347
+ case 'fail':
348
+ return pc.red('\u2717');
349
+ case 'skip':
350
+ return pc.dim('-');
351
+ }
352
+ }
353
+ function statusColor(status, text) {
354
+ switch (status) {
355
+ case 'pass':
356
+ return pc.green(text);
357
+ case 'warn':
358
+ return pc.yellow(text);
359
+ case 'fail':
360
+ return pc.red(text);
361
+ case 'skip':
362
+ return pc.dim(text);
363
+ }
364
+ }
365
+ function formatResult(result) {
366
+ const icon = statusIcon(result.status);
367
+ const name = result.name.padEnd(18);
368
+ const msg = statusColor(result.status, result.message);
369
+ let line = ` ${icon} ${name} ${msg}`;
370
+ if (result.remediation && (result.status === 'warn' || result.status === 'fail')) {
371
+ line += pc.dim(` → ${result.remediation}`);
372
+ }
373
+ return line;
374
+ }
375
+ // ─── Main command ───────────────────────────────────────
376
+ export async function doctorCommand() {
377
+ const cwd = process.cwd();
378
+ console.error(`${pc.cyan('[Totem]')} Running diagnostics...\n`);
379
+ const results = [
380
+ checkConfig(cwd),
381
+ checkCompiledRules(cwd),
382
+ checkGitHooks(cwd),
383
+ checkEmbeddingConfig(cwd),
384
+ checkIndex(cwd),
385
+ checkSecretLeaks(cwd),
386
+ ];
387
+ for (const result of results) {
388
+ console.error(formatResult(result));
389
+ }
390
+ const counts = {
391
+ pass: results.filter((r) => r.status === 'pass').length,
392
+ warn: results.filter((r) => r.status === 'warn').length,
393
+ fail: results.filter((r) => r.status === 'fail').length,
394
+ skip: results.filter((r) => r.status === 'skip').length,
395
+ };
396
+ const parts = [];
397
+ parts.push(pc.green(`${counts.pass} passed`));
398
+ if (counts.warn > 0)
399
+ parts.push(pc.yellow(`${counts.warn} warnings`));
400
+ else
401
+ parts.push(`${counts.warn} warnings`);
402
+ if (counts.fail > 0)
403
+ parts.push(pc.red(`${counts.fail} failures`));
404
+ else
405
+ parts.push(`${counts.fail} failures`);
406
+ console.error(`\n${pc.cyan('[Totem]')} ${parts.join(', ')}`);
407
+ return results;
408
+ }
409
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=doctor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.test.ts"],"names":[],"mappings":""}