claude-launchpad 1.7.0 → 1.7.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.
@@ -4,7 +4,7 @@ import {
4
4
  extractKeywords,
5
5
  getGitContext,
6
6
  smallerSetOverlap
7
- } from "../../chunk-ZI2PZSG4.js";
7
+ } from "../../chunk-N3K4VF6G.js";
8
8
  import {
9
9
  MEMORY_SOURCES,
10
10
  MEMORY_TYPES,
@@ -4,7 +4,7 @@ import {
4
4
  extractKeywords,
5
5
  getGitContext,
6
6
  jaccardOverlap
7
- } from "./chunk-ZI2PZSG4.js";
7
+ } from "./chunk-N3K4VF6G.js";
8
8
  import {
9
9
  detectProject
10
10
  } from "./chunk-NAW47BYA.js";
@@ -503,4 +503,4 @@ async function runContext(opts) {
503
503
  export {
504
504
  runContext
505
505
  };
506
- //# sourceMappingURL=context-G2GSE7TY.js.map
506
+ //# sourceMappingURL=context-JVL7IDP7.js.map
@@ -10,7 +10,7 @@ import {
10
10
  loadSyncConfig,
11
11
  projectToFilename,
12
12
  readGistFile
13
- } from "./chunk-3UJYOWGF.js";
13
+ } from "./chunk-GQUR7T56.js";
14
14
  import "./chunk-YZ53W47Z.js";
15
15
  import {
16
16
  detectProject
@@ -137,4 +137,4 @@ function printResult(result, project) {
137
137
  export {
138
138
  runPull
139
139
  };
140
- //# sourceMappingURL=pull-TP2Y7CQS.js.map
140
+ //# sourceMappingURL=pull-6WW6IT7C.js.map
@@ -12,7 +12,7 @@ import {
12
12
  projectToFilename,
13
13
  readGistFile,
14
14
  updateGistFiles
15
- } from "./chunk-3UJYOWGF.js";
15
+ } from "./chunk-GQUR7T56.js";
16
16
  import "./chunk-YZ53W47Z.js";
17
17
  import {
18
18
  detectProject
@@ -171,4 +171,4 @@ async function confirmCreate() {
171
171
  export {
172
172
  runPush
173
173
  };
174
- //# sourceMappingURL=push-STHV7MT7.js.map
174
+ //# sourceMappingURL=push-6IVUPQVG.js.map
@@ -6,7 +6,7 @@ import {
6
6
  listGistFiles,
7
7
  loadSyncConfig,
8
8
  projectToFilename
9
- } from "./chunk-3UJYOWGF.js";
9
+ } from "./chunk-GQUR7T56.js";
10
10
  import {
11
11
  log
12
12
  } from "./chunk-AGDE4BJA.js";
@@ -50,4 +50,4 @@ async function runSyncClean(project, opts) {
50
50
  export {
51
51
  runSyncClean
52
52
  };
53
- //# sourceMappingURL=sync-clean-HLV2XJPT.js.map
53
+ //# sourceMappingURL=sync-clean-EFMXNNJ2.js.map
@@ -8,7 +8,7 @@ import {
8
8
  listGistFiles,
9
9
  loadSyncConfig,
10
10
  readGistFile
11
- } from "./chunk-3UJYOWGF.js";
11
+ } from "./chunk-GQUR7T56.js";
12
12
  import "./chunk-YZ53W47Z.js";
13
13
  import {
14
14
  initStorage
@@ -67,4 +67,4 @@ async function runSyncStatus() {
67
67
  export {
68
68
  runSyncStatus
69
69
  };
70
- //# sourceMappingURL=sync-status-XH3Z5LC5.js.map
70
+ //# sourceMappingURL=sync-status-PLC3TSTQ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-launchpad",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "CLI toolkit for Claude Code — scaffold CLAUDE.md, diagnose config, enforce hooks, test with eval, add persistent memory",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/memory/utils/gist-transport.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { homedir } from 'node:os';\n\nexport interface SyncConfig {\n readonly gistId: string;\n}\n\nconst EXEC_OPTS = { encoding: 'utf-8' as const, timeout: 30_000 };\nconst GIST_DESCRIPTION = 'agentic-memory sync';\nconst SYNC_CONFIG_FILE = 'sync-config.json';\nconst DATA_DIR = join(homedir(), '.agentic-memory');\n\nfunction syncConfigPath(): string {\n return join(DATA_DIR, SYNC_CONFIG_FILE);\n}\n\nfunction slugify(project: string): string {\n return project.replace(/[^a-zA-Z0-9._-]/g, '-');\n}\n\nexport function projectToFilename(project: string): string {\n if (!project) throw new Error('Project name cannot be empty');\n return `memories-${slugify(project)}.json`;\n}\n\nexport function filenameToProject(filename: string): string | null {\n const match = filename.match(/^memories-(.+)\\.json$/);\n return match?.[1] ?? null;\n}\n\n\nexport function assertGhAvailable(): void {\n try {\n execSync('gh --version', { ...EXEC_OPTS, stdio: 'pipe' });\n } catch {\n throw new Error(\n 'Memory sync requires the GitHub CLI.\\n' +\n 'Install: https://cli.github.com/\\n' +\n 'Then run: gh auth login'\n );\n }\n try {\n execSync('gh auth status', { ...EXEC_OPTS, stdio: 'pipe' });\n } catch {\n throw new Error(\n 'gh is installed but not authenticated.\\n' +\n 'Run: gh auth login'\n );\n }\n}\n\n/**\n * Read sync config from disk only — no network discovery.\n * Safe to call from lightweight contexts like doctor analyzers.\n */\nexport function readSyncConfig(): SyncConfig | null {\n try {\n const raw = readFileSync(syncConfigPath(), 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.gistId === 'string' && /^[a-f0-9]+$/.test(parsed.gistId)) {\n return { gistId: parsed.gistId };\n }\n } catch { /* no config file */ }\n return null;\n}\n\nexport function loadSyncConfig(): SyncConfig | null {\n try {\n const raw = readFileSync(syncConfigPath(), 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.gistId === 'string' && /^[a-f0-9]+$/.test(parsed.gistId)) {\n return { gistId: parsed.gistId };\n }\n } catch { /* no local config */ }\n\n const discovered = discoverSyncGist();\n if (discovered) {\n saveSyncConfig({ gistId: discovered });\n return { gistId: discovered };\n }\n return null;\n}\n\nfunction discoverSyncGist(): string | null {\n try {\n const output = execSync(\n 'gh gist list --limit 100',\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n );\n for (const line of output.split('\\n')) {\n const cols = line.split('\\t');\n if (cols[1]?.trim() === GIST_DESCRIPTION) {\n const gistId = cols[0]?.trim();\n if (gistId && /^[a-f0-9]+$/.test(gistId)) return gistId;\n }\n }\n } catch { /* gh list failed */ }\n return null;\n}\n\nexport function saveSyncConfig(config: SyncConfig): void {\n const filePath = syncConfigPath();\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function createGist(filename: string, content: string): string {\n const safeFilename = slugify(filename.replace(/\\.json$/, '')) + '.json';\n const tmpFile = join(tmpdir(), safeFilename);\n try {\n writeFileSync(tmpFile, content, 'utf-8');\n const result = execSync(\n `gh gist create \"${tmpFile}\" --desc \"${GIST_DESCRIPTION}\" --public=false`,\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n const gistId = result.split('/').pop()?.trim() ?? '';\n if (!gistId || !/^[a-f0-9]+$/.test(gistId)) {\n throw new Error(`Failed to parse gist ID from: ${result}`);\n }\n saveSyncConfig({ gistId });\n return gistId;\n } finally {\n try { unlinkSync(tmpFile); } catch { /* ignore */ }\n }\n}\n\nexport function readGistFile(gistId: string, filename: string): string | null {\n try {\n const escapedFilename = JSON.stringify(filename);\n return execSync(\n `gh api \"/gists/${gistId}\" --jq '.files[${escapedFilename}].content'`,\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n ).trimEnd();\n } catch {\n return null;\n }\n}\n\nexport function listGistFiles(gistId: string): readonly string[] {\n try {\n const output = execSync(\n `gh api \"/gists/${gistId}\" --jq '.files | keys[]'`,\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n );\n return output.trim().split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function deleteGistFile(gistId: string, filename: string): void {\n const payload = { files: { [filename]: null } };\n const tmpFile = join(tmpdir(), `gist-delete-${Date.now()}.json`);\n try {\n writeFileSync(tmpFile, JSON.stringify(payload), 'utf-8');\n execSync(\n `gh api --method PATCH \"/gists/${gistId}\" --input \"${tmpFile}\"`,\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n );\n } finally {\n try { unlinkSync(tmpFile); } catch { /* ignore */ }\n }\n}\n\nexport function updateGistFiles(\n gistId: string,\n files: Record<string, string>,\n): void {\n const payload = {\n files: Object.fromEntries(\n Object.entries(files).map(([name, content]) => [name, { content }]),\n ),\n };\n const tmpFile = join(tmpdir(), `gist-patch-${Date.now()}.json`);\n try {\n writeFileSync(tmpFile, JSON.stringify(payload), 'utf-8');\n execSync(\n `gh api --method PATCH \"/gists/${gistId}\" --input \"${tmpFile}\"`,\n { ...EXEC_OPTS, stdio: ['pipe', 'pipe', 'pipe'] },\n );\n } finally {\n try { unlinkSync(tmpFile); } catch { /* ignore */ }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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":[]}