@triedotdev/mcp 1.0.87 → 1.0.88

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.
package/dist/cli/main.js CHANGED
@@ -17,9 +17,10 @@ import {
17
17
  shouldAutoFix,
18
18
  shouldBlockPush,
19
19
  trackIssueOccurrence
20
- } from "../chunk-4UVTFL2T.js";
20
+ } from "../chunk-4CYQGEWE.js";
21
21
  import {
22
22
  SKILL_CATEGORIES,
23
+ createSavedPattern,
23
24
  detectStack,
24
25
  getSkillCategories,
25
26
  getSkillsByCategory,
@@ -27,8 +28,11 @@ import {
27
28
  getUncommittedChanges,
28
29
  isTrieInitialized,
29
30
  loadConfig,
30
- saveConfig
31
- } from "../chunk-4U3DNRUA.js";
31
+ loadSavedPatterns,
32
+ saveConfig,
33
+ savePatternToProject,
34
+ savePatternsToProject
35
+ } from "../chunk-YSES743V.js";
32
36
  import {
33
37
  ContextGraph,
34
38
  GotchaPredictor
@@ -80,7 +84,7 @@ import {
80
84
 
81
85
  // src/cli/main.ts
82
86
  import { resolve, join as join2, dirname } from "path";
83
- import { existsSync as existsSync3, readFileSync } from "fs";
87
+ import { existsSync as existsSync4, readFileSync } from "fs";
84
88
  import { fileURLToPath, pathToFileURL } from "url";
85
89
 
86
90
  // src/cli/skills.ts
@@ -2238,6 +2242,219 @@ async function handleLearnCommand(args) {
2238
2242
  }
2239
2243
  }
2240
2244
 
2245
+ // src/cli/patterns.ts
2246
+ import { readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
2247
+ import { existsSync as existsSync3 } from "fs";
2248
+ import { basename } from "path";
2249
+ import picocolors3 from "picocolors";
2250
+ async function handlePatternsCommand(args) {
2251
+ const subcommand = args[0]?.toLowerCase();
2252
+ const workDir = getWorkingDirectory(void 0, true);
2253
+ try {
2254
+ switch (subcommand) {
2255
+ case "save":
2256
+ await handleSavePattern(args.slice(1), workDir);
2257
+ break;
2258
+ case "list":
2259
+ await handleListPatterns(args.slice(1), workDir);
2260
+ break;
2261
+ case "export":
2262
+ await handleExportPatterns(args.slice(1), workDir);
2263
+ break;
2264
+ case "import":
2265
+ await handleImportPatterns(args.slice(1), workDir);
2266
+ break;
2267
+ case "validate":
2268
+ await handleValidatePattern(args.slice(1), workDir);
2269
+ break;
2270
+ default:
2271
+ showPatternsHelp();
2272
+ }
2273
+ } catch (error) {
2274
+ const friendly = formatFriendlyError(error);
2275
+ console.error(picocolors3.red(`Error: ${friendly.userMessage}`));
2276
+ process.exit(1);
2277
+ }
2278
+ }
2279
+ async function handleSavePattern(args, workDir) {
2280
+ const target = args[0];
2281
+ const note = args.slice(1).join(" ") || void 0;
2282
+ if (!target) {
2283
+ console.error(picocolors3.red("Usage: trie patterns save <target> [note]"));
2284
+ console.log(picocolors3.dim("\nExamples:"));
2285
+ console.log(' trie patterns save "path/to/file.ts" "Short note about why it worked"');
2286
+ console.log(' trie patterns save "path/*" "Folder structure that worked well"');
2287
+ console.log(' trie patterns save security "Scout that caught issues early"');
2288
+ process.exit(1);
2289
+ }
2290
+ const savedPattern = await createSavedPattern(target, note, workDir);
2291
+ await savePatternToProject(savedPattern, workDir);
2292
+ console.log(picocolors3.green(`\u2713 Pattern saved: ${target}`));
2293
+ if (note) {
2294
+ console.log(picocolors3.dim(` Note: ${note}`));
2295
+ }
2296
+ console.log(picocolors3.dim(` Type: ${savedPattern.type}`));
2297
+ console.log(picocolors3.dim(` Export with: trie patterns export`));
2298
+ }
2299
+ async function handleListPatterns(args, workDir) {
2300
+ const filter = args[0]?.toLowerCase();
2301
+ const patterns = await loadSavedPatterns(workDir);
2302
+ let filtered = patterns;
2303
+ if (filter === "validated" || filter === "saved") {
2304
+ filtered = patterns.filter((p) => filter === "validated" ? p.validated : true);
2305
+ }
2306
+ if (filtered.length === 0) {
2307
+ console.log(picocolors3.yellow("No saved patterns found."));
2308
+ console.log(picocolors3.dim("Save patterns with: trie patterns save <target> [note]"));
2309
+ return;
2310
+ }
2311
+ console.log(picocolors3.bold(`
2312
+ \u{1F4CB} Saved Patterns (${filtered.length})
2313
+ `));
2314
+ for (const pattern of filtered) {
2315
+ const typeEmoji = {
2316
+ "file-structure": "\u{1F4C1}",
2317
+ "code-pattern": "\u{1F4BB}",
2318
+ "detection-rule": "\u{1F50D}"
2319
+ }[pattern.type] || "\u{1F4CC}";
2320
+ console.log(`${typeEmoji} ${picocolors3.bold(pattern.name)}`);
2321
+ console.log(` Type: ${pattern.type}`);
2322
+ if (pattern.description) {
2323
+ console.log(` ${picocolors3.dim(pattern.description)}`);
2324
+ }
2325
+ if (pattern.validated) {
2326
+ console.log(` ${picocolors3.green("\u2713 Validated")}`);
2327
+ if (pattern.validationNotes) {
2328
+ console.log(` ${picocolors3.dim(pattern.validationNotes)}`);
2329
+ }
2330
+ }
2331
+ console.log(` Projects: ${pattern.projects.join(", ")}`);
2332
+ console.log("");
2333
+ }
2334
+ }
2335
+ async function handleExportPatterns(args, workDir) {
2336
+ const outputPath = args[0] || "trie-patterns.json";
2337
+ const filter = args[1]?.toLowerCase();
2338
+ let patterns = await loadSavedPatterns(workDir);
2339
+ if (filter === "validated" || filter === "saved") {
2340
+ patterns = patterns.filter((p) => filter === "validated" ? p.validated : true);
2341
+ }
2342
+ if (patterns.length === 0) {
2343
+ console.error(picocolors3.yellow("No patterns to export."));
2344
+ return;
2345
+ }
2346
+ const exportData = {
2347
+ version: "1.0",
2348
+ exportedAt: (/* @__PURE__ */ new Date()).toISOString(),
2349
+ exportedFrom: basename(workDir),
2350
+ patterns
2351
+ };
2352
+ await writeFile2(outputPath, JSON.stringify(exportData, null, 2));
2353
+ console.log(picocolors3.green(`\u2713 Exported ${patterns.length} patterns to ${outputPath}`));
2354
+ console.log(picocolors3.dim(` Import to another project with: trie patterns import ${outputPath}`));
2355
+ }
2356
+ async function handleImportPatterns(args, workDir) {
2357
+ const inputPath = args[0];
2358
+ if (!inputPath) {
2359
+ console.error(picocolors3.red("Usage: trie patterns import <path-to-patterns.json>"));
2360
+ process.exit(1);
2361
+ }
2362
+ if (!existsSync3(inputPath)) {
2363
+ console.error(picocolors3.red(`File not found: ${inputPath}`));
2364
+ process.exit(1);
2365
+ }
2366
+ const content = await readFile2(inputPath, "utf-8");
2367
+ const importData = JSON.parse(content);
2368
+ if (!importData.patterns || !Array.isArray(importData.patterns)) {
2369
+ console.error(picocolors3.red("Invalid pattern file format."));
2370
+ process.exit(1);
2371
+ }
2372
+ const existingPatterns = await loadSavedPatterns(workDir);
2373
+ const projectName = basename(workDir);
2374
+ let imported = 0;
2375
+ let skipped = 0;
2376
+ for (const pattern of importData.patterns) {
2377
+ const existing = existingPatterns.find((p) => p.id === pattern.id);
2378
+ if (existing) {
2379
+ if (!existing.projects.includes(projectName)) {
2380
+ existing.projects.push(projectName);
2381
+ }
2382
+ existing.occurrences++;
2383
+ skipped++;
2384
+ } else {
2385
+ const newPattern = {
2386
+ ...pattern,
2387
+ projects: [...pattern.projects, projectName],
2388
+ savedBy: importData.exportedFrom || "unknown"
2389
+ };
2390
+ existingPatterns.push(newPattern);
2391
+ imported++;
2392
+ }
2393
+ }
2394
+ await savePatternsToProject(existingPatterns, workDir);
2395
+ console.log(picocolors3.green(`\u2713 Imported ${imported} new patterns`));
2396
+ if (skipped > 0) {
2397
+ console.log(picocolors3.dim(` Updated ${skipped} existing patterns`));
2398
+ }
2399
+ console.log(picocolors3.dim(` Total patterns: ${existingPatterns.length}`));
2400
+ }
2401
+ async function handleValidatePattern(args, workDir) {
2402
+ const patternId = args[0];
2403
+ const note = args.slice(1).join(" ") || "Validated - worked well";
2404
+ if (!patternId) {
2405
+ console.error(picocolors3.red("Usage: trie patterns validate <pattern-id> [note]"));
2406
+ process.exit(1);
2407
+ }
2408
+ const patterns = await loadSavedPatterns(workDir);
2409
+ const pattern = patterns.find((p) => p.id === patternId || p.name === patternId);
2410
+ if (!pattern) {
2411
+ console.error(picocolors3.red(`Pattern not found: ${patternId}`));
2412
+ console.log(picocolors3.dim("List patterns with: trie patterns list"));
2413
+ process.exit(1);
2414
+ }
2415
+ pattern.validated = true;
2416
+ pattern.validationNotes = note;
2417
+ await savePatternsToProject(patterns, workDir);
2418
+ console.log(picocolors3.green(`\u2713 Pattern validated: ${pattern.name}`));
2419
+ console.log(picocolors3.dim(` Note: ${note}`));
2420
+ }
2421
+ function showPatternsHelp() {
2422
+ console.log(`
2423
+ ${picocolors3.bold("Pattern Management")}
2424
+
2425
+ Save, validate, and share patterns that worked well across projects.
2426
+
2427
+ ${picocolors3.bold("Commands:")}
2428
+ trie patterns save <target> [note] Save a pattern (file, code, or scout)
2429
+ trie patterns list [--validated] List saved patterns
2430
+ trie patterns export [file] [--validated] Export patterns to JSON
2431
+ trie patterns import <file> Import patterns from JSON
2432
+ trie patterns validate <id> [note] Mark pattern as validated
2433
+
2434
+ ${picocolors3.bold("Examples:")}
2435
+ # Save a file structure pattern
2436
+ trie patterns save "path/*" "This folder structure worked well"
2437
+
2438
+ # Save a code pattern
2439
+ trie patterns save path/to/file.ts "This error handling prevented bugs"
2440
+
2441
+ # Save a detection rule
2442
+ trie patterns save security "This scout caught issues early"
2443
+
2444
+ # Validate a pattern
2445
+ trie patterns validate pattern-abc123 "Worked great in production"
2446
+
2447
+ # Export validated patterns
2448
+ trie patterns export patterns.json --validated
2449
+
2450
+ # Import to another project
2451
+ cd ../another-project
2452
+ trie patterns import ../source-project/patterns.json
2453
+
2454
+ ${picocolors3.dim("Patterns are saved in .trie/saved-patterns.json")}
2455
+ `);
2456
+ }
2457
+
2241
2458
  // src/cli/main.ts
2242
2459
  var __filename2 = fileURLToPath(import.meta.url);
2243
2460
  var __dirname2 = dirname(__filename2);
@@ -2296,6 +2513,7 @@ COMMANDS:
2296
2513
  skills Manage external skills from skills.sh
2297
2514
  audit View security audit logs
2298
2515
  memory Search and manage issue memory
2516
+ patterns Save, validate, and share patterns across projects
2299
2517
  status Quick health check (project health + memory stats)
2300
2518
  project View/manage project info (.trie/PROJECT.md)
2301
2519
  scouts List all available scouts
@@ -2434,7 +2652,7 @@ BUILT-IN SCOUTS:
2434
2652
  Custom Skills:
2435
2653
  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
2436
2654
  const skillsDir = join2(getWorkingDirectory(void 0, true), ".trie", "agents");
2437
- if (existsSync3(skillsDir)) {
2655
+ if (existsSync4(skillsDir)) {
2438
2656
  try {
2439
2657
  const { readdirSync } = __require("fs");
2440
2658
  const files = readdirSync(skillsDir).filter((f) => f.endsWith(".json"));
@@ -2778,6 +2996,10 @@ async function main() {
2778
2996
  case "predict":
2779
2997
  handleGotchaCommand();
2780
2998
  break;
2999
+ case "patterns":
3000
+ case "pattern":
3001
+ handlePatternsCommand(restArgs);
3002
+ break;
2781
3003
  default:
2782
3004
  if (command.startsWith("-")) {
2783
3005
  const { spawn } = __require("child_process");