claude-launchpad 1.5.0 → 1.6.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.
Files changed (28) hide show
  1. package/dist/{chunk-5YUKTNBM.js → chunk-LOUSTE6C.js} +2 -2
  2. package/dist/{chunk-WLD2PA3B.js → chunk-WUJWETUJ.js} +12 -1
  3. package/dist/chunk-WUJWETUJ.js.map +1 -0
  4. package/dist/{chunk-MQJA7TGY.js → chunk-ZI2PZSG4.js} +88 -2
  5. package/dist/chunk-ZI2PZSG4.js.map +1 -0
  6. package/dist/cli.js +9 -9
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/memory/server.js +6 -72
  9. package/dist/commands/memory/server.js.map +1 -1
  10. package/dist/{context-4X4CLMU3.js → context-DQQGQ767.js} +71 -7
  11. package/dist/context-DQQGQ767.js.map +1 -0
  12. package/dist/{install-P4TFYUJT.js → install-MTDWI6RO.js} +2 -2
  13. package/dist/{pull-7SR7P3US.js → pull-O6TLQGAQ.js} +3 -3
  14. package/dist/{push-SCTO5TZQ.js → push-VDADQVA5.js} +3 -3
  15. package/dist/{stats-MLWRNOHU.js → stats-OJEG5W2D.js} +3 -3
  16. package/dist/{sync-status-J7BVY6KF.js → sync-status-IN5434DI.js} +3 -3
  17. package/dist/{tui-JE5L7SXC.js → tui-DQD26BU6.js} +2 -2
  18. package/package.json +1 -2
  19. package/dist/chunk-MQJA7TGY.js.map +0 -1
  20. package/dist/chunk-WLD2PA3B.js.map +0 -1
  21. package/dist/context-4X4CLMU3.js.map +0 -1
  22. /package/dist/{chunk-5YUKTNBM.js.map → chunk-LOUSTE6C.js.map} +0 -0
  23. /package/dist/{install-P4TFYUJT.js.map → install-MTDWI6RO.js.map} +0 -0
  24. /package/dist/{pull-7SR7P3US.js.map → pull-O6TLQGAQ.js.map} +0 -0
  25. /package/dist/{push-SCTO5TZQ.js.map → push-VDADQVA5.js.map} +0 -0
  26. /package/dist/{stats-MLWRNOHU.js.map → stats-OJEG5W2D.js.map} +0 -0
  27. /package/dist/{sync-status-J7BVY6KF.js.map → sync-status-IN5434DI.js.map} +0 -0
  28. /package/dist/{tui-JE5L7SXC.js.map → tui-DQD26BU6.js.map} +0 -0
@@ -10,7 +10,7 @@ import {
10
10
  loadConfig,
11
11
  migrate,
12
12
  resolveDataDir
13
- } from "./chunk-WLD2PA3B.js";
13
+ } from "./chunk-WUJWETUJ.js";
14
14
 
15
15
  // src/commands/memory/subcommands/init-storage.ts
16
16
  function initStorage(dbPath) {
@@ -32,4 +32,4 @@ function initStorage(dbPath) {
32
32
  export {
33
33
  initStorage
34
34
  };
35
- //# sourceMappingURL=chunk-5YUKTNBM.js.map
35
+ //# sourceMappingURL=chunk-LOUSTE6C.js.map
@@ -92,6 +92,13 @@ var INJECTION_COLD_START_RAMP_END = 20;
92
92
  var INJECTION_HEADER_TOKENS = 50;
93
93
  var INJECTION_MAX_SAME_TYPE_FULL = 2;
94
94
  var INJECTION_PINNED_BUDGET_PCT = 0.1;
95
+ var INJECTION_PINNED_IMPORTANCE = 0.8;
96
+ var INJECTION_MMR_LAMBDA = 0.7;
97
+ var INJECTION_MMR_MAX_RERANK = 50;
98
+ var INJECTION_MMR_SIM_WEIGHTS = {
99
+ content: 0.6,
100
+ tags: 0.4
101
+ };
95
102
  function resolveDataDir(dataDir) {
96
103
  if (dataDir.startsWith("~")) {
97
104
  return join(homedir(), dataDir.slice(1));
@@ -345,6 +352,10 @@ export {
345
352
  INJECTION_HEADER_TOKENS,
346
353
  INJECTION_MAX_SAME_TYPE_FULL,
347
354
  INJECTION_PINNED_BUDGET_PCT,
355
+ INJECTION_PINNED_IMPORTANCE,
356
+ INJECTION_MMR_LAMBDA,
357
+ INJECTION_MMR_MAX_RERANK,
358
+ INJECTION_MMR_SIM_WEIGHTS,
348
359
  resolveDataDir,
349
360
  loadConfig,
350
361
  estimateTokens,
@@ -352,4 +363,4 @@ export {
352
363
  closeDatabase,
353
364
  migrate
354
365
  };
355
- //# sourceMappingURL=chunk-WLD2PA3B.js.map
366
+ //# sourceMappingURL=chunk-WUJWETUJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/config.ts","../src/commands/memory/storage/database.ts","../src/commands/memory/storage/migrations/001-initial.ts","../src/commands/memory/storage/migrations/002-add-project.ts","../src/commands/memory/storage/migrations/003-add-content-hash.ts","../src/commands/memory/storage/migrations/004-add-tombstones.ts","../src/commands/memory/storage/migrator.ts"],"sourcesContent":["import { z } from 'zod';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { DecayParams } from './types.js';\n\n// ── Config Schema ─────────────────────────────────────────────\n\nconst ConfigSchema = z.object({\n dataDir: z.string().default('~/.agentic-memory'),\n injectionBudget: z.number().int().min(100).max(20000).default(3000),\n consolidationInterval: z.number().int().min(1).default(10),\n enableReranker: z.boolean().default(true),\n logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('warn'),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// ── Defaults ──────────────────────────────────────────────────\n\nexport const DEFAULT_CONFIG: Config = {\n dataDir: '~/.agentic-memory',\n injectionBudget: 3000,\n consolidationInterval: 10,\n enableReranker: true,\n logLevel: 'warn',\n};\n\nexport const DEFAULT_DECAY_PARAMS: DecayParams = {\n tauByType: {\n working: 0, // cleared each session, tau irrelevant\n episodic: 30, // fast decay (was 60, cognitive science: unrehearsed episodes fade in ~30d)\n semantic: 540, // slow decay (was 365, extracted facts are stable for years)\n procedural: 730, // near-permanent\n pattern: 180, // medium decay\n },\n accessModifiers: [\n { maxCount: 3, multiplier: 1.0 },\n { maxCount: 10, multiplier: 2.0 },\n { maxCount: Infinity, multiplier: 4.0 },\n ],\n relationModifier: {\n connectedThreshold: 3,\n connectedMultiplier: 1.8, // higher tau = slower decay for connected memories\n isolatedMultiplier: 0.8, // lower tau = slightly faster decay for isolated memories\n highlyConnectedThreshold: 6,\n highlyConnectedMultiplier: 2.5, // near-immune: ~2.5x longer effective half-life\n },\n importanceFloor: 0.05,\n pruneThreshold: 0.1,\n pruneMinAgeDays: 90,\n};\n\nexport const SCORING_WEIGHTS = {\n text: 0.35,\n importance: 0.20,\n recency: 0.20,\n access: 0.10,\n context: 0.15,\n} as const;\n\n// ── Injection Algorithm Constants ──────────────────────────────\n\nexport const INJECTION_WEIGHTS = {\n context: 0.30,\n value: 0.25,\n importance: 0.20,\n recency: 0.15,\n typeBonus: 0.05,\n noise: 0.05,\n} as const;\n\nexport const TYPE_INJECTION_BONUS: Record<string, number> = {\n procedural: 1.0,\n pattern: 0.8,\n semantic: 0.6,\n episodic: 0.3,\n working: 0.0,\n};\n\nexport const RECENCY_HALF_LIFE: Record<string, number> = {\n working: 1,\n episodic: 7,\n pattern: 14,\n semantic: 30,\n procedural: 90,\n};\n\nexport const INJECTION_MIN_SCORE = 0.25;\nexport const INJECTION_COLD_START_THRESHOLD = 5;\nexport const INJECTION_COLD_START_RAMP_END = 20;\nexport const INJECTION_HEADER_TOKENS = 50;\nexport const INJECTION_MAX_SAME_TYPE_FULL = 2;\nexport const INJECTION_PINNED_BUDGET_PCT = 0.10;\nexport const INJECTION_PINNED_IMPORTANCE = 0.8;\n\n// MMR diversity re-ranking for non-pinned candidates.\n// lambda=1 ≡ pure relevance, lambda=0 ≡ max diversity.\nexport const INJECTION_MMR_LAMBDA = 0.7;\nexport const INJECTION_MMR_MAX_RERANK = 50;\nexport const INJECTION_MMR_SIM_WEIGHTS = {\n content: 0.6,\n tags: 0.4,\n} as const;\n\n// ── Config Loader ─────────────────────────────────────────────\n\nexport function resolveDataDir(dataDir: string): string {\n if (dataDir.startsWith('~')) {\n return join(homedir(), dataDir.slice(1));\n }\n return dataDir;\n}\n\nexport function loadConfig(overrides?: Partial<Config>): Config {\n const envOverrides: Record<string, unknown> = {};\n\n const envBudget = process.env['AGENTIC_MEMORY_INJECTION_BUDGET'];\n if (envBudget !== undefined) {\n envOverrides['injectionBudget'] = parseInt(envBudget, 10);\n }\n\n const envLogLevel = process.env['AGENTIC_MEMORY_LOG_LEVEL'];\n if (envLogLevel !== undefined) {\n envOverrides['logLevel'] = envLogLevel;\n }\n\n const envDataDir = process.env['AGENTIC_MEMORY_DATA_DIR'];\n if (envDataDir !== undefined) {\n envOverrides['dataDir'] = envDataDir;\n }\n\n // Try loading config.json from data dir\n let fileConfig: Record<string, unknown> = {};\n const baseDir = resolveDataDir(overrides?.dataDir ?? envOverrides['dataDir'] as string ?? DEFAULT_CONFIG.dataDir);\n try {\n const raw = readFileSync(join(baseDir, 'config.json'), 'utf-8');\n fileConfig = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n const isNotFound = err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT';\n if (!isNotFound) {\n // Malformed JSON or permissions error - warn, don't silently ignore\n console.error('[agentic-memory] Failed to load config.json:', err instanceof Error ? err.message : err);\n }\n }\n\n const merged = { ...DEFAULT_CONFIG, ...fileConfig, ...envOverrides, ...overrides };\n return ConfigSchema.parse(merged);\n}\n\n// ── Token Estimation ──────────────────────────────────────────\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","import type DatabaseConstructor from 'better-sqlite3';\nimport { resolveDataDir } from '../config.js';\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { cwdRequire } from '../utils/require-deps.js';\n\nexport interface DatabaseOptions {\n readonly dbPath?: string; // full path override (e.g. ':memory:' for tests)\n readonly dataDir?: string; // resolved data dir (default ~/.agentic-memory)\n}\n\nexport function createDatabase(options: DatabaseOptions = {}): DatabaseConstructor.Database {\n const dbPath = options.dbPath ?? resolveDbPath(options.dataDir);\n\n if (dbPath !== ':memory:') {\n mkdirSync(dirname(dbPath), { recursive: true });\n }\n\n const Database = cwdRequire('better-sqlite3') as typeof DatabaseConstructor;\n const sqliteVec = cwdRequire('sqlite-vec') as { load: (db: DatabaseConstructor.Database) => void };\n\n const db = new Database(dbPath);\n\n // Load sqlite-vec extension\n sqliteVec.load(db);\n\n // Configure PRAGMAs (order matters: foreign_keys before any ops, journal_mode is persistent)\n db.pragma('journal_mode = WAL');\n db.pragma('busy_timeout = 5000');\n db.pragma('foreign_keys = ON');\n db.pragma('cache_size = -64000');\n db.pragma('mmap_size = 268435456');\n db.pragma('synchronous = NORMAL');\n db.pragma('temp_store = MEMORY');\n db.pragma('journal_size_limit = 33554432');\n\n return db;\n}\n\nexport function closeDatabase(db: DatabaseConstructor.Database): void {\n try {\n db.pragma('wal_checkpoint(TRUNCATE)');\n } catch {\n // Checkpoint may fail on :memory: - that's fine\n }\n db.close();\n}\n\nfunction resolveDbPath(dataDir?: string): string {\n const dir = resolveDataDir(dataDir ?? '~/.agentic-memory');\n return join(dir, 'memory.db');\n}\n","import type Database from 'better-sqlite3';\n\nexport const version = 1;\n\nexport function up(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT\n );\n\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK(type IN ('episodic','semantic','procedural','working','pattern')),\n title TEXT,\n content TEXT NOT NULL,\n context TEXT,\n source TEXT CHECK(source IN ('manual','session_end','consolidation','hook','import')),\n tags TEXT NOT NULL DEFAULT '[]',\n importance REAL NOT NULL DEFAULT 0.5 CHECK(importance >= 0.0 AND importance <= 1.0),\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n access_count INTEGER NOT NULL DEFAULT 0 CHECK(access_count >= 0),\n last_accessed TEXT,\n injection_count INTEGER NOT NULL DEFAULT 0 CHECK(injection_count >= 0),\n embedding BLOB\n );\n\n CREATE TABLE IF NOT EXISTS relations (\n source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n relation_type TEXT NOT NULL CHECK(relation_type IN (\n 'relates_to','depends_on','contradicts','extends','implements','derived_from'\n )),\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (source_id, target_id, relation_type)\n );\n\n -- FTS5 external content (no data duplication)\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n title, content, tags,\n content=memories,\n content_rowid=rowid,\n tokenize='porter unicode61'\n );\n\n -- FTS5 sync triggers\n CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memories_fts(rowid, title, content, tags)\n VALUES (new.rowid, new.title, new.content, new.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)\n VALUES ('delete', old.rowid, old.title, old.content, old.tags);\n END;\n\n CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)\n VALUES ('delete', old.rowid, old.title, old.content, old.tags);\n INSERT INTO memories_fts(rowid, title, content, tags)\n VALUES (new.rowid, new.title, new.content, new.tags);\n END;\n\n -- Vector search (synced manually in application code)\n CREATE VIRTUAL TABLE IF NOT EXISTS memories_vec USING vec0(\n memory_id TEXT PRIMARY KEY,\n embedding float[384] distance_metric=cosine\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);\n CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance);\n CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);\n CREATE INDEX IF NOT EXISTS idx_relations_target ON relations(target_id);\n `);\n}\n","import type Database from 'better-sqlite3';\n\nexport const version = 2;\n\nexport function up(db: Database.Database): void {\n db.exec(`\n ALTER TABLE memories ADD COLUMN project TEXT;\n CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project);\n `);\n}\n","import { createHash } from 'node:crypto';\nimport type Database from 'better-sqlite3';\n\nexport const version = 3;\n\nexport function up(db: Database.Database): void {\n db.exec('ALTER TABLE memories ADD COLUMN content_hash TEXT');\n\n // Backfill existing rows with SHA-256 hashes\n const rows = db.prepare('SELECT id, content FROM memories ORDER BY updated_at DESC').all() as { id: string; content: string }[];\n const update = db.prepare('UPDATE memories SET content_hash = ? WHERE id = ?');\n const remove = db.prepare('DELETE FROM memories WHERE id = ?');\n\n // Track seen hashes — keep the most recently updated, remove older duplicates\n const seen = new Set<string>();\n for (const row of rows) {\n const hash = createHash('sha256').update(row.content).digest('hex');\n if (seen.has(hash)) {\n remove.run(row.id);\n } else {\n seen.add(hash);\n update.run(hash, row.id);\n }\n }\n\n db.exec('CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_content_hash ON memories(content_hash)');\n}\n","import type Database from 'better-sqlite3';\n\nexport const version = 4;\n\nexport function up(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS memory_tombstones (\n id TEXT PRIMARY KEY,\n project TEXT,\n deleted_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_tombstones_project ON memory_tombstones(project);\n CREATE INDEX IF NOT EXISTS idx_tombstones_deleted_at ON memory_tombstones(deleted_at);\n `);\n}\n","import type Database from 'better-sqlite3';\nimport * as migration001 from './migrations/001-initial.js';\nimport * as migration002 from './migrations/002-add-project.js';\nimport * as migration003 from './migrations/003-add-content-hash.js';\nimport * as migration004 from './migrations/004-add-tombstones.js';\n\ninterface Migration {\n readonly version: number;\n readonly up: (db: Database.Database) => void;\n}\n\nconst migrations: readonly Migration[] = [\n migration001,\n migration002,\n migration003,\n migration004,\n];\n\nexport function getSchemaVersion(db: Database.Database): number {\n try {\n const row = db.prepare(\"SELECT value FROM meta WHERE key = 'schema_version'\").get() as\n { value: string } | undefined;\n return row ? parseInt(row.value, 10) : 0;\n } catch {\n return 0;\n }\n}\n\nexport function migrate(db: Database.Database): void {\n const current = getSchemaVersion(db);\n const pending = migrations.filter(m => m.version > current);\n\n if (pending.length === 0) return;\n\n const runMigrations = db.transaction(() => {\n for (const m of pending) {\n m.up(db);\n db.prepare(\"INSERT OR REPLACE INTO meta (key, value) VALUES ('schema_version', ?)\")\n .run(String(m.version));\n }\n });\n\n runMigrations();\n}\n"],"mappings":"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","names":["join","join","up","version","up","version","up","version"]}
@@ -53,8 +53,94 @@ function computeContextScore(storedContext, currentContext, query) {
53
53
  return branchScore * 0.4 + fileScore * 0.4 + intentScore * 0.2;
54
54
  }
55
55
 
56
+ // src/commands/memory/utils/similarity.ts
57
+ var MIN_KEYWORD_LENGTH = 3;
58
+ var STOP_WORDS = /* @__PURE__ */ new Set([
59
+ "the",
60
+ "and",
61
+ "for",
62
+ "are",
63
+ "but",
64
+ "not",
65
+ "you",
66
+ "all",
67
+ "can",
68
+ "had",
69
+ "her",
70
+ "was",
71
+ "one",
72
+ "our",
73
+ "out",
74
+ "has",
75
+ "have",
76
+ "been",
77
+ "from",
78
+ "that",
79
+ "this",
80
+ "with",
81
+ "they",
82
+ "will",
83
+ "each",
84
+ "make",
85
+ "like",
86
+ "than",
87
+ "them",
88
+ "then",
89
+ "what",
90
+ "when",
91
+ "into",
92
+ "more",
93
+ "some",
94
+ "such",
95
+ "also",
96
+ "use",
97
+ "used",
98
+ "using",
99
+ "should",
100
+ "would",
101
+ "could",
102
+ "about",
103
+ "which",
104
+ "their",
105
+ "there",
106
+ "these",
107
+ "those",
108
+ "does",
109
+ "done",
110
+ "just",
111
+ "very"
112
+ ]);
113
+ function extractKeywords(text) {
114
+ const words = text.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? [];
115
+ return new Set(
116
+ words.filter((w) => w.length >= MIN_KEYWORD_LENGTH && !STOP_WORDS.has(w))
117
+ );
118
+ }
119
+ function intersectionSize(a, b) {
120
+ const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a];
121
+ let count = 0;
122
+ for (const item of smaller) {
123
+ if (larger.has(item)) count++;
124
+ }
125
+ return count;
126
+ }
127
+ function jaccardOverlap(a, b) {
128
+ if (a.size === 0 || b.size === 0) return 0;
129
+ const inter = intersectionSize(a, b);
130
+ const union = a.size + b.size - inter;
131
+ return union === 0 ? 0 : inter / union;
132
+ }
133
+ function smallerSetOverlap(a, b) {
134
+ if (a.size === 0 || b.size === 0) return 0;
135
+ const inter = intersectionSize(a, b);
136
+ return inter / Math.min(a.size, b.size);
137
+ }
138
+
56
139
  export {
57
140
  getGitContext,
58
- computeContextScore
141
+ computeContextScore,
142
+ extractKeywords,
143
+ jaccardOverlap,
144
+ smallerSetOverlap
59
145
  };
60
- //# sourceMappingURL=chunk-MQJA7TGY.js.map
146
+ //# sourceMappingURL=chunk-ZI2PZSG4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/utils/git-context.ts","../src/commands/memory/utils/similarity.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\n\nexport interface GitContext {\n readonly branch: string | null;\n readonly recentFiles: readonly string[];\n}\n\nlet cached: GitContext | null = null;\n\nexport function getGitContext(): GitContext {\n if (cached) return cached;\n\n let branch: string | null = null;\n let recentFiles: string[] = [];\n\n try {\n branch = execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8', timeout: 3000 }).trim() || null;\n } catch { /* not in a git repo or git not available */ }\n\n try {\n const raw = execSync('git diff --name-only HEAD~5', { encoding: 'utf-8', timeout: 3000 }).trim();\n recentFiles = raw ? raw.split('\\n').filter(Boolean) : [];\n } catch { /* shallow clone or no commits */ }\n\n cached = { branch, recentFiles };\n return cached;\n}\n\nexport function clearGitContextCache(): void {\n cached = null;\n}\n\nexport function computeContextScore(\n storedContext: string | null,\n currentContext: GitContext,\n query: string,\n): number {\n if (!storedContext) return 0;\n\n let parsed: { files?: string[]; branch?: string; intent?: string };\n try {\n parsed = JSON.parse(storedContext) as { files?: string[]; branch?: string; intent?: string };\n } catch {\n return 0;\n }\n\n // Branch match (weight 0.4)\n const branchScore = (parsed.branch && currentContext.branch && parsed.branch === currentContext.branch) ? 1.0 : 0;\n\n // File overlap — Jaccard similarity (weight 0.4)\n let fileScore = 0;\n if (parsed.files?.length && currentContext.recentFiles.length) {\n const stored = new Set(parsed.files);\n const current = new Set(currentContext.recentFiles);\n let intersection = 0;\n for (const f of stored) {\n if (current.has(f)) intersection++;\n }\n const union = stored.size + current.size - intersection;\n fileScore = union > 0 ? intersection / union : 0;\n }\n\n // Intent keyword overlap with query (weight 0.2)\n let intentScore = 0;\n if (parsed.intent && query) {\n const intentWords = new Set(parsed.intent.toLowerCase().split(/\\s+/).filter(Boolean));\n const queryWords = new Set(query.toLowerCase().split(/\\s+/).filter(Boolean));\n let overlap = 0;\n for (const w of intentWords) {\n if (queryWords.has(w)) overlap++;\n }\n const union = intentWords.size + queryWords.size - overlap;\n intentScore = union > 0 ? overlap / union : 0;\n }\n\n return branchScore * 0.4 + fileScore * 0.4 + intentScore * 0.2;\n}\n","// ── Similarity Primitives ──────────────────────────────────────\n// Pure utilities for text and set similarity. Shared between\n// contradiction detection and MMR diversity re-ranking.\n\nconst MIN_KEYWORD_LENGTH = 3;\n\nconst STOP_WORDS: ReadonlySet<string> = new Set([\n 'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'had',\n 'her', 'was', 'one', 'our', 'out', 'has', 'have', 'been', 'from', 'that',\n 'this', 'with', 'they', 'will', 'each', 'make', 'like', 'than', 'them',\n 'then', 'what', 'when', 'into', 'more', 'some', 'such', 'also', 'use',\n 'used', 'using', 'should', 'would', 'could', 'about', 'which', 'their',\n 'there', 'these', 'those', 'does', 'done', 'just', 'very',\n]);\n\nexport function extractKeywords(text: string): ReadonlySet<string> {\n const words = text.toLowerCase().match(/[a-z][a-z0-9_-]+/g) ?? [];\n return new Set(\n words.filter((w) => w.length >= MIN_KEYWORD_LENGTH && !STOP_WORDS.has(w)),\n );\n}\n\nfunction intersectionSize<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): number {\n const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a];\n let count = 0;\n for (const item of smaller) {\n if (larger.has(item)) count++;\n }\n return count;\n}\n\nexport function jaccardOverlap<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): number {\n if (a.size === 0 || b.size === 0) return 0;\n const inter = intersectionSize(a, b);\n const union = a.size + b.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\nexport function smallerSetOverlap<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): number {\n if (a.size === 0 || b.size === 0) return 0;\n const inter = intersectionSize(a, b);\n return inter / Math.min(a.size, b.size);\n}\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -2334,12 +2334,12 @@ function createMemoryCommand() {
2334
2334
  }
2335
2335
  const { requireMemoryDeps } = await import("./require-deps-MCFEZOIF.js");
2336
2336
  await requireMemoryDeps();
2337
- const { startTui } = await import("./tui-JE5L7SXC.js");
2337
+ const { startTui } = await import("./tui-DQD26BU6.js");
2338
2338
  await startTui();
2339
2339
  return;
2340
2340
  }
2341
2341
  if (!isMemoryInstalled()) {
2342
- const { detectExistingSetup } = await import("./install-P4TFYUJT.js");
2342
+ const { detectExistingSetup } = await import("./install-MTDWI6RO.js");
2343
2343
  const existing = detectExistingSetup(process.cwd());
2344
2344
  if (existing) {
2345
2345
  const location = existing === "local" ? ".claude/CLAUDE.md + settings.local.json" : "CLAUDE.md + settings.json";
@@ -2365,18 +2365,18 @@ function createMemoryCommand() {
2365
2365
  log.info("Skipped.");
2366
2366
  return;
2367
2367
  }
2368
- const { runInstall } = await import("./install-P4TFYUJT.js");
2368
+ const { runInstall } = await import("./install-MTDWI6RO.js");
2369
2369
  await runInstall({});
2370
2370
  } else {
2371
2371
  const { requireMemoryDeps } = await import("./require-deps-MCFEZOIF.js");
2372
2372
  await requireMemoryDeps();
2373
- const { runStats } = await import("./stats-MLWRNOHU.js");
2373
+ const { runStats } = await import("./stats-OJEG5W2D.js");
2374
2374
  await runStats({});
2375
2375
  }
2376
2376
  });
2377
2377
  memory.addCommand(
2378
2378
  new Command4("context").description("Load session context (hook handler)").option("--json", "JSON output").action(async (opts) => {
2379
- const { runContext } = await import("./context-4X4CLMU3.js");
2379
+ const { runContext } = await import("./context-DQQGQ767.js");
2380
2380
  await runContext(opts);
2381
2381
  }).helpCommand(false),
2382
2382
  { hidden: true }
@@ -2391,7 +2391,7 @@ function createMemoryCommand() {
2391
2391
  memory.addCommand(
2392
2392
  new Command4("push").description("Push current project's memories to GitHub Gist").option("--all", "Push all projects").option("-y, --yes", "Skip confirmation prompt").action(async (opts) => {
2393
2393
  await handleSyncErrors(async () => {
2394
- const { runPush } = await import("./push-SCTO5TZQ.js");
2394
+ const { runPush } = await import("./push-VDADQVA5.js");
2395
2395
  await runPush(opts);
2396
2396
  });
2397
2397
  })
@@ -2399,7 +2399,7 @@ function createMemoryCommand() {
2399
2399
  memory.addCommand(
2400
2400
  new Command4("pull").description("Pull current project's memories from GitHub Gist").option("--all", "Pull all projects").option("-y, --yes", "Non-interactive (accepted for symmetry with push; pull never prompts)").action(async (opts) => {
2401
2401
  await handleSyncErrors(async () => {
2402
- const { runPull } = await import("./pull-7SR7P3US.js");
2402
+ const { runPull } = await import("./pull-O6TLQGAQ.js");
2403
2403
  await runPull(opts);
2404
2404
  });
2405
2405
  })
@@ -2408,7 +2408,7 @@ function createMemoryCommand() {
2408
2408
  sync.addCommand(
2409
2409
  new Command4("status").description("Show local vs remote memory counts per project").action(async () => {
2410
2410
  await handleSyncErrors(async () => {
2411
- const { runSyncStatus } = await import("./sync-status-J7BVY6KF.js");
2411
+ const { runSyncStatus } = await import("./sync-status-IN5434DI.js");
2412
2412
  await runSyncStatus();
2413
2413
  });
2414
2414
  })
@@ -2426,7 +2426,7 @@ function createMemoryCommand() {
2426
2426
  }
2427
2427
 
2428
2428
  // src/cli.ts
2429
- var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("1.5.0", "-v, --version").action(async () => {
2429
+ var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("1.6.0", "-v, --version").action(async () => {
2430
2430
  const hasConfig = await fileExists(join9(process.cwd(), "CLAUDE.md")) || await fileExists(join9(process.cwd(), ".claude", "settings.json"));
2431
2431
  if (hasConfig) {
2432
2432
  await program.commands.find((c) => c.name() === "doctor")?.parseAsync([], { from: "user" });