Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ chromatic-diagnostics.json

# symlinked skill files
.agents/skills/
.codex
1 change: 1 addition & 0 deletions docs/specs/alarm.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ Interaction (`dismissOrToggleAlarm` state machine):
- left-click the bell in any other enabled state: disables the alarm (destroys activity monitor)
- pressing `a` on a selected Pane in command mode: same as left-click
- right-click the bell (any state): opens a context menu with:
- a TODO row with `hard` and `off` options only; soft TODOs are never manually selectable here
- "Mark as TODO" / "Clear TODO" (toggles hard TODO), with `[t]` shortcut hint
- "Disable alarms" (only when alarm is enabled)
- brief description of soft/hard TODO behavior
Expand Down
6 changes: 3 additions & 3 deletions docs/specs/layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ The content area is a tiling layout of panes, powered by dockview. Each pane occ

### Pane header

Each pane has a 35px header that doubles as a drag handle. The header uses `cursor-grab` / `active:cursor-grabbing` and `select-none`. Background uses `--mt-tab-*` theme tokens (adapts to VSCode host theme). Dockview's default close button and right-actions container are hidden via CSS.
Each pane has a 30px header that doubles as a drag handle. The header uses `cursor-grab` / `active:cursor-grabbing` and `select-none`. Background uses `--mt-tab-*` theme tokens (adapts to VSCode host theme). Dockview's default close button and right-actions container are hidden via CSS.

Elements from left to right:

Expand Down Expand Up @@ -162,7 +162,7 @@ All handled in a single capture-phase `keydown` listener on `window`. Every hand
| `x` | Kill with confirmation | Restore session + kill confirmation |
| `d` | Detach to door | Restore session (stay in command) |
| `z` | Toggle maximize/restore | — |
| `t` | Toggle TODO flag (nonesoft → hard → none) | — |
| `t` | Toggle TODO flag (none/soft → hard → none) | — |
| `a` | Dismiss or toggle alarm | — |

### Kill confirmation
Expand Down Expand Up @@ -276,7 +276,7 @@ Each session carries `SessionUiState` with `status: SessionStatus` and `todo: To
Custom `mousetermTheme` extends dockview's `themeAbyss`:
- `gap: 6` — 6px between groups in both directions
- `dndOverlayMounting: 'absolute'`, `dndPanelOverlay: 'group'`
- Pane header height: `--dv-tabs-and-actions-container-height: 35px`
- Pane header height: `--dv-tabs-and-actions-container-height: 30px`
- 6px padding around the dockview area (`p-1.5` on wrapper, `inset-1.5` on container)

Colors use a two-layer CSS variable strategy: `--mt-*` semantic tokens → `var(--vscode-*, <fallback>)`. In VSCode, host theme variables take precedence. In standalone mode, fallback values apply (Dark+ defaults with `prefers-color-scheme: light` overrides). Tailwind v4 `@theme` block registers `--mt-*` tokens as Tailwind colors (e.g., `bg-surface`, `text-foreground`, `border-border`). See `theme.css` for the full token map.
Expand Down
1 change: 0 additions & 1 deletion docs/specs/vscode.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,6 @@ All types defined in `message-types.ts`. Webview-side handling in `vscode-adapte
| `alarm:clearAttention` | Clear attention timer |
| `alarm:toggleTodo` | Toggle TODO (false <-> hard) |
| `alarm:markTodo` | Set hard TODO |
| `alarm:promoteTodo` | Promote soft TODO to hard |
| `alarm:clearTodo` | Remove TODO |

**Extension Host -> Webview:**
Expand Down
11 changes: 11 additions & 0 deletions install_skills.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
set -e
cd "$(dirname "$0")"
npx skills experimental_install
mkdir -p .claude/commands
shopt -s nullglob
for skill in .agents/skills/*/; do
name="$(basename "$skill")"
ln -sfn "../../.agents/skills/$name" ".claude/commands/$name"
ln -sf "../../.agents/skills/$name/SKILL.md" ".claude/commands/$name.md"
done
270 changes: 133 additions & 137 deletions lib/src/components/Pond.tsx

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lib/src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ body {
PaneHeader / PaneContent layout. */

.dockview-theme-abyss {
--dv-tabs-and-actions-container-height: 35px !important;
--dv-tabs-and-actions-container-height: 30px !important;
--dv-tabs-and-actions-container-font-size: var(--mt-font-size) !important;
--dv-group-view-background-color: var(--mt-surface) !important;
--dv-tabs-and-actions-container-background-color: var(--mt-surface-alt) !important;
Expand Down
8 changes: 0 additions & 8 deletions lib/src/lib/alarm-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,14 +233,6 @@ export class AlarmManager {
this.notify(id);
}

/** Promote soft TODO to hard */
promoteTodo(id: string): void {
const entry = this.getOrCreateEntry(id);
if (entry.todo !== 'soft') return;
entry.todo = 'hard';
this.notify(id);
}

/** Clear any TODO state */
clearTodo(id: string): void {
const entry = this.getOrCreateEntry(id);
Expand Down
1 change: 0 additions & 1 deletion lib/src/lib/platform/fake-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ export class FakePtyAdapter implements PlatformAdapter {
alarmClearAttention(id?: string): void { this.alarmManager.clearAttention(id); }
alarmToggleTodo(id: string): void { this.alarmManager.toggleTodo(id); }
alarmMarkTodo(id: string): void { this.alarmManager.markTodo(id); }
alarmPromoteTodo(id: string): void { this.alarmManager.promoteTodo(id); }
alarmClearTodo(id: string): void { this.alarmManager.clearTodo(id); }
onAlarmState(handler: (detail: AlarmStateDetail) => void): void { this.alarmStateHandlers.add(handler); }
offAlarmState(handler: (detail: AlarmStateDetail) => void): void { this.alarmStateHandlers.delete(handler); }
Expand Down
1 change: 0 additions & 1 deletion lib/src/lib/platform/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ export interface PlatformAdapter {
alarmClearAttention(id?: string): void;
alarmToggleTodo(id: string): void;
alarmMarkTodo(id: string): void;
alarmPromoteTodo(id: string): void;
alarmClearTodo(id: string): void;
onAlarmState(handler: (detail: AlarmStateDetail) => void): void;
offAlarmState(handler: (detail: AlarmStateDetail) => void): void;
Expand Down
4 changes: 0 additions & 4 deletions lib/src/lib/platform/vscode-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,6 @@ export class VSCodeAdapter implements PlatformAdapter {
this.vscode.postMessage({ type: 'alarm:markTodo', id });
}

alarmPromoteTodo(id: string): void {
this.vscode.postMessage({ type: 'alarm:promoteTodo', id });
}

alarmClearTodo(id: string): void {
this.vscode.postMessage({ type: 'alarm:clearTodo', id });
}
Expand Down
1 change: 0 additions & 1 deletion lib/src/lib/session-save.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ function createPlatform(savedState: PersistedSession | null): PlatformAdapter {
alarmClearAttention: () => {},
alarmToggleTodo: () => {},
alarmMarkTodo: () => {},
alarmPromoteTodo: () => {},
alarmClearTodo: () => {},
onAlarmState: () => {},
offAlarmState: () => {},
Expand Down
4 changes: 0 additions & 4 deletions lib/src/lib/terminal-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,10 +238,6 @@ export function markSessionTodo(id: string): void {
getPlatform().alarmMarkTodo(resolveTerminalSessionId(id));
}

export function promoteSessionTodo(id: string): void {
getPlatform().alarmPromoteTodo(resolveTerminalSessionId(id));
}

export function clearSessionTodo(id: string): void {
getPlatform().alarmClearTodo(resolveTerminalSessionId(id));
}
Expand Down
12 changes: 6 additions & 6 deletions lib/src/theme.css
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@
--mt-tab-inactive-bg: var(--vscode-tab-inactiveBackground, #2d2d2d);
--mt-tab-active-fg: var(--vscode-tab-activeForeground, #ffffff);
--mt-tab-inactive-fg: var(--vscode-tab-inactiveForeground, #969696);
--mt-tab-selected-bg: var(--vscode-tab-activeBackground, #1e1e1e);
--mt-tab-selected-fg: var(--vscode-tab-activeForeground, #ffffff);
--mt-tab-selected-bg: var(--vscode-list-activeSelectionBackground, #094771);
--mt-tab-selected-fg: var(--vscode-list-activeSelectionForeground, #ffffff);

/* Terminal */
--mt-terminal-bg: var(--vscode-terminal-background, #1e1e1e);
Expand Down Expand Up @@ -104,8 +104,8 @@ body.vscode-light {
--mt-tab-inactive-bg: var(--vscode-tab-inactiveBackground, #ececec);
--mt-tab-active-fg: var(--vscode-tab-activeForeground, #333333);
--mt-tab-inactive-fg: var(--vscode-tab-inactiveForeground, #8e8e8e);
--mt-tab-selected-bg: var(--vscode-tab-activeBackground, #ffffff);
--mt-tab-selected-fg: var(--vscode-tab-activeForeground, #333333);
--mt-tab-selected-bg: var(--vscode-list-activeSelectionBackground, #cce6ff);
--mt-tab-selected-fg: var(--vscode-list-activeSelectionForeground, #000000);
--mt-terminal-bg: var(--vscode-terminal-background, #ffffff);
--mt-terminal-fg: var(--vscode-terminal-foreground, #333333);
--mt-badge-bg: var(--vscode-badge-background, #007acc);
Expand Down Expand Up @@ -157,8 +157,8 @@ body.vscode-light {
--mt-tab-inactive-bg: var(--vscode-tab-inactiveBackground, #ececec);
--mt-tab-active-fg: var(--vscode-tab-activeForeground, #333333);
--mt-tab-inactive-fg: var(--vscode-tab-inactiveForeground, #8e8e8e);
--mt-tab-selected-bg: var(--vscode-tab-activeBackground, #ffffff);
--mt-tab-selected-fg: var(--vscode-tab-activeForeground, #333333);
--mt-tab-selected-bg: var(--vscode-list-activeSelectionBackground, #cce6ff);
--mt-tab-selected-fg: var(--vscode-list-activeSelectionForeground, #000000);
--mt-terminal-bg: var(--vscode-terminal-background, #ffffff);
--mt-terminal-fg: var(--vscode-terminal-foreground, #333333);
--mt-badge-bg: var(--vscode-badge-background, #007acc);
Expand Down
4 changes: 0 additions & 4 deletions standalone/src/tauri-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,6 @@ export class TauriAdapter implements PlatformAdapter {
this.alarmManager.markTodo(id);
}

alarmPromoteTodo(id: string): void {
this.alarmManager.promoteTodo(id);
}

alarmClearTodo(id: string): void {
this.alarmManager.clearTodo(id);
}
Expand Down
3 changes: 0 additions & 3 deletions vscode-ext/src/message-router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,6 @@ export function attachRouter(
case 'alarm:markTodo':
alarmManager.markTodo(msg.id);
break;
case 'alarm:promoteTodo':
alarmManager.promoteTodo(msg.id);
break;
case 'alarm:clearTodo':
alarmManager.clearTodo(msg.id);
break;
Expand Down
1 change: 0 additions & 1 deletion vscode-ext/src/message-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export type WebviewMessage =
| { type: 'alarm:clearAttention'; id?: string }
| { type: 'alarm:toggleTodo'; id: string }
| { type: 'alarm:markTodo'; id: string }
| { type: 'alarm:promoteTodo'; id: string }
| { type: 'alarm:clearTodo'; id: string };

export interface PtyInfo {
Expand Down
Loading