Skip to content

release: v1.2.1#188

Merged
juan294 merged 27 commits intomainfrom
release/v1.2.1
Mar 17, 2026
Merged

release: v1.2.1#188
juan294 merged 27 commits intomainfrom
release/v1.2.1

Conversation

@juan294
Copy link
Owner

@juan294 juan294 commented Mar 17, 2026

[1.2.1] - 2026-03-17

Removed

  • --theme flag and theme config key — Ghostty's AppleScript API does not support per-surface themes (error -10006). Set themes globally in ~/.config/ghostty/config instead.
  • window-save-state from doctor recommendations — Ghostty restores split layouts but not pane commands, creating stale splits that conflict with summon's layout management.

Fixed

  • ENV_KEY_RE extracted to shared constant in validation.ts (was duplicated in index.ts and launcher.ts)
  • summon config now shows effective defaults when no machine config is set

Changed

  • @internal JSDoc tags added to all test-only exports for consistency
  • listStarshipPresets() results are now cached (avoids repeated shell-outs)
  • Branch protection on main hardened: enforce_admins and dismiss_stale_reviews enabled

Tests

  • 958 total tests (was 955 in v1.2.0)
  • 8 weak .toBeTruthy() assertions replaced with .toBeTypeOf('string')
  • 4 new tests covering tree layout + project CWD merge path
  • 3 new tests for starship preset caching
  • 6 new tests for ENV_KEY_RE validation

Full workflow: /pre-launch/remediate/update-docs/release

juan294 and others added 27 commits March 16, 2026 19:03
…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>
@juan294 juan294 merged commit 1bcf84c into main Mar 17, 2026
3 of 4 checks passed
@juan294 juan294 deleted the release/v1.2.1 branch March 17, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant