@ekkos/cli 1.2.3 → 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,10 +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%).
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).
882
885
  */
883
- function launchWithWindowsTerminal() {
886
+ function launchWithWindowsTerminal(options) {
884
887
  const ekkosCmd = process.argv[1];
885
888
  const cwd = process.cwd();
886
889
  const launchTime = Date.now();
@@ -890,19 +893,54 @@ function launchWithWindowsTerminal() {
890
893
  fs.writeFileSync(markerPath, `${launchTime}\n${cwd}`);
891
894
  }
892
895
  catch { }
893
- const dashCommand = `node "${ekkosCmd}" dashboard --wait-for-new --refresh 2000`;
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
- (0, child_process_1.execSync)(`wt.exe -w 0 split-pane -V -s 0.4 -d "${cwd}" cmd /c "${dashCommand}"`, { stdio: 'pipe' });
898
- 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%)'));
899
938
  console.log(chalk_1.default.gray(' Switch panes: Alt+Arrow keys\n'));
900
939
  }
901
940
  catch (err) {
902
- 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}`));
903
942
  console.log(chalk_1.default.gray(' Run "ekkos dashboard --latest" in a separate terminal'));
904
943
  }
905
- // Don't return — run() continues to launch Claude in this (left) terminal
906
944
  }
907
945
  async function run(options) {
908
946
  // ══════════════════════════════════════════════════════════════════════════
@@ -938,11 +976,12 @@ async function run(options) {
938
976
  // ══════════════════════════════════════════════════════════════════════════
939
977
  if (options.dashboard) {
940
978
  if (isWindows) {
941
- // 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)
942
981
  try {
943
982
  (0, child_process_1.execSync)('where wt.exe', { encoding: 'utf-8', stdio: 'pipe' });
944
- launchWithWindowsTerminal();
945
- // 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
946
985
  }
947
986
  catch {
948
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.3",
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": {