Merged
Conversation
…ime users Summon uses System Events (for auto-resize and new-window) which requires the terminal app to have Accessibility permission. Previously, first-time users hit a cryptic -1719 error after completing the wizard, with guidance pointing to the wrong settings pane. - Add checkAccessibility() probe and openAccessibilitySettings() opener - Add isAccessibilityError() helper and shared guidance constants - Setup wizard: check after tool validation, offer to open Settings, re-check - Doctor: add "Checking permissions" section with accessibility status - Launcher: differentiate -1719 from generic osascript errors with targeted messages pointing to the correct Accessibility pane Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…freeze, keybindings (#104, #113, #114, #115, #116, #117) Phase 1: Ghostty theme per workspace (#104) - Add theme: string | null across full pipeline (LayoutOptions → LayoutPlan → AppleScript) - --theme CLI flag, config key, shell completions - AppleScript: set theme of cfg to "..." with proper escaping Phase 2: Doctor --fix (#113, #116) - summon doctor --fix auto-adds missing recommended Ghostty settings - Backs up config with timestamp before modifying - Three settings: window-save-state, notify-on-command-finish, shell-integration Phase 3: Per-pane working directories (#115) - pane.<name>.cwd config keys for tree layouts - Relative cwds resolved against targetDir - extractPaneCwds() parser, threaded through resolveTreeCommands → script generation Phase 4: summon freeze (#114) - summon freeze <name> snapshots current resolved config as reusable custom layout - Validates name, rejects duplicates, saves all config keys Phase 5: Key table export (#117) - summon keybindings generates Ghostty key table config for pane navigation - --vim flag for hjkl instead of arrow keys - New keybindings.ts pure function module 930 tests passing, typecheck/lint/build clean. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…and regex constants - Extract optsToConfigMap() in launcher.ts — freeze uses it instead of 15 lines of manual field mapping - Extract appendDryRunExtras() in launcher.ts — both dry-run blocks share starship/theme header logic - Compile PANE_CWD_RE as a module-level constant in tree.ts - Replace double-spread with Map constructor + set() loop in paneCwds merge Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add explicit throw in waitForHandler() if keypress handler is never registered within timeout. Add documentation comments explaining why setTimeout(0) is used to defer keypress simulation to the next tick. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add "main" field for legacy tooling compatibility - Add "publishConfig" with public access - Update typescript-eslint from 8.56.1 to 8.57.1 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add doctor --fix and keybindings --vim flag completions for both zsh and bash shell completion generators. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add defense-in-depth layoutPath() helper that verifies resolved paths stay within LAYOUTS_DIR. Used in saveCustomLayout, readCustomLayout, deleteCustomLayout, and isCustomLayout instead of bare join(). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add test for 4+ editor panes with secondaryEditor exercising the
rightColumnEditorCount > 1 && secondaryCmd branch in script.ts.
Add dedicated test for advance() hitting end-of-input on truncated
tree DSL expressions ("a |" and "a /") in tree.ts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- W4: validate env var key format in `summon set env.<KEY>` - R17: freeze usage consistency (`<name>` not `<layout-name>`) - R18: btop preset description (remove "lazygit" from description) - R19: layoutNotFoundOrExit adds "Error:" prefix - R20: doctor exits code 2 when issues remain unfixed - R21: export includes env.* keys from config - R24: config unknown key hint shows removal command - R25: export adds ISO timestamp comment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add unit tests for optsToConfigMap() covering all fields, empty opts, null fontSize/theme exclusion, and boolean flag filtering - Remove trivial resolveCommand wrapper in launcher.ts; callers now use resolveCommandPath from utils.ts directly - Extract isGhosttyInstalled() to utils.ts to deduplicate the GHOSTTY_PATHS.some(existsSync) pattern from launcher.ts and setup.ts - Change promptUser Ctrl+C exit code from 0 to 130 (128 + SIGINT) - Change nested workspace warning from "too scary" to "messy" Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ghostty's window-save-state restores split layouts but not pane commands, creating stale splits that conflict with summon's own layout management on re-launch. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…pport per-surface themes Ghostty's surface configuration object only supports: initial working directory, font size, command, environment variables, wait after command. The `theme` property does not exist (error -10006 at runtime). Removed from: layout.ts, tree.ts, script.ts, launcher.ts, index.ts, config.ts, completions.ts, and all associated tests and documentation. Users should set themes globally in ~/.config/ghostty/config instead. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add @internal tags to test-only exports: GHOSTTY_PATHS (utils.ts), layoutPath (config.ts) - Cache listStarshipPresets() results in a module-level variable, matching the existing cachedStarshipPath pattern - Reset preset cache in resetStarshipCache() alongside path cache - Add tests verifying cache hit, cache reset, and re-fetch behavior Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move ENV_KEY_RE regex from launcher.ts to validation.ts as shared export - Import shared constant in index.ts and launcher.ts (remove duplicates) - Show effective defaults in `summon config` when no machine config is set - Add ENV_KEY_RE test coverage in validation.test.ts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace 8 weak .toBeTruthy() assertions with .toBeTypeOf('string') in
setup.test.ts catalog/layout tests. Add 4 tests in launcher.test.ts
covering the tree layout + project CWD merge code path (launcher.ts:442-450).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
[1.2.1] - 2026-03-17
Removed
--themeflag andthemeconfig key — Ghostty's AppleScript API does not support per-surface themes (error -10006). Set themes globally in~/.config/ghostty/configinstead.window-save-statefromdoctorrecommendations — Ghostty restores split layouts but not pane commands, creating stale splits that conflict with summon's layout management.Fixed
ENV_KEY_REextracted to shared constant invalidation.ts(was duplicated in index.ts and launcher.ts)summon confignow shows effective defaults when no machine config is setChanged
@internalJSDoc tags added to all test-only exports for consistencylistStarshipPresets()results are now cached (avoids repeated shell-outs)mainhardened:enforce_adminsanddismiss_stale_reviewsenabledTests
.toBeTruthy()assertions replaced with.toBeTypeOf('string')ENV_KEY_REvalidationFull workflow:
/pre-launch→/remediate→/update-docs→/release