@ekkos/cli 1.2.4 → 1.2.5

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.
@@ -877,11 +877,13 @@ function launchWithDashboard(options) {
877
877
  }
878
878
  }
879
879
  /**
880
- * Launch dashboard in a new Windows Terminal pane to the right (40%).
881
- * Claude Code continues in the current (left) pane (60%).
882
- * Mirrors the macOS tmux layout: Claude left 60%, dashboard right 40%.
880
+ * Launch a NEW Windows Terminal window with Claude (left 60%) + dashboard (right 40%).
881
+ *
882
+ * wt.exe cannot split the CURRENT window from a script (microsoft/terminal#4656).
883
+ * Instead, we launch a new WT window with both panes pre-defined using semicolons,
884
+ * matching the macOS tmux approach (new session with both panes).
883
885
  */
884
- function launchWithWindowsTerminal() {
886
+ function launchWithWindowsTerminal(options) {
885
887
  const ekkosCmd = process.argv[1];
886
888
  const cwd = process.cwd();
887
889
  const launchTime = Date.now();
@@ -891,19 +893,54 @@ function launchWithWindowsTerminal() {
891
893
  fs.writeFileSync(markerPath, `${launchTime}\n${cwd}`);
892
894
  }
893
895
  catch { }
896
+ // Build ekkos run args WITHOUT --dashboard (prevent recursion)
897
+ const runArgs = ['run'];
898
+ if (options.session)
899
+ runArgs.push('-s', options.session);
900
+ if (options.bypass)
901
+ runArgs.push('-b');
902
+ if (options.verbose)
903
+ runArgs.push('-v');
904
+ if (options.doctor)
905
+ runArgs.push('-d');
906
+ if (options.research)
907
+ runArgs.push('-r');
908
+ if (options.noInject)
909
+ runArgs.push('--skip-inject');
910
+ if (options.noDna)
911
+ runArgs.push('--skip-dna');
912
+ if (options.noProxy)
913
+ runArgs.push('--skip-proxy');
914
+ // Escape paths for cmd shell
915
+ const nodeExe = process.execPath;
916
+ const claudeCmd = `"${nodeExe}" "${ekkosCmd}" ${runArgs.join(' ')}`;
917
+ const dashCmd = `"${nodeExe}" "${ekkosCmd}" dashboard --wait-for-new --refresh 2000`;
894
918
  try {
895
- // Spawn dashboard in a RIGHT pane (40%), Claude stays in current LEFT pane (60%)
896
- // -V = vertical split, -s 0.4 = new pane gets 40% width
897
- // Using -- separator: no cmd.exe wrapper, no command prompt flash
898
- (0, child_process_1.execSync)(`wt.exe -w 0 split-pane -V -s 0.4 -d "${cwd}" -- node "${ekkosCmd}" dashboard --wait-for-new --refresh 2000`, { stdio: 'pipe' });
899
- console.log(chalk_1.default.cyan('\n Dashboard launched in right pane (40%)'));
919
+ // Launch new WT window with both panes pre-defined:
920
+ // Pane 0 (left, 60%): Claude Code
921
+ // Pane 1 (right, 40%): Dashboard
922
+ // Uses semicolon syntax to define multiple panes in one wt.exe invocation.
923
+ // --title sets pane titles for easy identification.
924
+ const wtCmd = [
925
+ 'wt.exe',
926
+ '--title "Claude Code"',
927
+ `-d "${cwd}"`,
928
+ claudeCmd,
929
+ '\\;', // semicolon separator (escaped for cmd)
930
+ 'split-pane -V -s 0.4',
931
+ '--title "ekkOS Dashboard"',
932
+ `-d "${cwd}"`,
933
+ dashCmd,
934
+ ].join(' ');
935
+ (0, child_process_1.execSync)(wtCmd, { stdio: 'pipe' });
936
+ console.log(chalk_1.default.cyan('\n Launched Claude Code + Dashboard in Windows Terminal'));
937
+ console.log(chalk_1.default.gray(' Claude (left 60%) | Dashboard (right 40%)'));
900
938
  console.log(chalk_1.default.gray(' Switch panes: Alt+Arrow keys\n'));
901
939
  }
902
940
  catch (err) {
903
- console.log(chalk_1.default.yellow(` Windows Terminal split failed: ${err.message}`));
941
+ console.log(chalk_1.default.yellow(` Windows Terminal launch failed: ${err.message}`));
904
942
  console.log(chalk_1.default.gray(' Run "ekkos dashboard --latest" in a separate terminal'));
905
943
  }
906
- // Don't return — run() continues to launch Claude in this (left) terminal
907
944
  }
908
945
  async function run(options) {
909
946
  // ══════════════════════════════════════════════════════════════════════════
@@ -939,11 +976,12 @@ async function run(options) {
939
976
  // ══════════════════════════════════════════════════════════════════════════
940
977
  if (options.dashboard) {
941
978
  if (isWindows) {
942
- // Windows: dashboard opens in right pane, Claude continues in this (left) terminal
979
+ // Windows: launch NEW WT window with Claude (left) + dashboard (right)
980
+ // wt.exe cannot split the current window from a script (microsoft/terminal#4656)
943
981
  try {
944
982
  (0, child_process_1.execSync)('where wt.exe', { encoding: 'utf-8', stdio: 'pipe' });
945
- launchWithWindowsTerminal();
946
- // Don't return fall through to launch Claude in this terminal
983
+ launchWithWindowsTerminal(options);
984
+ return; // Both panes launched in new window exit this terminal
947
985
  }
948
986
  catch {
949
987
  console.log(chalk_1.default.yellow(' Windows Terminal (wt.exe) not found.'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ekkos/cli",
3
- "version": "1.2.4",
3
+ "version": "1.2.5",
4
4
  "description": "Setup ekkOS memory for AI coding assistants (Claude Code, Cursor, Windsurf)",
5
5
  "main": "dist/index.js",
6
6
  "bin": {