@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/README.md +88 -12
- package/dist/{chunk-4UVTFL2T.js → chunk-4CYQGEWE.js} +2 -2
- package/dist/{chunk-KERQ4JXR.js → chunk-HNDHVFA3.js} +35 -3
- package/dist/chunk-HNDHVFA3.js.map +1 -0
- package/dist/{chunk-4U3DNRUA.js → chunk-YSES743V.js} +203 -3
- package/dist/chunk-YSES743V.js.map +1 -0
- package/dist/cli/main.js +227 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +2 -2
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-4U3DNRUA.js.map +0 -1
- package/dist/chunk-KERQ4JXR.js.map +0 -1
- /package/dist/{chunk-4UVTFL2T.js.map → chunk-4CYQGEWE.js.map} +0 -0
package/dist/cli/main.js
CHANGED
|
@@ -17,9 +17,10 @@ import {
|
|
|
17
17
|
shouldAutoFix,
|
|
18
18
|
shouldBlockPush,
|
|
19
19
|
trackIssueOccurrence
|
|
20
|
-
} from "../chunk-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
|
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 (
|
|
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");
|