claude-launchpad 0.16.0 → 1.0.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.
- package/README.md +13 -4
- package/dist/{chunk-JQDMBE7W.js → chunk-3UJYOWGF.js} +18 -1
- package/dist/chunk-3UJYOWGF.js.map +1 -0
- package/dist/chunk-4JNFXVVC.js +1139 -0
- package/dist/chunk-4JNFXVVC.js.map +1 -0
- package/dist/{chunk-5MWCQLNL.js → chunk-AUV2JTXX.js} +3 -3
- package/dist/{chunk-Z6FBT44W.js → chunk-PGDSAUP4.js} +2 -2
- package/dist/{chunk-24VLPHJU.js → chunk-V4NXT4KB.js} +43 -16
- package/dist/chunk-V4NXT4KB.js.map +1 -0
- package/dist/{chunk-EDKY7JWY.js → chunk-ZXJK7CHB.js} +31 -4
- package/dist/chunk-ZXJK7CHB.js.map +1 -0
- package/dist/cli.js +156 -1065
- package/dist/cli.js.map +1 -1
- package/dist/commands/memory/server.js +9 -4
- package/dist/commands/memory/server.js.map +1 -1
- package/dist/{context-CWJUUTTU.js → context-Q5ZQBY7O.js} +6 -6
- package/dist/{install-MVATZUXZ.js → install-LS7DTMIE.js} +65 -63
- package/dist/install-LS7DTMIE.js.map +1 -0
- package/dist/{pull-YOESZ3UC.js → pull-4NRD4GQ4.js} +13 -9
- package/dist/pull-4NRD4GQ4.js.map +1 -0
- package/dist/{push-74XC5CUK.js → push-BHYEETGP.js} +9 -9
- package/dist/{require-deps-NKRCPVAO.js → require-deps-3GIE6TAG.js} +3 -3
- package/dist/{stats-QUBHHPV7.js → stats-NQ5NRUZC.js} +7 -7
- package/dist/sync-clean-QWEQVAYO.js +53 -0
- package/dist/sync-clean-QWEQVAYO.js.map +1 -0
- package/dist/sync-status-ZMXMEBGC.js +70 -0
- package/dist/sync-status-ZMXMEBGC.js.map +1 -0
- package/dist/{tui-XIYOOUP6.js → tui-YL5NWME5.js} +5 -5
- package/package.json +1 -1
- package/dist/chunk-24VLPHJU.js.map +0 -1
- package/dist/chunk-EDKY7JWY.js.map +0 -1
- package/dist/chunk-JQDMBE7W.js.map +0 -1
- package/dist/chunk-RJGXPH7P.js +0 -107
- package/dist/chunk-RJGXPH7P.js.map +0 -1
- package/dist/chunk-SBA5KYQU.js +0 -76
- package/dist/chunk-SBA5KYQU.js.map +0 -1
- package/dist/install-MVATZUXZ.js.map +0 -1
- package/dist/pull-YOESZ3UC.js.map +0 -1
- /package/dist/{chunk-5MWCQLNL.js.map → chunk-AUV2JTXX.js.map} +0 -0
- /package/dist/{chunk-Z6FBT44W.js.map → chunk-PGDSAUP4.js.map} +0 -0
- /package/dist/{context-CWJUUTTU.js.map → context-Q5ZQBY7O.js.map} +0 -0
- /package/dist/{push-74XC5CUK.js.map → push-BHYEETGP.js.map} +0 -0
- /package/dist/{require-deps-NKRCPVAO.js.map → require-deps-3GIE6TAG.js.map} +0 -0
- /package/dist/{stats-QUBHHPV7.js.map → stats-NQ5NRUZC.js.map} +0 -0
- /package/dist/{tui-XIYOOUP6.js.map → tui-YL5NWME5.js.map} +0 -0
package/README.md
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|

|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
**
|
|
11
|
+
**Claude follows CLAUDE.md ~80% of the time. Hooks run at 100%. Most setups have zero hooks.**
|
|
12
12
|
|
|
13
|
-
Claude
|
|
13
|
+
Claude Launchpad adds the hooks, scores your config, and tests that Claude actually follows your rules.
|
|
14
14
|
|
|
15
15
|
For developers using Claude Code who want consistent results: solo devs, vibe coders, AI-first teams.
|
|
16
16
|
|
|
@@ -56,7 +56,13 @@ Scores your config, auto-repairs everything it can.
|
|
|
56
56
|
|
|
57
57
|
## The Three-File System
|
|
58
58
|
|
|
59
|
-
Without structure, CLAUDE.md becomes a dumping ground
|
|
59
|
+
Without structure, CLAUDE.md becomes a dumping ground:
|
|
60
|
+
|
|
61
|
+
- Future ideas bury active guidance
|
|
62
|
+
- Sprint notes push conventions off-screen
|
|
63
|
+
- Past ~200 lines, Claude starts ignoring rules at the bottom
|
|
64
|
+
|
|
65
|
+
The three-file split keeps each concern where it belongs:
|
|
60
66
|
|
|
61
67
|
| File | Purpose | Example |
|
|
62
68
|
|---|---|---|
|
|
@@ -212,7 +218,7 @@ Use "local" when co-devs have different memory setups (e.g. you use agentic-memo
|
|
|
212
218
|
|
|
213
219
|
Every session, Claude loads what it needs to know and stores new knowledge as it works. Stale facts fade on their own. Knowledge Claude actually uses gets reinforced. Each project has its own isolated memory. When a session ends, memories auto-sync to a private GitHub Gist so they're available on any machine.
|
|
214
220
|
|
|
215
|
-
Browse everything with `--dashboard
|
|
221
|
+
Browse everything with `--dashboard`, a terminal UI with vim navigation, filtering, and search.
|
|
216
222
|
|
|
217
223
|
Data stays in `~/.agentic-memory/memory.db`. Sync requires the [GitHub CLI](https://cli.github.com/) (`gh`).
|
|
218
224
|
|
|
@@ -223,6 +229,9 @@ Data stays in `~/.agentic-memory/memory.db`. Sync requires the [GitHub CLI](http
|
|
|
223
229
|
| `pull` | Pull current project's memories from a private GitHub Gist |
|
|
224
230
|
| `push --all` | Push all projects |
|
|
225
231
|
| `pull --all` | Pull all projects |
|
|
232
|
+
| `push -y` | Skip confirmation prompt |
|
|
233
|
+
| `sync status` | Show local vs remote memory counts |
|
|
234
|
+
| `sync clean <project>` | Remove a project from the sync gist |
|
|
226
235
|
|
|
227
236
|
Sync stores one file per project inside a single private gist. Push/pull auto-detects the current project from your working directory. On a new device, the gist is auto-discovered from your GitHub account (no config to copy).
|
|
228
237
|
|
|
@@ -133,6 +133,22 @@ function listGistFiles(gistId) {
|
|
|
133
133
|
return [];
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
+
function deleteGistFile(gistId, filename) {
|
|
137
|
+
const payload = { files: { [filename]: null } };
|
|
138
|
+
const tmpFile = join(tmpdir(), `gist-delete-${Date.now()}.json`);
|
|
139
|
+
try {
|
|
140
|
+
writeFileSync(tmpFile, JSON.stringify(payload), "utf-8");
|
|
141
|
+
execSync(
|
|
142
|
+
`gh api --method PATCH "/gists/${gistId}" --input "${tmpFile}"`,
|
|
143
|
+
{ ...EXEC_OPTS, stdio: ["pipe", "pipe", "pipe"] }
|
|
144
|
+
);
|
|
145
|
+
} finally {
|
|
146
|
+
try {
|
|
147
|
+
unlinkSync(tmpFile);
|
|
148
|
+
} catch {
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
136
152
|
function updateGistFiles(gistId, files) {
|
|
137
153
|
const payload = {
|
|
138
154
|
files: Object.fromEntries(
|
|
@@ -163,6 +179,7 @@ export {
|
|
|
163
179
|
createGist,
|
|
164
180
|
readGistFile,
|
|
165
181
|
listGistFiles,
|
|
182
|
+
deleteGistFile,
|
|
166
183
|
updateGistFiles
|
|
167
184
|
};
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
185
|
+
//# sourceMappingURL=chunk-3UJYOWGF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|