universal-agent-memory 4.2.0 → 4.4.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.
@@ -0,0 +1,587 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
4
+ import { join, dirname } from 'path';
5
+ import { execSync } from 'child_process';
6
+ import { QdrantClient } from '@qdrant/js-client-rest';
7
+ import { AgentContextConfigSchema } from '../types/index.js';
8
+ /**
9
+ * Load .uam.json config from the current working directory.
10
+ */
11
+ function loadConfig(cwd) {
12
+ const configPath = join(cwd, '.uam.json');
13
+ if (!existsSync(configPath)) {
14
+ console.log(chalk.red(' No .uam.json found. Run `uam init` first.'));
15
+ return null;
16
+ }
17
+ const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
18
+ return AgentContextConfigSchema.parse(raw);
19
+ }
20
+ /**
21
+ * Get pattern RAG settings from config, with defaults.
22
+ */
23
+ function getPatternRagConfig(config) {
24
+ return {
25
+ enabled: config.memory?.patternRag?.enabled ?? false,
26
+ collection: config.memory?.patternRag?.collection ?? 'agent_patterns',
27
+ embeddingModel: config.memory?.patternRag?.embeddingModel ?? 'all-MiniLM-L6-v2',
28
+ vectorSize: config.memory?.patternRag?.vectorSize ?? 384,
29
+ scoreThreshold: config.memory?.patternRag?.scoreThreshold ?? 0.35,
30
+ topK: config.memory?.patternRag?.topK ?? 2,
31
+ indexScript: config.memory?.patternRag?.indexScript ?? './agents/scripts/index_patterns_to_qdrant.py',
32
+ queryScript: config.memory?.patternRag?.queryScript ?? './agents/scripts/query_patterns.py',
33
+ sourceFile: config.memory?.patternRag?.sourceFile ?? 'CLAUDE.md',
34
+ maxBodyChars: config.memory?.patternRag?.maxBodyChars ?? 400,
35
+ };
36
+ }
37
+ /**
38
+ * Resolve the Qdrant endpoint from config.
39
+ */
40
+ function getQdrantEndpoint(config) {
41
+ const endpoint = config.memory?.longTerm?.endpoint || 'localhost:6333';
42
+ return endpoint.startsWith('http://') || endpoint.startsWith('https://') ? endpoint : `http://${endpoint}`;
43
+ }
44
+ /**
45
+ * Find a working Python with sentence-transformers available.
46
+ */
47
+ export function findPython(cwd) {
48
+ const candidates = [
49
+ join(cwd, 'agents', '.venv', 'bin', 'python'),
50
+ join(cwd, '.venv', 'bin', 'python'),
51
+ 'python3',
52
+ 'python',
53
+ ];
54
+ for (const py of candidates) {
55
+ try {
56
+ execSync(`${py} -c "import sentence_transformers" 2>/dev/null`, { cwd, stdio: 'pipe' });
57
+ return py;
58
+ }
59
+ catch {
60
+ // Try next candidate
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+ /**
66
+ * Bootstrap a Python venv at agents/.venv with sentence-transformers + qdrant-client.
67
+ * Returns the python binary path on success, null on failure.
68
+ * Best-effort: doesn't throw.
69
+ */
70
+ export function ensurePythonVenv(cwd) {
71
+ const venvDir = join(cwd, 'agents', '.venv');
72
+ const venvPython = join(venvDir, 'bin', 'python');
73
+ // If venv already has the deps, return immediately
74
+ try {
75
+ execSync(`${venvPython} -c "import sentence_transformers; import qdrant_client"`, { cwd, stdio: 'pipe' });
76
+ return venvPython;
77
+ }
78
+ catch {
79
+ // Need to create or install deps
80
+ }
81
+ // Find a system python3 to create the venv
82
+ let systemPython = null;
83
+ for (const candidate of ['python3', 'python']) {
84
+ try {
85
+ execSync(`${candidate} --version`, { stdio: 'pipe' });
86
+ systemPython = candidate;
87
+ break;
88
+ }
89
+ catch {
90
+ // try next
91
+ }
92
+ }
93
+ if (!systemPython)
94
+ return null;
95
+ try {
96
+ // Create venv if it doesn't exist
97
+ if (!existsSync(venvPython)) {
98
+ execSync(`${systemPython} -m venv ${venvDir}`, { cwd, stdio: 'pipe', timeout: 30000 });
99
+ }
100
+ // Install deps (uses hardcoded package names, no user input)
101
+ execSync(`${venvPython} -m pip install --quiet sentence-transformers qdrant-client`, {
102
+ cwd,
103
+ stdio: 'pipe',
104
+ timeout: 300000, // 5 min for large deps
105
+ });
106
+ return venvPython;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ export async function patternsCommand(action, options = {}) {
113
+ const cwd = process.cwd();
114
+ switch (action) {
115
+ case 'status':
116
+ await showPatternStatus(cwd);
117
+ break;
118
+ case 'index':
119
+ await indexPatterns(cwd, options);
120
+ break;
121
+ case 'query':
122
+ await queryPatterns(cwd, options);
123
+ break;
124
+ case 'generate':
125
+ await generateScripts(cwd, options);
126
+ break;
127
+ }
128
+ }
129
+ /**
130
+ * Show pattern RAG status: collection info, pattern count, last indexed.
131
+ */
132
+ async function showPatternStatus(cwd) {
133
+ console.log(chalk.bold('\n=== Pattern RAG Status ===\n'));
134
+ const config = loadConfig(cwd);
135
+ if (!config)
136
+ return;
137
+ const rag = getPatternRagConfig(config);
138
+ console.log(` ${chalk.dim('Enabled:')} ${rag.enabled ? chalk.green('yes') : chalk.yellow('no')}`);
139
+ console.log(` ${chalk.dim('Collection:')} ${rag.collection}`);
140
+ console.log(` ${chalk.dim('Embedding:')} ${rag.embeddingModel}`);
141
+ console.log(` ${chalk.dim('Score Threshold:')} ${rag.scoreThreshold}`);
142
+ console.log(` ${chalk.dim('Top-K:')} ${rag.topK}`);
143
+ console.log(` ${chalk.dim('Source:')} ${rag.sourceFile}`);
144
+ console.log('');
145
+ // Check Qdrant collection
146
+ const url = getQdrantEndpoint(config);
147
+ try {
148
+ const client = new QdrantClient({ url });
149
+ const collections = await client.getCollections();
150
+ const found = collections.collections.find(c => c.name === rag.collection);
151
+ if (found) {
152
+ const info = await client.getCollection(rag.collection);
153
+ console.log(chalk.green(` Qdrant collection '${rag.collection}':`));
154
+ console.log(` Points: ${info.points_count ?? 'unknown'}`);
155
+ console.log(` Indexed: ${info.indexed_vectors_count ?? 'unknown'}`);
156
+ console.log(` Status: ${info.status}`);
157
+ }
158
+ else {
159
+ console.log(chalk.yellow(` Collection '${rag.collection}' not found.`));
160
+ console.log(chalk.dim(' Run `uam patterns index` to create it.'));
161
+ }
162
+ }
163
+ catch {
164
+ console.log(chalk.dim(' Qdrant not available. Run `uam memory start` first.'));
165
+ }
166
+ // Check Python + scripts
167
+ const python = findPython(cwd);
168
+ console.log('');
169
+ console.log(` ${chalk.dim('Python:')} ${python ? chalk.green(python) : chalk.red('not found')}`);
170
+ console.log(` ${chalk.dim('Index script:')} ${existsSync(join(cwd, rag.indexScript)) ? chalk.green('found') : chalk.yellow('missing')}`);
171
+ console.log(` ${chalk.dim('Query script:')} ${existsSync(join(cwd, rag.queryScript)) ? chalk.green('found') : chalk.yellow('missing')}`);
172
+ console.log('');
173
+ }
174
+ /**
175
+ * Index patterns from CLAUDE.md into the Qdrant collection.
176
+ * Uses the Python index script if available.
177
+ */
178
+ async function indexPatterns(cwd, options) {
179
+ const config = loadConfig(cwd);
180
+ if (!config)
181
+ return;
182
+ const rag = getPatternRagConfig(config);
183
+ const spinner = ora('Indexing patterns...').start();
184
+ // Prefer the Python script if it exists
185
+ const scriptPath = join(cwd, rag.indexScript);
186
+ if (existsSync(scriptPath)) {
187
+ const python = findPython(cwd);
188
+ if (!python) {
189
+ spinner.fail('Python with sentence-transformers not found.');
190
+ console.log(chalk.dim(' Install: pip install sentence-transformers qdrant-client'));
191
+ console.log(chalk.dim(' Or create venv: python3 -m venv agents/.venv && agents/.venv/bin/pip install sentence-transformers qdrant-client'));
192
+ return;
193
+ }
194
+ try {
195
+ const output = execSync(`${python} ${scriptPath}`, { cwd, encoding: 'utf-8', timeout: 120000 });
196
+ spinner.succeed('Patterns indexed successfully.');
197
+ if (options.verbose) {
198
+ console.log(chalk.dim(output));
199
+ }
200
+ else {
201
+ // Extract summary line
202
+ const summaryMatch = output.match(/Total: (\d+) documents/);
203
+ if (summaryMatch) {
204
+ console.log(chalk.green(` ${summaryMatch[0]}`));
205
+ }
206
+ }
207
+ }
208
+ catch (err) {
209
+ spinner.fail('Pattern indexing failed.');
210
+ if (err instanceof Error) {
211
+ console.log(chalk.red(` ${err.message.split('\n').slice(0, 3).join('\n ')}`));
212
+ }
213
+ }
214
+ return;
215
+ }
216
+ // No script found - offer to generate
217
+ spinner.warn('Index script not found.');
218
+ console.log(chalk.dim(` Expected: ${rag.indexScript}`));
219
+ console.log(chalk.dim(' Run `uam patterns generate` to create the scripts.'));
220
+ }
221
+ /**
222
+ * Query patterns from the Qdrant collection.
223
+ * Uses the Python query script for real semantic embeddings.
224
+ */
225
+ async function queryPatterns(cwd, options) {
226
+ const search = options.search;
227
+ if (!search) {
228
+ console.log(chalk.red(' Search term required. Usage: uam patterns query <search>'));
229
+ return;
230
+ }
231
+ const config = loadConfig(cwd);
232
+ if (!config)
233
+ return;
234
+ const rag = getPatternRagConfig(config);
235
+ const topK = parseInt(options.top || String(rag.topK));
236
+ const minScore = parseFloat(options.minScore || String(rag.scoreThreshold));
237
+ const format = options.format || 'text';
238
+ // Prefer Python script for real embeddings
239
+ const scriptPath = join(cwd, rag.queryScript);
240
+ if (existsSync(scriptPath)) {
241
+ const python = findPython(cwd);
242
+ if (!python) {
243
+ console.log(chalk.red(' Python with sentence-transformers not found.'));
244
+ return;
245
+ }
246
+ try {
247
+ const output = execSync(`${python} ${scriptPath} ${JSON.stringify(search)} --top ${topK} --min-score ${minScore} --format ${format}`, { cwd, encoding: 'utf-8', timeout: 30000 });
248
+ if (format === 'json') {
249
+ // Parse and pretty-print
250
+ const patterns = JSON.parse(output);
251
+ if (patterns.length === 0) {
252
+ console.log(chalk.yellow(' No matching patterns found.'));
253
+ return;
254
+ }
255
+ for (const p of patterns) {
256
+ const abbr = p.abbreviation ? ` (${p.abbreviation})` : '';
257
+ console.log(`\n ${chalk.green(`[${p.score.toFixed(3)}]`)} ${chalk.bold(`P${p.id}: ${p.title}${abbr}`)}`);
258
+ console.log(` ${chalk.dim(p.body.slice(0, rag.maxBodyChars))}${p.body.length > rag.maxBodyChars ? '...' : ''}`);
259
+ }
260
+ }
261
+ else {
262
+ console.log(output);
263
+ }
264
+ }
265
+ catch (err) {
266
+ if (err instanceof Error && err.message.includes('Connection refused')) {
267
+ console.log(chalk.dim(' Qdrant not available. Run `uam memory start` first.'));
268
+ }
269
+ else {
270
+ console.log(chalk.red(' Pattern query failed.'));
271
+ if (err instanceof Error) {
272
+ console.log(chalk.dim(` ${err.message.split('\n').slice(0, 2).join('\n ')}`));
273
+ }
274
+ }
275
+ }
276
+ return;
277
+ }
278
+ // Fallback: direct Qdrant query with keyword matching
279
+ console.log(chalk.yellow(' Query script not found. Using fallback keyword search (less accurate).'));
280
+ console.log(chalk.dim(` For semantic search, run \`uam patterns generate\` to create the Python scripts.\n`));
281
+ try {
282
+ const url = getQdrantEndpoint(config);
283
+ const client = new QdrantClient({ url });
284
+ const collections = await client.getCollections();
285
+ const found = collections.collections.some(c => c.name === rag.collection);
286
+ if (!found) {
287
+ console.log(chalk.yellow(` Collection '${rag.collection}' not found.`));
288
+ console.log(chalk.dim(' Run `uam patterns index` first.'));
289
+ return;
290
+ }
291
+ // Scroll through all points and do keyword matching as fallback
292
+ const result = await client.scroll(rag.collection, { limit: 100, with_payload: true });
293
+ const keywords = search.toLowerCase().split(/\s+/);
294
+ const matches = result.points
295
+ .map(p => {
296
+ const payload = p.payload;
297
+ const title = String(payload.title || '').toLowerCase();
298
+ const body = String(payload.body || '').toLowerCase();
299
+ const kws = payload.keywords || [];
300
+ let score = 0;
301
+ for (const kw of keywords) {
302
+ if (title.includes(kw))
303
+ score += 2;
304
+ if (body.includes(kw))
305
+ score += 1;
306
+ if (kws.some(k => k.includes(kw)))
307
+ score += 1.5;
308
+ }
309
+ return { id: p.id, title: payload.title, body: payload.body, abbreviation: payload.abbreviation, score };
310
+ })
311
+ .filter(m => m.score > 0)
312
+ .sort((a, b) => b.score - a.score)
313
+ .slice(0, topK);
314
+ if (matches.length === 0) {
315
+ console.log(chalk.yellow(' No matching patterns found.'));
316
+ return;
317
+ }
318
+ for (const m of matches) {
319
+ const abbr = m.abbreviation ? ` (${m.abbreviation})` : '';
320
+ console.log(`\n ${chalk.green(`[${m.score.toFixed(1)}]`)} ${chalk.bold(`P${m.id}: ${m.title}${abbr}`)}`);
321
+ const body = String(m.body || '');
322
+ console.log(` ${chalk.dim(body.slice(0, rag.maxBodyChars))}${body.length > rag.maxBodyChars ? '...' : ''}`);
323
+ }
324
+ console.log('');
325
+ }
326
+ catch {
327
+ console.log(chalk.dim(' Qdrant not available. Run `uam memory start` first.'));
328
+ }
329
+ }
330
+ /**
331
+ * Generate the Python index/query scripts for pattern RAG.
332
+ */
333
+ export async function generateScripts(cwd, options = {}) {
334
+ const config = loadConfig(cwd);
335
+ if (!config)
336
+ return;
337
+ const rag = getPatternRagConfig(config);
338
+ const endpoint = config.memory?.longTerm?.endpoint || 'localhost:6333';
339
+ const endpointUrl = endpoint.startsWith('http') ? new URL(endpoint) : new URL(`http://${endpoint}`);
340
+ const host = endpointUrl.hostname;
341
+ const port = parseInt(endpointUrl.port) || 6333;
342
+ // Generate index script
343
+ const indexPath = join(cwd, rag.indexScript);
344
+ const indexDir = dirname(indexPath);
345
+ if (!existsSync(indexDir)) {
346
+ mkdirSync(indexDir, { recursive: true });
347
+ }
348
+ if (existsSync(indexPath) && !options.force) {
349
+ console.log(chalk.yellow(` Index script already exists: ${rag.indexScript}`));
350
+ console.log(chalk.dim(' Use --force to overwrite.'));
351
+ }
352
+ else {
353
+ writeFileSync(indexPath, generateIndexScript(rag, host, port));
354
+ execSync(`chmod +x ${indexPath}`);
355
+ console.log(chalk.green(` Created: ${rag.indexScript}`));
356
+ }
357
+ // Generate query script
358
+ const queryPath = join(cwd, rag.queryScript);
359
+ const queryDir = dirname(queryPath);
360
+ if (!existsSync(queryDir)) {
361
+ mkdirSync(queryDir, { recursive: true });
362
+ }
363
+ if (existsSync(queryPath) && !options.force) {
364
+ console.log(chalk.yellow(` Query script already exists: ${rag.queryScript}`));
365
+ console.log(chalk.dim(' Use --force to overwrite.'));
366
+ }
367
+ else {
368
+ writeFileSync(queryPath, generateQueryScript(rag, host, port));
369
+ execSync(`chmod +x ${queryPath}`);
370
+ console.log(chalk.green(` Created: ${rag.queryScript}`));
371
+ }
372
+ console.log(chalk.dim('\n Install Python deps: pip install sentence-transformers qdrant-client'));
373
+ }
374
+ function generateIndexScript(rag, host, port) {
375
+ return `#!/usr/bin/env python3
376
+ """
377
+ Extract coding patterns from ${rag.sourceFile} and index them into Qdrant.
378
+
379
+ Creates/updates the '${rag.collection}' collection with embeddings from
380
+ ${rag.embeddingModel} for on-demand retrieval by the Pattern RAG system.
381
+
382
+ Generated by: uam patterns generate
383
+ """
384
+
385
+ import re
386
+ import sys
387
+ import hashlib
388
+ from pathlib import Path
389
+ from datetime import datetime, timezone
390
+
391
+ from sentence_transformers import SentenceTransformer
392
+ from qdrant_client import QdrantClient
393
+ from qdrant_client.models import Distance, VectorParams, PointStruct
394
+
395
+ SOURCE_FILE = Path(__file__).resolve().parents[2] / "${rag.sourceFile}"
396
+ QDRANT_HOST = "${host}"
397
+ QDRANT_PORT = ${port}
398
+ COLLECTION_NAME = "${rag.collection}"
399
+ EMBEDDING_MODEL = "${rag.embeddingModel}"
400
+ VECTOR_SIZE = ${rag.vectorSize}
401
+
402
+
403
+ def extract_patterns(text: str) -> list[dict]:
404
+ patterns = []
405
+ pattern_regex = re.compile(
406
+ r"### Pattern (\\d+): (.+?)(?:\\s*\\((\\w+)\\))?\\n(.*?)(?=\\n### Pattern \\d+:|\\n## |\\n---|\\Z)",
407
+ re.DOTALL,
408
+ )
409
+ for match in pattern_regex.finditer(text):
410
+ number = int(match.group(1))
411
+ title = match.group(2).strip()
412
+ abbreviation = match.group(3) or ""
413
+ body = match.group(4).strip()
414
+ detection = ""
415
+ det_match = re.search(r"\\*\\*Detection\\*\\*:\\s*(.+?)(?:\\n\\n|\\n\\*\\*)", body, re.DOTALL)
416
+ if det_match:
417
+ detection = det_match.group(1).strip()
418
+ if number <= 11:
419
+ category = "universal"
420
+ elif number <= 20:
421
+ category = "execution"
422
+ elif number <= 26:
423
+ category = "domain-specific"
424
+ elif number <= 31:
425
+ category = "verification"
426
+ else:
427
+ category = "advanced-execution"
428
+ keywords = set(title.lower().split())
429
+ if abbreviation:
430
+ keywords.add(abbreviation.lower())
431
+ if len(body) > 2000:
432
+ body = body[:2000] + "\\n... (truncated)"
433
+ patterns.append({
434
+ "id": number, "title": title, "abbreviation": abbreviation,
435
+ "category": category, "detection": detection,
436
+ "keywords": list(keywords), "body": body,
437
+ "content_hash": hashlib.md5(body.encode()).hexdigest(),
438
+ })
439
+ return patterns
440
+
441
+
442
+ def index_to_qdrant(patterns: list[dict]) -> None:
443
+ client = QdrantClient(host=QDRANT_HOST, port=QDRANT_PORT)
444
+ model = SentenceTransformer(EMBEDDING_MODEL)
445
+ collections = [c.name for c in client.get_collections().collections]
446
+ if COLLECTION_NAME in collections:
447
+ client.delete_collection(COLLECTION_NAME)
448
+ print(f" Deleted existing '{COLLECTION_NAME}' collection")
449
+ client.create_collection(
450
+ collection_name=COLLECTION_NAME,
451
+ vectors_config=VectorParams(size=VECTOR_SIZE, distance=Distance.COSINE),
452
+ )
453
+ print(f" Created '{COLLECTION_NAME}' collection ({VECTOR_SIZE}-dim cosine)")
454
+ points = []
455
+ for p in patterns:
456
+ embed_text = f"{p['title']}. {p['abbreviation']}. {p['detection']}. {p['body'][:500]}"
457
+ vector = model.encode(embed_text).tolist()
458
+ points.append(PointStruct(
459
+ id=p["id"], vector=vector,
460
+ payload={
461
+ "title": p["title"], "abbreviation": p["abbreviation"],
462
+ "category": p["category"], "detection": p["detection"],
463
+ "keywords": p["keywords"], "body": p["body"],
464
+ "content_hash": p["content_hash"],
465
+ "indexed_at": datetime.now(tz=timezone.utc).isoformat(),
466
+ },
467
+ ))
468
+ client.upsert(collection_name=COLLECTION_NAME, points=points)
469
+ print(f" Indexed {len(points)} patterns")
470
+
471
+
472
+ def main():
473
+ print("=== UAM Pattern Indexer ===")
474
+ if not SOURCE_FILE.exists():
475
+ print(f"ERROR: {SOURCE_FILE} not found")
476
+ sys.exit(1)
477
+ text = SOURCE_FILE.read_text()
478
+ print(f" Read {SOURCE_FILE.name} ({len(text)} bytes)")
479
+ patterns = extract_patterns(text)
480
+ print(f" Extracted {len(patterns)} patterns")
481
+ index_to_qdrant(patterns)
482
+ print(f"\\nTotal: {len(patterns)} documents in '{COLLECTION_NAME}' collection")
483
+
484
+
485
+ if __name__ == "__main__":
486
+ main()
487
+ `;
488
+ }
489
+ function generateQueryScript(rag, host, port) {
490
+ return `#!/usr/bin/env python3
491
+ """
492
+ Query the ${rag.collection} Qdrant collection for task-relevant patterns.
493
+
494
+ Generated by: uam patterns generate
495
+ """
496
+
497
+ import argparse
498
+ import json
499
+ import sys
500
+
501
+ from sentence_transformers import SentenceTransformer
502
+ from qdrant_client import QdrantClient
503
+
504
+ QDRANT_HOST = "${host}"
505
+ QDRANT_PORT = ${port}
506
+ COLLECTION_NAME = "${rag.collection}"
507
+ EMBEDDING_MODEL = "${rag.embeddingModel}"
508
+
509
+ _model = None
510
+
511
+
512
+ def get_model():
513
+ global _model
514
+ if _model is None:
515
+ _model = SentenceTransformer(EMBEDDING_MODEL)
516
+ return _model
517
+
518
+
519
+ def query_patterns(query: str, top_k: int = ${rag.topK}, min_score: float = ${rag.scoreThreshold}) -> list[dict]:
520
+ client = QdrantClient(host=QDRANT_HOST, port=QDRANT_PORT)
521
+ model = get_model()
522
+ vector = model.encode(query).tolist()
523
+ results = client.query_points(
524
+ collection_name=COLLECTION_NAME,
525
+ query=vector,
526
+ limit=top_k,
527
+ score_threshold=min_score,
528
+ )
529
+ patterns = []
530
+ for hit in results.points:
531
+ patterns.append({
532
+ "id": hit.id,
533
+ "score": round(hit.score, 4),
534
+ "title": hit.payload.get("title", ""),
535
+ "abbreviation": hit.payload.get("abbreviation", ""),
536
+ "category": hit.payload.get("category", ""),
537
+ "body": hit.payload.get("body", ""),
538
+ })
539
+ return patterns
540
+
541
+
542
+ def format_for_context(patterns: list[dict]) -> str:
543
+ if not patterns:
544
+ return ""
545
+ lines = ["<uam-patterns>"]
546
+ for p in patterns:
547
+ abbr = f" ({p['abbreviation']})" if p["abbreviation"] else ""
548
+ lines.append(f"### Pattern {p['id']}: {p['title']}{abbr}")
549
+ lines.append(f"Relevance: {p['score']}")
550
+ lines.append(p["body"])
551
+ lines.append("")
552
+ lines.append("</uam-patterns>")
553
+ return "\\n".join(lines)
554
+
555
+
556
+ def main():
557
+ parser = argparse.ArgumentParser(description="Query UAM pattern collection")
558
+ parser.add_argument("query", help="Task description to match patterns against")
559
+ parser.add_argument("--top", type=int, default=${rag.topK})
560
+ parser.add_argument("--min-score", type=float, default=${rag.scoreThreshold})
561
+ parser.add_argument("--format", choices=["text", "json", "context"], default="text")
562
+ args = parser.parse_args()
563
+ try:
564
+ patterns = query_patterns(args.query, top_k=args.top, min_score=args.min_score)
565
+ except Exception as e:
566
+ print(f"ERROR: {e}", file=sys.stderr)
567
+ sys.exit(1)
568
+ if args.format == "json":
569
+ print(json.dumps(patterns, indent=2))
570
+ elif args.format == "context":
571
+ print(format_for_context(patterns))
572
+ else:
573
+ if not patterns:
574
+ print("No matching patterns found.")
575
+ return
576
+ for p in patterns:
577
+ abbr = f" ({p['abbreviation']})" if p["abbreviation"] else ""
578
+ print(f"[{p['score']:.3f}] P{p['id']}: {p['title']}{abbr} [{p['category']}]")
579
+ print(f" {p['body'][:200]}...")
580
+ print()
581
+
582
+
583
+ if __name__ == "__main__":
584
+ main()
585
+ `;
586
+ }
587
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/cli/patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface SetupOptions {
2
+ platform?: string[];
3
+ patterns?: boolean;
4
+ memory?: boolean;
5
+ }
6
+ /**
7
+ * One-command setup: init + start services + venv + index patterns.
8
+ * Chains existing commands so everything "just works".
9
+ */
10
+ export declare function setupCommand(options: SetupOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAUA,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFvE"}