@keepgoingdev/cli 1.5.0 → 1.6.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 (3) hide show
  1. package/README.md +18 -5
  2. package/dist/index.js +104 -8
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -38,14 +38,27 @@ Flags:
38
38
 
39
39
  ### `keepgoing save`
40
40
 
41
- Save a new checkpoint interactively. Prompts for:
42
-
43
- 1. What did you work on? (required)
44
- 2. What's your next step? (required)
45
- 3. Any blockers? (optional)
41
+ Save a new checkpoint. By default, auto-generates the summary and next step from recent git activity (commits and touched files). No interactive prompts.
46
42
 
47
43
  Git branch and touched files are auto-detected from the workspace.
48
44
 
45
+ Flags:
46
+
47
+ - `-m, --message <text>` — use a custom summary instead of auto-generating
48
+ - `-n, --next <text>` — use a custom next step instead of auto-generating
49
+ - `--force` — save even if a recent checkpoint exists or there are no detected changes
50
+ - `--json` — output raw JSON
51
+ - `--quiet` — suppress output
52
+ - `--cwd <path>` — override the working directory
53
+
54
+ Examples:
55
+
56
+ ```bash
57
+ keepgoing save # auto-generate from git
58
+ keepgoing save -m "Finished auth flow" # custom summary
59
+ keepgoing save --force # save even if no changes
60
+ ```
61
+
49
62
  ### `keepgoing hook install`
50
63
 
51
64
  Install a shell hook that runs `keepgoing status --quiet` automatically whenever you `cd` into a directory that contains `.keepgoing/`.
package/dist/index.js CHANGED
@@ -5302,14 +5302,15 @@ function cancelAndExit() {
5302
5302
 
5303
5303
  // src/commands/setup.ts
5304
5304
  var execAsync = promisify2(exec2);
5305
- var VALID_PRESETS = ["vscode", "claude", "copilot", "cursor", "windsurf", "jetbrains"];
5305
+ var VALID_PRESETS = ["vscode", "claude", "copilot", "cursor", "windsurf", "jetbrains", "desktop-tray"];
5306
5306
  var PRESET_DEFAULTS = {
5307
5307
  vscode: { ide: ["vscode"] },
5308
5308
  jetbrains: { ide: ["jetbrains"] },
5309
5309
  claude: { tools: ["claude-code"] },
5310
5310
  copilot: { tools: ["copilot"] },
5311
5311
  cursor: { tools: ["cursor"] },
5312
- windsurf: { tools: ["windsurf"] }
5312
+ windsurf: { tools: ["windsurf"] },
5313
+ "desktop-tray": { desktopTray: true }
5313
5314
  };
5314
5315
  var PRESET_LABELS = {
5315
5316
  vscode: "VS Code",
@@ -5317,7 +5318,8 @@ var PRESET_LABELS = {
5317
5318
  claude: "Claude Code",
5318
5319
  copilot: "GitHub Copilot",
5319
5320
  cursor: "Cursor",
5320
- windsurf: "Windsurf"
5321
+ windsurf: "Windsurf",
5322
+ "desktop-tray": "Desktop Tray"
5321
5323
  };
5322
5324
  var JETBRAINS_PLUGIN_URL = "https://plugins.jetbrains.com/plugin/30449-keepgoing";
5323
5325
  var JETBRAINS_PLUGIN_ID = "com.keepgoing.plugin";
@@ -5367,7 +5369,7 @@ async function setupCommand(options) {
5367
5369
  tools = presetDefaults.tools;
5368
5370
  dist_exports.log.step(`AI tool: ${tools.map((t2) => t2 === "claude-code" ? "Claude Code" : t2.charAt(0).toUpperCase() + t2.slice(1)).join(", ")}`);
5369
5371
  const addMore = await dist_exports.multiselect({
5370
- message: "Also configure any of these?",
5372
+ message: "Also configure any of these? (enter to skip)",
5371
5373
  options: [
5372
5374
  ...!tools.includes("claude-code") ? [{ label: "Claude Code", value: "claude-code" }] : [],
5373
5375
  ...!tools.includes("copilot") ? [{ label: "GitHub Copilot", value: "copilot" }] : [],
@@ -5406,12 +5408,14 @@ async function setupCommand(options) {
5406
5408
  if (isCancel(pluginAnswer)) cancelAndExit();
5407
5409
  claudePlugin = pluginAnswer === "plugin";
5408
5410
  }
5411
+ const IDE_TOOLS = ["cursor", "windsurf"];
5412
+ const hasIdeTool = tools.some((t2) => IDE_TOOLS.includes(t2));
5409
5413
  let ide;
5410
5414
  if (presetDefaults?.ide) {
5411
5415
  ide = presetDefaults.ide;
5412
5416
  dist_exports.log.step(`IDE: ${ide.map((i) => i === "vscode" ? "VS Code" : i === "jetbrains" ? "JetBrains" : "Terminal").join(", ")}`);
5413
5417
  const addMoreIde = await dist_exports.multiselect({
5414
- message: "Also configure any of these?",
5418
+ message: "Also configure any of these? (enter to skip)",
5415
5419
  options: [
5416
5420
  ...!ide.includes("vscode") ? [{ label: "VS Code", value: "vscode" }] : [],
5417
5421
  ...!ide.includes("jetbrains") ? [{ label: "JetBrains", hint: "IntelliJ, WebStorm, PyCharm, etc.", value: "jetbrains" }] : [],
@@ -5422,6 +5426,19 @@ async function setupCommand(options) {
5422
5426
  if (!isCancel(addMoreIde) && addMoreIde.length > 0) {
5423
5427
  ide = [...ide, ...addMoreIde];
5424
5428
  }
5429
+ } else if (hasIdeTool) {
5430
+ ide = [];
5431
+ const addIdeExtensions = await dist_exports.multiselect({
5432
+ message: "Also configure IDE extensions? (enter to skip)",
5433
+ options: [
5434
+ { label: "VS Code", value: "vscode" },
5435
+ { label: "JetBrains", hint: "IntelliJ, WebStorm, PyCharm, etc.", value: "jetbrains" }
5436
+ ],
5437
+ required: false
5438
+ });
5439
+ if (!isCancel(addIdeExtensions) && addIdeExtensions.length > 0) {
5440
+ ide = addIdeExtensions;
5441
+ }
5425
5442
  } else {
5426
5443
  const ideAnswer = await dist_exports.multiselect({
5427
5444
  message: "Which IDE(s) do you use?",
@@ -5641,6 +5658,83 @@ async function setupCommand(options) {
5641
5658
  }
5642
5659
  }
5643
5660
  }
5661
+ let installDesktopTray = false;
5662
+ const trayPreset = presetDefaults?.desktopTray === true;
5663
+ if (process.platform === "darwin") {
5664
+ const alreadyInstalled = fs10.existsSync("/Applications/KeepGoing.app");
5665
+ if (alreadyInstalled) {
5666
+ dist_exports.log.message(`${DIM5}Desktop tray: Already installed${RESET5}`);
5667
+ installDesktopTray = true;
5668
+ } else {
5669
+ if (!trayPreset) {
5670
+ dist_exports.note(
5671
+ "A menubar app that shows re-entry briefings, active sessions,\nand momentum across all your projects. Editor-agnostic, free.",
5672
+ "Desktop Tray"
5673
+ );
5674
+ }
5675
+ const wantsTray = trayPreset || await (async () => {
5676
+ const trayAnswer = await dist_exports.confirm({
5677
+ message: "Install the desktop tray app?",
5678
+ initialValue: trayPreset,
5679
+ active: "Yes",
5680
+ inactive: "No, skip"
5681
+ });
5682
+ return !isCancel(trayAnswer) && trayAnswer;
5683
+ })();
5684
+ if (wantsTray) {
5685
+ installDesktopTray = true;
5686
+ let installed = false;
5687
+ let hasHomebrew = false;
5688
+ try {
5689
+ execSync3("brew --version", { stdio: "pipe" });
5690
+ hasHomebrew = true;
5691
+ } catch {
5692
+ }
5693
+ if (hasHomebrew) {
5694
+ const ts = dist_exports.spinner();
5695
+ ts.start("Installing desktop tray via Homebrew...");
5696
+ try {
5697
+ const { stderr } = await execAsync(
5698
+ "brew tap keepgoing-dev/tap && brew install --cask keepgoing",
5699
+ { timeout: 12e4 }
5700
+ );
5701
+ if (stderr?.includes("already installed")) {
5702
+ ts.stop("Desktop tray: Already installed via Homebrew");
5703
+ } else {
5704
+ ts.stop("Desktop tray installed");
5705
+ }
5706
+ installed = true;
5707
+ try {
5708
+ execSync3("open -a KeepGoing", { stdio: "pipe" });
5709
+ } catch {
5710
+ }
5711
+ } catch {
5712
+ ts.stop("Homebrew install failed");
5713
+ }
5714
+ }
5715
+ if (!installed) {
5716
+ dist_exports.log.info(
5717
+ "Install manually:\n 1. Download from https://github.com/keepgoing-dev/releases/releases/latest\n 2. Drag KeepGoing.app to /Applications\n 3. Run: xattr -cr /Applications/KeepGoing.app\n 4. Open KeepGoing from Applications"
5718
+ );
5719
+ }
5720
+ } else {
5721
+ dist_exports.log.info("Desktop tray: Install anytime with:\n brew tap keepgoing-dev/tap && brew install --cask keepgoing");
5722
+ }
5723
+ }
5724
+ if (installDesktopTray) {
5725
+ try {
5726
+ const existing = readTrayConfigProjects();
5727
+ if (!existing.includes(options.cwd)) {
5728
+ const trayConfigDir = path13.join(os6.homedir(), ".keepgoing");
5729
+ fs10.mkdirSync(trayConfigDir, { recursive: true });
5730
+ const trayConfigPath = path13.join(trayConfigDir, "tray-config.json");
5731
+ const updated = { projects: [...existing, options.cwd] };
5732
+ fs10.writeFileSync(trayConfigPath, JSON.stringify(updated, null, 2) + "\n", "utf-8");
5733
+ }
5734
+ } catch {
5735
+ }
5736
+ }
5737
+ }
5644
5738
  if (hasLicense) {
5645
5739
  const key = await dist_exports.text({
5646
5740
  message: "Enter your license key",
@@ -5697,6 +5791,7 @@ async function setupCommand(options) {
5697
5791
  scope,
5698
5792
  shellHook: installShellHook,
5699
5793
  claudePlugin,
5794
+ desktopTray: installDesktopTray,
5700
5795
  licensed
5701
5796
  };
5702
5797
  const keepgoingDir = path13.join(os6.homedir(), ".keepgoing");
@@ -6159,7 +6254,7 @@ import { spawn } from "child_process";
6159
6254
  import { readFileSync, existsSync } from "fs";
6160
6255
  import path14 from "path";
6161
6256
  import os7 from "os";
6162
- var CLI_VERSION = "1.5.0";
6257
+ var CLI_VERSION = "1.6.0";
6163
6258
  var NPM_REGISTRY_URL = "https://registry.npmjs.org/@keepgoingdev/cli/latest";
6164
6259
  var FETCH_TIMEOUT_MS = 5e3;
6165
6260
  var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
@@ -6246,7 +6341,7 @@ var BOLD3 = "\x1B[1m";
6246
6341
  var DIM4 = "\x1B[2m";
6247
6342
  var GREEN3 = "\x1B[32m";
6248
6343
  var YELLOW3 = "\x1B[33m";
6249
- var CLI_VERSION2 = "1.5.0";
6344
+ var CLI_VERSION2 = "1.6.0";
6250
6345
  async function updateCommand() {
6251
6346
  console.log(`
6252
6347
  ${BOLD3}KeepGoing CLI${RESET4} ${DIM4}v${CLI_VERSION2}${RESET4}
@@ -6356,6 +6451,7 @@ Presets:
6356
6451
  windsurf Pre-select Windsurf
6357
6452
  vscode Pre-select VS Code IDE
6358
6453
  jetbrains Pre-select JetBrains IDE
6454
+ desktop-tray Install the desktop tray app
6359
6455
 
6360
6456
  Options:
6361
6457
  --cwd <path> Override the working directory
@@ -6775,7 +6871,7 @@ async function main() {
6775
6871
  await updateCommand();
6776
6872
  break;
6777
6873
  case "version":
6778
- console.log(`keepgoing v${"1.5.0"}`);
6874
+ console.log(`keepgoing v${"1.6.0"}`);
6779
6875
  break;
6780
6876
  case "activate":
6781
6877
  await activateCommand({ licenseKey: subcommand });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keepgoingdev/cli",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Terminal CLI for KeepGoing. Resume side projects without the mental friction.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",