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.
Files changed (37) hide show
  1. package/README.md +2 -1
  2. package/dist/{chunk-AGDE4BJA.js → chunk-7QPZN27I.js} +29 -6
  3. package/dist/chunk-7QPZN27I.js.map +1 -0
  4. package/dist/{chunk-RN257YFF.js → chunk-GY3SK66Y.js} +3 -3
  5. package/dist/{chunk-GQUR7T56.js → chunk-MDR73QT2.js} +14 -20
  6. package/dist/chunk-MDR73QT2.js.map +1 -0
  7. package/dist/{chunk-DPMWZRFQ.js → chunk-MIHOPQP4.js} +2 -2
  8. package/dist/{chunk-7I2BTZP3.js → chunk-NJQ2JFGF.js} +2 -2
  9. package/dist/cli.js +76 -22
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/memory/server.js +3 -3
  12. package/dist/{context-JVL7IDP7.js → context-XTPBYGKW.js} +5 -5
  13. package/dist/{install-ZQQGCIRC.js → install-MQDN7TLA.js} +55 -6
  14. package/dist/install-MQDN7TLA.js.map +1 -0
  15. package/dist/{pull-6WW6IT7C.js → pull-ELZGXQPJ.js} +7 -7
  16. package/dist/{push-6IVUPQVG.js → push-HJXEC7XC.js} +7 -7
  17. package/dist/{require-deps-H2U4PXPY.js → require-deps-3B3NWAEP.js} +3 -3
  18. package/dist/{stats-DGMDAUNG.js → stats-S3GNMUDF.js} +6 -6
  19. package/dist/{sync-clean-EFMXNNJ2.js → sync-clean-XNMLP3FZ.js} +3 -3
  20. package/dist/{sync-status-PLC3TSTQ.js → sync-status-4AGU776A.js} +14 -9
  21. package/dist/sync-status-4AGU776A.js.map +1 -0
  22. package/dist/{tui-NDDEYYND.js → tui-CGXGXU5U.js} +4 -4
  23. package/package.json +1 -1
  24. package/dist/chunk-AGDE4BJA.js.map +0 -1
  25. package/dist/chunk-GQUR7T56.js.map +0 -1
  26. package/dist/install-ZQQGCIRC.js.map +0 -1
  27. package/dist/sync-status-PLC3TSTQ.js.map +0 -1
  28. /package/dist/{chunk-RN257YFF.js.map → chunk-GY3SK66Y.js.map} +0 -0
  29. /package/dist/{chunk-DPMWZRFQ.js.map → chunk-MIHOPQP4.js.map} +0 -0
  30. /package/dist/{chunk-7I2BTZP3.js.map → chunk-NJQ2JFGF.js.map} +0 -0
  31. /package/dist/{context-JVL7IDP7.js.map → context-XTPBYGKW.js.map} +0 -0
  32. /package/dist/{pull-6WW6IT7C.js.map → pull-ELZGXQPJ.js.map} +0 -0
  33. /package/dist/{push-6IVUPQVG.js.map → push-HJXEC7XC.js.map} +0 -0
  34. /package/dist/{require-deps-H2U4PXPY.js.map → require-deps-3B3NWAEP.js.map} +0 -0
  35. /package/dist/{stats-DGMDAUNG.js.map → stats-S3GNMUDF.js.map} +0 -0
  36. /package/dist/{sync-clean-EFMXNNJ2.js.map → sync-clean-XNMLP3FZ.js.map} +0 -0
  37. /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-GQUR7T56.js";
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-AGDE4BJA.js";
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 hasStaleBackgroundedPush = config.hooks.some(
1237
- (h) => h.event === "SessionEnd" && h.command?.includes("memory push") && /&\s*exit\s+0\s*$/.test(h.command)
1254
+ const hasNonNohupPush = config.hooks.some(
1255
+ (h) => h.event === "SessionEnd" && h.command?.includes("memory push") && !h.command.includes("nohup")
1238
1256
  );
1239
- if (hasStaleBackgroundedPush) {
1257
+ if (hasNonNohupPush) {
1240
1258
  issues.push({
1241
1259
  analyzer: "Memory",
1242
1260
  severity: "high",
1243
- message: "SessionEnd push hook is backgrounded \u2014 push gets killed before reaching the gist, deletions never sync",
1244
- fix: "Run `doctor --fix` to upgrade the hook to a synchronous push"
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
- return hasMemoryHook(join8(cwd, ".claude", "settings.json")) || hasMemoryHook(join8(cwd, ".claude", "settings.local.json"));
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-H2U4PXPY.js");
2365
+ const { requireMemoryDeps } = await import("./require-deps-3B3NWAEP.js");
2319
2366
  await requireMemoryDeps();
2320
- const { startTui } = await import("./tui-NDDEYYND.js");
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-ZQQGCIRC.js");
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 the install to complete setup.");
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-ZQQGCIRC.js");
2399
+ const { runInstall } = await import("./install-MQDN7TLA.js");
2352
2400
  await runInstall({});
2353
2401
  } else {
2354
- const { requireMemoryDeps } = await import("./require-deps-H2U4PXPY.js");
2402
+ const { requireMemoryDeps } = await import("./require-deps-3B3NWAEP.js");
2355
2403
  await requireMemoryDeps();
2356
- const { runStats } = await import("./stats-DGMDAUNG.js");
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-JVL7IDP7.js");
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-6IVUPQVG.js");
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-6WW6IT7C.js");
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-PLC3TSTQ.js");
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-EFMXNNJ2.js");
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.7.1", "-v, --version").action(async () => {
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" });