claude-launchpad 1.7.1 → 1.8.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 +2 -1
- package/dist/{chunk-AGDE4BJA.js → chunk-7QPZN27I.js} +29 -6
- package/dist/chunk-7QPZN27I.js.map +1 -0
- package/dist/{chunk-RN257YFF.js → chunk-GY3SK66Y.js} +3 -3
- package/dist/{chunk-GQUR7T56.js → chunk-MDR73QT2.js} +14 -20
- package/dist/chunk-MDR73QT2.js.map +1 -0
- package/dist/{chunk-DPMWZRFQ.js → chunk-MIHOPQP4.js} +2 -2
- package/dist/{chunk-7I2BTZP3.js → chunk-NJQ2JFGF.js} +2 -2
- package/dist/cli.js +76 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/memory/server.js +3 -3
- package/dist/{context-JVL7IDP7.js → context-XTPBYGKW.js} +5 -5
- package/dist/{install-ZQQGCIRC.js → install-MQDN7TLA.js} +55 -6
- package/dist/install-MQDN7TLA.js.map +1 -0
- package/dist/{pull-6WW6IT7C.js → pull-ELZGXQPJ.js} +7 -7
- package/dist/{push-6IVUPQVG.js → push-HJXEC7XC.js} +7 -7
- package/dist/{require-deps-H2U4PXPY.js → require-deps-3B3NWAEP.js} +3 -3
- package/dist/{stats-DGMDAUNG.js → stats-S3GNMUDF.js} +6 -6
- package/dist/{sync-clean-EFMXNNJ2.js → sync-clean-XNMLP3FZ.js} +3 -3
- package/dist/{sync-status-PLC3TSTQ.js → sync-status-4AGU776A.js} +14 -9
- package/dist/sync-status-4AGU776A.js.map +1 -0
- package/dist/{tui-NDDEYYND.js → tui-CGXGXU5U.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-AGDE4BJA.js.map +0 -1
- package/dist/chunk-GQUR7T56.js.map +0 -1
- package/dist/install-ZQQGCIRC.js.map +0 -1
- package/dist/sync-status-PLC3TSTQ.js.map +0 -1
- /package/dist/{chunk-RN257YFF.js.map → chunk-GY3SK66Y.js.map} +0 -0
- /package/dist/{chunk-DPMWZRFQ.js.map → chunk-MIHOPQP4.js.map} +0 -0
- /package/dist/{chunk-7I2BTZP3.js.map → chunk-NJQ2JFGF.js.map} +0 -0
- /package/dist/{context-JVL7IDP7.js.map → context-XTPBYGKW.js.map} +0 -0
- /package/dist/{pull-6WW6IT7C.js.map → pull-ELZGXQPJ.js.map} +0 -0
- /package/dist/{push-6IVUPQVG.js.map → push-HJXEC7XC.js.map} +0 -0
- /package/dist/{require-deps-H2U4PXPY.js.map → require-deps-3B3NWAEP.js.map} +0 -0
- /package/dist/{stats-DGMDAUNG.js.map → stats-S3GNMUDF.js.map} +0 -0
- /package/dist/{sync-clean-EFMXNNJ2.js.map → sync-clean-XNMLP3FZ.js.map} +0 -0
- /package/dist/{tui-NDDEYYND.js.map → tui-CGXGXU5U.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
readSyncConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-MDR73QT2.js";
|
|
5
5
|
import {
|
|
6
6
|
BACKLOG_CONTENT,
|
|
7
7
|
ENHANCE_SKILL_VERSION,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
printScoreCard,
|
|
21
21
|
readFileOrNull,
|
|
22
22
|
renderDoctorReport
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-7QPZN27I.js";
|
|
24
24
|
|
|
25
25
|
// src/cli.ts
|
|
26
26
|
import { Command as Command5 } from "commander";
|
|
@@ -1209,6 +1209,24 @@ async function analyzeMemory(config, projectRoot) {
|
|
|
1209
1209
|
fix: "Add all agentic-memory tool names to allowedTools in .claude/settings.json"
|
|
1210
1210
|
});
|
|
1211
1211
|
}
|
|
1212
|
+
const sharedAllowed = config.settings?.allowedMcpServers;
|
|
1213
|
+
const localAllowed = config.localSettings?.allowedMcpServers;
|
|
1214
|
+
const allowedServers = [
|
|
1215
|
+
...Array.isArray(sharedAllowed) ? sharedAllowed : [],
|
|
1216
|
+
...Array.isArray(localAllowed) ? localAllowed : []
|
|
1217
|
+
];
|
|
1218
|
+
const hasAllowlist = Array.isArray(sharedAllowed) || Array.isArray(localAllowed);
|
|
1219
|
+
const memoryInAllowlist = allowedServers.some(
|
|
1220
|
+
(e) => e && typeof e === "object" && e.serverName === "agentic-memory"
|
|
1221
|
+
);
|
|
1222
|
+
if (hasAllowlist && !memoryInAllowlist) {
|
|
1223
|
+
issues.push({
|
|
1224
|
+
analyzer: "Memory",
|
|
1225
|
+
severity: "high",
|
|
1226
|
+
message: "allowedMcpServers is set but does not include agentic-memory \u2014 MCP registration will be blocked",
|
|
1227
|
+
fix: "Run `doctor --fix` to add agentic-memory to allowedMcpServers"
|
|
1228
|
+
});
|
|
1229
|
+
}
|
|
1212
1230
|
const syncConfig = readSyncConfig();
|
|
1213
1231
|
if (syncConfig) {
|
|
1214
1232
|
const hasSessionStartPull = config.hooks.some(
|
|
@@ -1233,15 +1251,15 @@ async function analyzeMemory(config, projectRoot) {
|
|
|
1233
1251
|
fix: "Run `doctor --fix` to add a SessionEnd hook that pushes memories automatically"
|
|
1234
1252
|
});
|
|
1235
1253
|
}
|
|
1236
|
-
const
|
|
1237
|
-
(h) => h.event === "SessionEnd" && h.command?.includes("memory push") &&
|
|
1254
|
+
const hasNonNohupPush = config.hooks.some(
|
|
1255
|
+
(h) => h.event === "SessionEnd" && h.command?.includes("memory push") && !h.command.includes("nohup")
|
|
1238
1256
|
);
|
|
1239
|
-
if (
|
|
1257
|
+
if (hasNonNohupPush) {
|
|
1240
1258
|
issues.push({
|
|
1241
1259
|
analyzer: "Memory",
|
|
1242
1260
|
severity: "high",
|
|
1243
|
-
message: "SessionEnd push hook is
|
|
1244
|
-
fix: "Run `doctor --fix` to upgrade the hook to a
|
|
1261
|
+
message: "SessionEnd push hook is not nohup-wrapped \u2014 Claude Code cancels it on exit before the push completes",
|
|
1262
|
+
fix: "Run `doctor --fix` to upgrade the hook to a nohup-wrapped push"
|
|
1245
1263
|
});
|
|
1246
1264
|
}
|
|
1247
1265
|
}
|
|
@@ -2281,6 +2299,7 @@ async function checkClaudeCli() {
|
|
|
2281
2299
|
// src/commands/memory/index.ts
|
|
2282
2300
|
import { readFileSync } from "fs";
|
|
2283
2301
|
import { join as join8 } from "path";
|
|
2302
|
+
import { homedir as homedir3 } from "os";
|
|
2284
2303
|
import { Command as Command4 } from "commander";
|
|
2285
2304
|
import { confirm as confirm2 } from "@inquirer/prompts";
|
|
2286
2305
|
async function handleSyncErrors(fn) {
|
|
@@ -2288,11 +2307,39 @@ async function handleSyncErrors(fn) {
|
|
|
2288
2307
|
await fn();
|
|
2289
2308
|
} catch (err) {
|
|
2290
2309
|
log.error(err instanceof Error ? err.message : String(err));
|
|
2310
|
+
process.exitCode = 1;
|
|
2291
2311
|
}
|
|
2292
2312
|
}
|
|
2293
2313
|
function isMemoryInstalled() {
|
|
2294
2314
|
const cwd = process.cwd();
|
|
2295
|
-
|
|
2315
|
+
const hookPresent = hasMemoryHook(join8(cwd, ".claude", "settings.json")) || hasMemoryHook(join8(cwd, ".claude", "settings.local.json"));
|
|
2316
|
+
if (!hookPresent) return false;
|
|
2317
|
+
return isMemoryMcpRegistered(cwd);
|
|
2318
|
+
}
|
|
2319
|
+
function isMemoryMcpRegistered(projectRoot) {
|
|
2320
|
+
return hasMemoryServerInJson(join8(projectRoot, ".mcp.json"), "mcpServers") || hasMemoryServerInJson(join8(projectRoot, ".claude", "settings.local.json"), "mcpServers") || hasMemoryServerInUserConfig(projectRoot);
|
|
2321
|
+
}
|
|
2322
|
+
function hasMemoryServerInJson(path, key) {
|
|
2323
|
+
try {
|
|
2324
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
2325
|
+
const servers = parsed[key];
|
|
2326
|
+
return !!servers && typeof servers === "object" && "agentic-memory" in servers;
|
|
2327
|
+
} catch {
|
|
2328
|
+
return false;
|
|
2329
|
+
}
|
|
2330
|
+
}
|
|
2331
|
+
function hasMemoryServerInUserConfig(projectRoot) {
|
|
2332
|
+
try {
|
|
2333
|
+
const parsed = JSON.parse(readFileSync(join8(homedir3(), ".claude.json"), "utf-8"));
|
|
2334
|
+
const projects = parsed.projects;
|
|
2335
|
+
const project = projects?.[projectRoot];
|
|
2336
|
+
const scoped = project?.mcpServers;
|
|
2337
|
+
if (scoped && "agentic-memory" in scoped) return true;
|
|
2338
|
+
const global = parsed.mcpServers;
|
|
2339
|
+
return !!global && "agentic-memory" in global;
|
|
2340
|
+
} catch {
|
|
2341
|
+
return false;
|
|
2342
|
+
}
|
|
2296
2343
|
}
|
|
2297
2344
|
function hasMemoryHook(path) {
|
|
2298
2345
|
try {
|
|
@@ -2315,20 +2362,21 @@ function createMemoryCommand() {
|
|
|
2315
2362
|
log.error("Knowledge base not set up yet. Run `claude-launchpad memory` first.");
|
|
2316
2363
|
return;
|
|
2317
2364
|
}
|
|
2318
|
-
const { requireMemoryDeps } = await import("./require-deps-
|
|
2365
|
+
const { requireMemoryDeps } = await import("./require-deps-3B3NWAEP.js");
|
|
2319
2366
|
await requireMemoryDeps();
|
|
2320
|
-
const { startTui } = await import("./tui-
|
|
2367
|
+
const { startTui } = await import("./tui-CGXGXU5U.js");
|
|
2321
2368
|
await startTui();
|
|
2322
2369
|
return;
|
|
2323
2370
|
}
|
|
2324
2371
|
if (!isMemoryInstalled()) {
|
|
2325
|
-
const { detectExistingSetup } = await import("./install-
|
|
2372
|
+
const { detectExistingSetup } = await import("./install-MQDN7TLA.js");
|
|
2326
2373
|
const existing = detectExistingSetup(process.cwd());
|
|
2374
|
+
const mcpMissing = existing !== null && !isMemoryMcpRegistered(process.cwd());
|
|
2327
2375
|
if (existing) {
|
|
2328
2376
|
const location = existing === "local" ? ".claude/CLAUDE.md + settings.local.json" : "CLAUDE.md + settings.json";
|
|
2329
2377
|
log.blank();
|
|
2330
|
-
log.success(`Memory config found (${location}) but database not set up.`);
|
|
2331
|
-
log.info("Run
|
|
2378
|
+
log.success(`Memory config found (${location}) but ${mcpMissing ? "MCP server not registered" : "database not set up"}.`);
|
|
2379
|
+
log.info("Run `claude-launchpad memory install` to complete setup.");
|
|
2332
2380
|
log.blank();
|
|
2333
2381
|
} else {
|
|
2334
2382
|
log.blank();
|
|
@@ -2348,18 +2396,24 @@ function createMemoryCommand() {
|
|
|
2348
2396
|
log.info("Skipped.");
|
|
2349
2397
|
return;
|
|
2350
2398
|
}
|
|
2351
|
-
const { runInstall } = await import("./install-
|
|
2399
|
+
const { runInstall } = await import("./install-MQDN7TLA.js");
|
|
2352
2400
|
await runInstall({});
|
|
2353
2401
|
} else {
|
|
2354
|
-
const { requireMemoryDeps } = await import("./require-deps-
|
|
2402
|
+
const { requireMemoryDeps } = await import("./require-deps-3B3NWAEP.js");
|
|
2355
2403
|
await requireMemoryDeps();
|
|
2356
|
-
const { runStats } = await import("./stats-
|
|
2404
|
+
const { runStats } = await import("./stats-S3GNMUDF.js");
|
|
2357
2405
|
await runStats({});
|
|
2358
2406
|
}
|
|
2359
2407
|
});
|
|
2408
|
+
memory.addCommand(
|
|
2409
|
+
new Command4("install").description("Install (or re-install) the knowledge base for this project").option("--db-path <path>", "Override the default data directory").action(async (opts) => {
|
|
2410
|
+
const { runInstall } = await import("./install-MQDN7TLA.js");
|
|
2411
|
+
await runInstall(opts.dbPath ? { dbPath: opts.dbPath } : {});
|
|
2412
|
+
})
|
|
2413
|
+
);
|
|
2360
2414
|
memory.addCommand(
|
|
2361
2415
|
new Command4("context").description("Load session context (hook handler)").option("--json", "JSON output").action(async (opts) => {
|
|
2362
|
-
const { runContext } = await import("./context-
|
|
2416
|
+
const { runContext } = await import("./context-XTPBYGKW.js");
|
|
2363
2417
|
await runContext(opts);
|
|
2364
2418
|
}).helpCommand(false),
|
|
2365
2419
|
{ hidden: true }
|
|
@@ -2374,7 +2428,7 @@ function createMemoryCommand() {
|
|
|
2374
2428
|
memory.addCommand(
|
|
2375
2429
|
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) => {
|
|
2376
2430
|
await handleSyncErrors(async () => {
|
|
2377
|
-
const { runPush } = await import("./push-
|
|
2431
|
+
const { runPush } = await import("./push-HJXEC7XC.js");
|
|
2378
2432
|
await runPush(opts);
|
|
2379
2433
|
});
|
|
2380
2434
|
})
|
|
@@ -2382,7 +2436,7 @@ function createMemoryCommand() {
|
|
|
2382
2436
|
memory.addCommand(
|
|
2383
2437
|
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) => {
|
|
2384
2438
|
await handleSyncErrors(async () => {
|
|
2385
|
-
const { runPull } = await import("./pull-
|
|
2439
|
+
const { runPull } = await import("./pull-ELZGXQPJ.js");
|
|
2386
2440
|
await runPull(opts);
|
|
2387
2441
|
});
|
|
2388
2442
|
})
|
|
@@ -2391,7 +2445,7 @@ function createMemoryCommand() {
|
|
|
2391
2445
|
sync.addCommand(
|
|
2392
2446
|
new Command4("status").description("Show local vs remote memory counts per project").action(async () => {
|
|
2393
2447
|
await handleSyncErrors(async () => {
|
|
2394
|
-
const { runSyncStatus } = await import("./sync-status-
|
|
2448
|
+
const { runSyncStatus } = await import("./sync-status-4AGU776A.js");
|
|
2395
2449
|
await runSyncStatus();
|
|
2396
2450
|
});
|
|
2397
2451
|
})
|
|
@@ -2399,7 +2453,7 @@ function createMemoryCommand() {
|
|
|
2399
2453
|
sync.addCommand(
|
|
2400
2454
|
new Command4("clean").description("Remove a project from the sync gist").argument("<project>", "Project slug to remove").option("-y, --yes", "Skip confirmation prompt").action(async (project, opts) => {
|
|
2401
2455
|
await handleSyncErrors(async () => {
|
|
2402
|
-
const { runSyncClean } = await import("./sync-clean-
|
|
2456
|
+
const { runSyncClean } = await import("./sync-clean-XNMLP3FZ.js");
|
|
2403
2457
|
await runSyncClean(project, opts);
|
|
2404
2458
|
});
|
|
2405
2459
|
})
|
|
@@ -2409,7 +2463,7 @@ function createMemoryCommand() {
|
|
|
2409
2463
|
}
|
|
2410
2464
|
|
|
2411
2465
|
// src/cli.ts
|
|
2412
|
-
var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("1.
|
|
2466
|
+
var program = new Command5().name("claude-launchpad").description("CLI toolkit that makes Claude Code setups measurably good").version("1.8.0", "-v, --version").action(async () => {
|
|
2413
2467
|
const hasConfig = await fileExists(join9(process.cwd(), "CLAUDE.md")) || await fileExists(join9(process.cwd(), ".claude", "settings.json"));
|
|
2414
2468
|
if (hasConfig) {
|
|
2415
2469
|
await program.commands.find((c) => c.name() === "doctor")?.parseAsync([], { from: "user" });
|