Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b92251b
fix: build palette command indexes without trapping on duplicate ids
arzafran Sep 28, 2026
456ca23
test: cover session reliability regressions
arzafran Sep 28, 2026
1871724
fix: stop notification popover menu and layout churn
arzafran Sep 28, 2026
fdb79b1
fix: send the caller surface with programa notify
arzafran Sep 28, 2026
a5a1a1e
refactor: use generated v2 method names in browser commands
arzafran Sep 28, 2026
008e1b3
test(programad): add regression test for session.close SIGKILL escala…
arzafran Sep 28, 2026
93b6a8b
fix(programad): reap closed sessions off the async worker and escalat…
arzafran Sep 28, 2026
dc5b8e1
fix: make socket client handling nonisolated
arzafran Sep 28, 2026
e275fb3
fix: let replay release the terminal surface
arzafran Sep 28, 2026
19a7e2c
fix: host the sidebar workspace menu in a native NSMenu
arzafran Sep 28, 2026
b3aba1b
Merge branch 'fix/audit-notif-popover' into fix/audit-integration
arzafran Sep 28, 2026
1e29650
Merge branch 'fix/audit-layout-id' into fix/audit-integration
arzafran Sep 28, 2026
f57ea44
Merge branch 'fix/audit-cli-notify' into fix/audit-integration
arzafran Sep 28, 2026
8b45ee8
Merge branch 'fix/audit-socket-iso' into fix/audit-integration
arzafran Sep 28, 2026
edeae81
Merge branch 'fix/audit-daemon-close' into fix/audit-integration
arzafran Sep 28, 2026
7078c43
Merge branch 'fix/audit-reliability-tests' into fix/audit-integration
arzafran Sep 28, 2026
07c2a48
chore: scope workflow tokens to read and document the zig skip
arzafran Sep 28, 2026
e83b19b
refactor: tighten sidebar menu hit-testing and comments
arzafran Sep 28, 2026
6b7dbfa
feat: color-code pane tabs with a tinted background
arzafran Sep 28, 2026
2f2dcaa
refactor: use generated v2 method names in the MCP server
arzafran Sep 28, 2026
bdef447
fix: put the notification row menu catcher above the row button
arzafran Sep 28, 2026
139b3ac
Merge branch 'fix/audit-mcp-names' into fix/audit-integration
arzafran Sep 28, 2026
9f46ef2
fix: add missing catalog keys and Japanese translations
arzafran Sep 28, 2026
a2caa4a
fix: honor Reduce Motion for moving animations
arzafran Sep 28, 2026
fccb868
Merge branch 'fix/audit-reduce-motion' into fix/audit-integration
arzafran Sep 28, 2026
bfcd6d9
fix: route the tab context menu through hit-testing
arzafran Sep 28, 2026
4694173
fix: compile V2MethodNames into the unit test target
arzafran Sep 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/build-ghosttykit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build-ghosttykit:
runs-on: macos-15
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/ci-macos-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ on:

workflow_dispatch:

permissions:
contents: read

jobs:
change-detection:
runs-on: ubuntu-latest
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
change-detection:
runs-on: ubuntu-latest
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/test-depot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ on:
required: false
default: "120"

permissions:
contents: read

jobs:
tests:
runs-on: macos-15
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ on:
- macos-15
- macos-14

permissions:
contents: read

jobs:
e2e:
runs-on: ${{ inputs.runner || 'macos-15' }}
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ The app has a **Debug** menu in the macOS menu bar (only in DEBUG builds). Use i
- **Typing-latency-sensitive paths** (read carefully before touching these areas):
- `WindowTerminalHostView.hitTest()` in `Sources/WindowTerminalHostView.swift`: called on every event including keyboard. Keyboard events (`.keyDown`/`.keyUp`/`.flagsChanged`) take an early `switch currentEvent?.type` fast path; everything else — all pointer events, and an ambiguous/nil `currentEvent` — must fall through to the full divider/sidebar/drag routing below it. Do not add work to that keyboard fast path.
- `NSWindow.programa_sendEvent` in `Sources/WindowSwizzles.swift`: runs for every event. The hit-view context it caches is only ever read for pointer-down events, so it is computed only for those — do not restore an unconditional hit-test here (#183).
- `TabItemView` in `ContentView.swift`: uses `Equatable` conformance + `.equatable()` to skip body re-evaluation during typing. Do not add `@EnvironmentObject`, `@ObservedObject` (besides `tab`), or `@Binding` properties without updating the `==` function. Do not remove `.equatable()` from the ForEach call site. Do not read `tabManager` or `notificationStore` in the body; use the precomputed `let` parameters instead.
- `TabItemView` in `Sources/TabItemView.swift`: uses `Equatable` conformance + `.equatable()` to skip body re-evaluation during typing. Do not add `@EnvironmentObject`, `@ObservedObject` (besides `tab`), or `@Binding` properties without updating the `==` function. Do not remove `.equatable()` from the ForEach call site. Do not read `tabManager` or `notificationStore` in the body; use the precomputed `let` parameters instead.
- `TerminalSurface.forceRefresh()` in `GhosttyTerminalView.swift`: called on every keystroke. Do not add allocations, file I/O, or formatting here.
- **Terminal find layering contract:** `SurfaceSearchOverlay` must be mounted from `GhosttySurfaceScrollView` in `Sources/GhosttyTerminalView.swift` (AppKit portal layer), not from SwiftUI panel containers such as `Sources/Panels/TerminalPanelView.swift`. Portal-hosted terminal views can sit above SwiftUI during split/workspace churn.
- **Submodule safety:** When modifying a submodule (ghostty), always push the submodule commit to its remote `main` branch BEFORE committing the updated pointer in the parent repo. Never commit on a detached HEAD or temporary branch — the commit will be orphaned and lost. Verify with: `cd <submodule> && git merge-base --is-ancestor HEAD origin/main`. Note: `vendor/bonsplit` is NOT a submodule — it is vendored in-tree (MIT, from the manaflow-ai fork); edit and commit it like any other source directory.
Expand Down
8 changes: 4 additions & 4 deletions CLI-MCP/MCPSocketBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ struct MCPSocketBridge {

if let socketPassword {
_ = try Self.sendRequest(
method: "auth.login",
method: V2MethodNames.authLogin,
params: ["password": socketPassword],
socketFD: socketFD
)
Expand Down Expand Up @@ -169,11 +169,11 @@ struct MCPSocketBridge {
static func responseTimeout(method: String, params: [String: Any]) -> TimeInterval {
let timeoutMs: Int
switch method {
case "surface.wait":
case V2MethodNames.surfaceWait:
timeoutMs = timeoutInteger(params["timeout_ms"]) ?? timeoutInteger(params["timeout"]) ?? 30_000
case "browser.wait":
case V2MethodNames.browserWait:
timeoutMs = timeoutInteger(params["timeout_ms"]) ?? 5_000
case "browser.download.wait":
case V2MethodNames.browserDownloadWait:
timeoutMs = timeoutInteger(params["timeout_ms"]) ?? timeoutInteger(params["timeout"]) ?? 10_000
default:
return defaultResponseTimeoutSeconds
Expand Down
2 changes: 1 addition & 1 deletion CLI-MCP/Resources/SurfaceTextResource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ enum SurfaceTextResource {

let bridge = MCPSocketBridge()
do {
let result = try bridge.send(method: "surface.read_text", params: params)
let result = try bridge.send(method: V2MethodNames.surfaceReadText, params: params)
let text = (result["text"] as? String) ?? ""
return [.text(text, uri: "programa://surface/\(surfaceId)/text", mimeType: "text/plain")]
} catch {
Expand Down
2 changes: 1 addition & 1 deletion CLI-MCP/Resources/TreeResource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ enum TreeResource {

let bridge = MCPSocketBridge()
do {
let result = try bridge.send(method: "system.tree", params: params)
let result = try bridge.send(method: V2MethodNames.systemTree, params: params)
return [try ResourceCatalog.jsonContent(for: result, uri: uri)]
} catch {
throw MCPErrorMapping.mcpError(for: error)
Expand Down
Loading
Loading