claude-launchpad 1.14.0 → 1.15.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 (39) hide show
  1. package/dist/{chunk-D6RAMWH6.js → chunk-7KB5YGQZ.js} +2 -2
  2. package/dist/{chunk-UN43OVRW.js → chunk-DLDVXHI3.js} +2 -2
  3. package/dist/{chunk-M6GVFN67.js → chunk-IPGNXDJF.js} +2 -2
  4. package/dist/{chunk-VF7U63AI.js → chunk-LCKV24Q3.js} +3 -3
  5. package/dist/{chunk-OPORVSAF.js → chunk-MX3T2VEX.js} +3 -3
  6. package/dist/{chunk-QEPE3WVF.js → chunk-U2TFIUGE.js} +57 -5
  7. package/dist/chunk-U2TFIUGE.js.map +1 -0
  8. package/dist/cli.js +135 -61
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/memory/server.js +4 -4
  11. package/dist/{context-YIPO4LBS.js → context-3GHG7KW6.js} +6 -6
  12. package/dist/{doctor-DCHFJ3XV.js → doctor-EKGJ2YAO.js} +4 -4
  13. package/dist/{install-D32PV7SF.js → install-543ZKMXX.js} +6 -6
  14. package/dist/{pull-YUQTDRUP.js → pull-ULSZEVCR.js} +8 -8
  15. package/dist/{push-U4IVTFOU.js → push-JXCWX4NY.js} +8 -8
  16. package/dist/{require-deps-WDMHDGBN.js → require-deps-AEDO5YRM.js} +3 -3
  17. package/dist/{stats-77BYLKYP.js → stats-63L7C24W.js} +7 -7
  18. package/dist/{sync-DTCWK2CY.js → sync-QTJ6BXQ4.js} +5 -5
  19. package/dist/{sync-clean-ACZCB3NZ.js → sync-clean-OJEK4XH4.js} +3 -3
  20. package/dist/{sync-status-2V2RCYZO.js → sync-status-EAX527SC.js} +8 -8
  21. package/dist/{tui-HVJNLRY2.js → tui-3KITZCNS.js} +5 -5
  22. package/package.json +1 -1
  23. package/dist/chunk-QEPE3WVF.js.map +0 -1
  24. /package/dist/{chunk-D6RAMWH6.js.map → chunk-7KB5YGQZ.js.map} +0 -0
  25. /package/dist/{chunk-UN43OVRW.js.map → chunk-DLDVXHI3.js.map} +0 -0
  26. /package/dist/{chunk-M6GVFN67.js.map → chunk-IPGNXDJF.js.map} +0 -0
  27. /package/dist/{chunk-VF7U63AI.js.map → chunk-LCKV24Q3.js.map} +0 -0
  28. /package/dist/{chunk-OPORVSAF.js.map → chunk-MX3T2VEX.js.map} +0 -0
  29. /package/dist/{context-YIPO4LBS.js.map → context-3GHG7KW6.js.map} +0 -0
  30. /package/dist/{doctor-DCHFJ3XV.js.map → doctor-EKGJ2YAO.js.map} +0 -0
  31. /package/dist/{install-D32PV7SF.js.map → install-543ZKMXX.js.map} +0 -0
  32. /package/dist/{pull-YUQTDRUP.js.map → pull-ULSZEVCR.js.map} +0 -0
  33. /package/dist/{push-U4IVTFOU.js.map → push-JXCWX4NY.js.map} +0 -0
  34. /package/dist/{require-deps-WDMHDGBN.js.map → require-deps-AEDO5YRM.js.map} +0 -0
  35. /package/dist/{stats-77BYLKYP.js.map → stats-63L7C24W.js.map} +0 -0
  36. /package/dist/{sync-DTCWK2CY.js.map → sync-QTJ6BXQ4.js.map} +0 -0
  37. /package/dist/{sync-clean-ACZCB3NZ.js.map → sync-clean-OJEK4XH4.js.map} +0 -0
  38. /package/dist/{sync-status-2V2RCYZO.js.map → sync-status-EAX527SC.js.map} +0 -0
  39. /package/dist/{tui-HVJNLRY2.js.map → tui-3KITZCNS.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  log
4
- } from "./chunk-QEPE3WVF.js";
4
+ } from "./chunk-U2TFIUGE.js";
5
5
 
6
6
  // src/commands/memory/utils/require-deps.ts
7
7
  import { createRequire } from "module";
@@ -44,4 +44,4 @@ export {
44
44
  cwdRequire,
45
45
  requireMemoryDeps
46
46
  };
47
- //# sourceMappingURL=chunk-D6RAMWH6.js.map
47
+ //# sourceMappingURL=chunk-7KB5YGQZ.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  cwdRequire
4
- } from "./chunk-D6RAMWH6.js";
4
+ } from "./chunk-7KB5YGQZ.js";
5
5
 
6
6
  // src/commands/memory/config.ts
7
7
  import { z } from "zod";
@@ -181,4 +181,4 @@ export {
181
181
  createDatabase,
182
182
  closeDatabase
183
183
  };
184
- //# sourceMappingURL=chunk-UN43OVRW.js.map
184
+ //# sourceMappingURL=chunk-DLDVXHI3.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  log
4
- } from "./chunk-QEPE3WVF.js";
4
+ } from "./chunk-U2TFIUGE.js";
5
5
 
6
6
  // src/commands/memory/utils/gist-transport.ts
7
7
  import { execSync } from "child_process";
@@ -205,4 +205,4 @@ export {
205
205
  deleteGistFile,
206
206
  updateGistFiles
207
207
  };
208
- //# sourceMappingURL=chunk-M6GVFN67.js.map
208
+ //# sourceMappingURL=chunk-IPGNXDJF.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-HSGSTSVN.js";
6
6
  import {
7
7
  migrate
8
- } from "./chunk-OPORVSAF.js";
8
+ } from "./chunk-MX3T2VEX.js";
9
9
  import {
10
10
  MemoryRepo
11
11
  } from "./chunk-IDH3M4EI.js";
@@ -14,7 +14,7 @@ import {
14
14
  createDatabase,
15
15
  loadConfig,
16
16
  resolveDataDir
17
- } from "./chunk-UN43OVRW.js";
17
+ } from "./chunk-DLDVXHI3.js";
18
18
 
19
19
  // src/commands/memory/subcommands/init-storage.ts
20
20
  function initStorage(dbPath) {
@@ -36,4 +36,4 @@ function initStorage(dbPath) {
36
36
  export {
37
37
  initStorage
38
38
  };
39
- //# sourceMappingURL=chunk-VF7U63AI.js.map
39
+ //# sourceMappingURL=chunk-LCKV24Q3.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  cwdRequire
4
- } from "./chunk-D6RAMWH6.js";
4
+ } from "./chunk-7KB5YGQZ.js";
5
5
  import {
6
6
  __export
7
- } from "./chunk-QEPE3WVF.js";
7
+ } from "./chunk-U2TFIUGE.js";
8
8
 
9
9
  // src/commands/memory/storage/migrations/001-initial.ts
10
10
  var initial_exports = {};
@@ -222,4 +222,4 @@ function migrate(db) {
222
222
  export {
223
223
  migrate
224
224
  };
225
- //# sourceMappingURL=chunk-OPORVSAF.js.map
225
+ //# sourceMappingURL=chunk-MX3T2VEX.js.map
@@ -46,7 +46,7 @@ import { homedir } from "os";
46
46
  // src/lib/sections.ts
47
47
  var SESSION_START_CONTENT = "- ALWAYS read @TASKS.md first \u2014 it tracks progress across sessions\n- Check the Session Log at the bottom of TASKS.md for where we left off\n- Update TASKS.md as you complete work";
48
48
  var BACKLOG_CONTENT = "- When a feature is discussed but deferred, add it to BACKLOG.md immediately\n- Never leave future ideas only in TASKS.md or conversation \u2014 they get lost\n- BACKLOG.md is the single source of truth for parked features\n- Every WP uses the 7-field template in BACKLOG.md \u2014 no freeform entries\n- Pull a WP into a sprint = **move**, not copy. A WP lives in exactly one file at a time";
49
- var STOP_AND_SWARM_CONTENT = 'Three failed iterations on the same problem = stop iterating alone.\n(An iteration = an attempted fix that did not change the failing symptom. Announce "Attempt N" when retrying so the count stays visible.)\nFirst, one systematic pass \u2014 it usually resolves the loop without the swarm:\nreproduce the failure, read the FULL error output, state one hypothesis about the root cause, and verify it BEFORE writing any fix.\nOnly if that pass fails, swarm: dispatch at least 3 parallel subagents via the Task tool \u2014 in a single message so they run concurrently \u2014 each investigating from a different angle:\n1. Root-cause debug agent\n2. Upstream library/docs research agent\n3. Alternative architecture agent\nHand each agent the exact repro command, the full error text, and the list of already-failed fixes \u2014 subagents start with empty context.\nWait for all agents to return, synthesize their findings, then act.\nFor re-planning after repeated failure, switch to plan mode instead of attempting again.';
49
+ var STOP_AND_SWARM_CONTENT = 'Three failed iterations on the same problem = stop iterating alone.\n(An iteration = an attempted fix that did not change the failing symptom. Announce "Attempt N" when retrying so the count stays visible.)\nFirst, one systematic pass \u2014 it usually resolves the loop without the swarm:\nreproduce the failure, read the FULL error output, state one hypothesis about the root cause, and verify it BEFORE writing any fix.\nOnly if that pass fails, swarm: dispatch at least 3 parallel subagents via the Task tool \u2014 in a single message so they run concurrently \u2014 each investigating from a different angle:\n1. Root-cause debug agent\n2. Upstream library/docs research agent\n3. Alternative architecture agent\nEvery agent brief has four parts \u2014 agents start with empty context: Mission (one sentence), Context (exact repro command, full error text, already-failed fixes), Scope fence (files/questions NOT to touch), Return format (findings as file:line + evidence).\nTreat agent output as testimony, not truth \u2014 spot-check load-bearing claims (open the cited file, re-run the cited command) before acting on them.\nWait for all agents to return, synthesize their findings, then act.\nFor re-planning after repeated failure, switch to plan mode instead of attempting again.';
50
50
  var STALE_SWARM_PHRASE = "spin up at least 3 parallel agents via the Agent tool";
51
51
  var SWARM_PHRASE_REPLACEMENT = "dispatch at least 3 parallel subagents via the Task tool (in a single message so they run concurrently)";
52
52
  var OFF_LIMITS_CONTENT = "- Never hardcode secrets \u2014 use environment variables\n- Never write to `.env` files\n- Never expose internal error details in API responses";
@@ -757,6 +757,7 @@ function isJqAvailable() {
757
757
  }
758
758
  return jqChecked;
759
759
  }
760
+ var FORCE_PUSH_ERE = "git +(-[cC][^ ]* +([^ ]+ +)?)*push([^|;&]*( -[a-zA-Z]*f[a-zA-Z]*| --force| --force-with-lease(=[^ ;|&]*)?)( |$|;|&)|[^|;&]* \\+[^ ;|&]+)";
760
761
 
761
762
  // src/lib/hook-scripts.ts
762
763
  var SPRINT_SIZE_CHECK = `#!/usr/bin/env bash
@@ -1627,7 +1628,7 @@ async function addForcePushProtection(root) {
1627
1628
  matcher: "Bash",
1628
1629
  hooks: [{
1629
1630
  type: "command",
1630
- command: `cmd=${jqField("command")}; echo "$cmd" | grep -qE 'push.*--force|push.*-f' && { echo 'WARNING: Force push detected \u2014 this can destroy remote history' >&2; exit 2; }; exit 0`
1631
+ command: `cmd=${jqField("command")}; echo "$cmd" | grep -qE "${FORCE_PUSH_ERE}" && { echo 'WARNING: Force push detected \u2014 this can destroy remote history' >&2; exit 2; }; exit 0`
1631
1632
  }]
1632
1633
  }, "Added force-push protection hook (PreToolUse \u2192 Bash)");
1633
1634
  }
@@ -1685,6 +1686,42 @@ async function addSessionStartHook(root) {
1685
1686
  hooks: [{ type: "command", command: "cat TASKS.md 2>/dev/null; exit 0" }]
1686
1687
  }, "Added SessionStart hook (injects TASKS.md at startup/resume/compact/clear)");
1687
1688
  }
1689
+ async function upgradeForcePushPattern(root) {
1690
+ const stale = "push.*--force|push.*-f";
1691
+ let any = false;
1692
+ for (const [read, write, label] of [
1693
+ [readSettingsJson, writeSettingsJson, "settings.json"],
1694
+ [readSettingsLocalJson, writeSettingsLocalJson, "settings.local.json"]
1695
+ ]) {
1696
+ const settings = await read(root);
1697
+ if (settings === null) continue;
1698
+ const raw = JSON.stringify(settings);
1699
+ if (!raw.includes(stale.replace(/\\/g, "\\\\"))) {
1700
+ if (!raw.includes(stale)) continue;
1701
+ }
1702
+ const hooks = settings.hooks;
1703
+ if (!hooks) continue;
1704
+ let changed = false;
1705
+ for (const groups of Object.values(hooks)) {
1706
+ for (const group of groups) {
1707
+ const inner = group.hooks;
1708
+ if (!inner) continue;
1709
+ for (const h of inner) {
1710
+ const cmd = typeof h.command === "string" ? h.command : "";
1711
+ if (cmd.includes(stale)) {
1712
+ h.command = cmd.replace(stale, FORCE_PUSH_ERE);
1713
+ changed = true;
1714
+ }
1715
+ }
1716
+ }
1717
+ }
1718
+ if (!changed) continue;
1719
+ await write(root, settings);
1720
+ log.success(`Upgraded force-push guard pattern in ${label}`);
1721
+ any = true;
1722
+ }
1723
+ return any;
1724
+ }
1688
1725
 
1689
1726
  // src/commands/doctor/fixer-hook-input.ts
1690
1727
  import { readFile as readFile4 } from "fs/promises";
@@ -1695,10 +1732,10 @@ function rewriteEnvVarHookCommand(cmd) {
1695
1732
  return `fp=${jqField("file_path")}; echo "$fp" | grep -qE '\\.(env|env\\..*)$' && ! echo "$fp" | grep -q '.env.example' && { echo 'BLOCKED: .env files contain secrets' >&2; exit 2; }; exit 0`;
1696
1733
  }
1697
1734
  if (cmd.includes("BLOCKED: Destructive command detected")) {
1698
- return `cmd=${jqField("command")}; echo "$cmd" | grep -qE 'rm\\s+-rf\\s+/|DROP\\s+TABLE|DROP\\s+DATABASE|push.*--force|push.*-f' && { echo 'BLOCKED: Destructive command detected' >&2; exit 2; }; exit 0`;
1735
+ return `cmd=${jqField("command")}; echo "$cmd" | grep -qE 'rm\\s+-rf\\s+/|DROP\\s+TABLE|DROP\\s+DATABASE|${FORCE_PUSH_ERE}' && { echo 'BLOCKED: Destructive command detected' >&2; exit 2; }; exit 0`;
1699
1736
  }
1700
1737
  if (cmd.includes("WARNING: Force push detected") || cmd.includes("Force push detected")) {
1701
- return `cmd=${jqField("command")}; echo "$cmd" | grep -qE 'push.*--force|push.*-f' && { echo 'WARNING: Force push detected \u2014 this can destroy remote history' >&2; exit 2; }; exit 0`;
1738
+ return `cmd=${jqField("command")}; echo "$cmd" | grep -qE '${FORCE_PUSH_ERE}' && { echo 'WARNING: Force push detected \u2014 this can destroy remote history' >&2; exit 2; }; exit 0`;
1702
1739
  }
1703
1740
  if (cmd.includes("Sprint complete") && cmd.includes("TASKS.md")) {
1704
1741
  return SPRINT_COMPLETE_NUDGE;
@@ -1754,6 +1791,15 @@ async function rewriteEnvVarHooks(root) {
1754
1791
  didFix = true;
1755
1792
  }
1756
1793
  }
1794
+ const localSettings = await readSettingsLocalJson(root);
1795
+ if (localSettings !== null) {
1796
+ const outcome = rewriteSettingsHooks(localSettings);
1797
+ if (outcome.changed) {
1798
+ await writeSettingsLocalJson(root, outcome.settings);
1799
+ log.success("Rewrote inert $TOOL_INPUT_* hooks in settings.local.json to canonical jq+stdin form");
1800
+ didFix = true;
1801
+ }
1802
+ }
1757
1803
  const workflowCheckPath = join5(root, ".claude", "hooks", "workflow-check.sh");
1758
1804
  if (await rewriteWrapperScript(workflowCheckPath, () => writeWorkflowCheckScript(root))) {
1759
1805
  log.success("Rewrote .claude/hooks/workflow-check.sh to canonical jq+stdin form");
@@ -2009,6 +2055,11 @@ var FIX_TABLE = [
2009
2055
  return a || b || c || d;
2010
2056
  }
2011
2057
  },
2058
+ {
2059
+ analyzer: "Hooks",
2060
+ match: "outdated pattern",
2061
+ fix: (root) => upgradeForcePushPattern(root)
2062
+ },
2012
2063
  {
2013
2064
  analyzer: "Hooks",
2014
2065
  match: ".env file protection",
@@ -2663,6 +2714,7 @@ export {
2663
2714
  jqField,
2664
2715
  hasEnvVarHookPattern,
2665
2716
  isJqAvailable,
2717
+ FORCE_PUSH_ERE,
2666
2718
  SPRINT_COMPLETE_NUDGE,
2667
2719
  WORKFLOW_CHECK_WRAPPER,
2668
2720
  SPRINT_OPEN_WRAPPER,
@@ -2682,4 +2734,4 @@ export {
2682
2734
  printScoreCard,
2683
2735
  renderDoctorReport
2684
2736
  };
2685
- //# sourceMappingURL=chunk-QEPE3WVF.js.map
2737
+ //# sourceMappingURL=chunk-U2TFIUGE.js.map