@akiojin/gwt 9.14.0 → 9.16.0

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.
package/.husky/pre-push CHANGED
@@ -11,10 +11,46 @@ unset GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE GIT_PREFIX \
11
11
  GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES \
12
12
  GIT_NAMESPACE GIT_COMMON_DIR
13
13
 
14
+ ensure_coverage_tooling() {
15
+ if ! command -v cargo >/dev/null 2>&1; then
16
+ echo "cargo is required for pre-push checks but was not found on PATH." >&2
17
+ exit 1
18
+ fi
19
+
20
+ if cargo llvm-cov --version >/dev/null 2>&1; then
21
+ return
22
+ fi
23
+
24
+ echo "cargo-llvm-cov is not installed. Installing it before coverage check..."
25
+ if ! cargo install cargo-llvm-cov --locked; then
26
+ echo "Failed to install cargo-llvm-cov." >&2
27
+ echo "Run manually: cargo install cargo-llvm-cov --locked" >&2
28
+ exit 1
29
+ fi
30
+
31
+ if command -v rustup >/dev/null 2>&1; then
32
+ echo "Ensuring llvm-tools-preview is available..."
33
+ if ! rustup component add llvm-tools-preview; then
34
+ echo "Warning: failed to install llvm-tools-preview." >&2
35
+ echo "Continuing; cargo llvm-cov will validate llvm tool availability." >&2
36
+ echo "Manual recovery: rustup component add llvm-tools-preview" >&2
37
+ fi
38
+ else
39
+ echo "rustup not found; assuming llvm tools are provided by the active toolchain."
40
+ fi
41
+
42
+ if ! cargo llvm-cov --version >/dev/null 2>&1; then
43
+ echo "cargo-llvm-cov was installed, but cargo llvm-cov is still unavailable." >&2
44
+ echo "Ensure Cargo's bin directory is on PATH, then retry push." >&2
45
+ exit 1
46
+ fi
47
+ }
48
+
14
49
  echo "Running CI-equivalent lint checks..."
15
50
 
16
51
  cargo clippy --all-targets --all-features -- -D warnings
17
52
  cargo fmt --all -- --check
53
+ ensure_coverage_tooling
18
54
  cargo llvm-cov -p gwt-core -p gwt --all-features --json --summary-only --output-path target/coverage-summary.json -- --test-threads=1
19
55
  node scripts/check-coverage-threshold.mjs target/coverage-summary.json 90
20
56
  bunx --bun markdownlint-cli . --config .markdownlint.json --ignore target --ignore CHANGELOG.md --ignore tasks/todo.md
package/README.ja.md CHANGED
@@ -1,7 +1,33 @@
1
1
  # gwt
2
2
 
3
- gwt は Git worktree の管理と、`Claude Code` / `Codex` / `Gemini` /
4
- `OpenCode` などのコーディングエージェント起動を行うデスクトップ GUI です。
3
+ gwt は agent-driven development のためのデスクトップ control plane です。
4
+ コーディングエージェント、プロジェクト文脈、共有 coordination、GitHub
5
+ Issue ベースの SPEC、セマンティック検索、managed workflow automation を、
6
+ ネイティブ GUI とブラウザから開ける 1 つの workspace に集約します。
7
+
8
+ Git worktree は gwt の背後にある隔離基盤です。gwt は安全な task ごとの
9
+ Agent workspace を materialize するために worktree を使いますが、利用者の
10
+ 主導線は branch 管理ではなく、作業、Issue、SPEC、検索、Board 文脈から始まります。
11
+
12
+ ## gwt の特徴
13
+
14
+ - **Agent workspace** — `Claude Code` / `Codex` / `Gemini` / `OpenCode` /
15
+ `Copilot` / custom agent を共有 canvas から起動・再開・状態確認できます。
16
+ - **Shared Board** — user と agent の communication を repo-scoped timeline に集約し、
17
+ `status` / `claim` / `next` / `blocked` / `handoff` / `decision` /
18
+ `question` を扱えます。
19
+ - **Agent 間 coordination** — managed hooks が reasoning milestone の投稿を促し、
20
+ 直近の Board 文脈を注入するため、並列 Agent が判断・引き継ぎ・ブロッカー・
21
+ 自分宛 request を把握できます。
22
+ - **Semantic Knowledge Bridge** — Issue、SPEC、project source、docs を
23
+ substring だけでなく ChromaDB / multilingual-e5 の semantic index で検索できます。
24
+ - **GitHub Issue-backed SPEC** — `gwt-spec` Issue を正本にしつつ、
25
+ ローカル cache-backed CLI で section 単位に読み書きできます。
26
+ - **Managed workflow skills** — discussion、Issue routing、planning、
27
+ TDD implementation、PR、architecture review、project search、agent 管理用の
28
+ bundled `gwt-*` skills を使えます。
29
+ - **Operator canvas** — Agent、Board、Issue、SPEC、Logs、Memo、Profile、
30
+ File Tree、Branches、PR surface を mission-control 風 workspace に並べられます。
5
31
 
6
32
  ## インストール
7
33
 
@@ -77,49 +103,103 @@ gwtd issue spec 1784 --section plan
77
103
  gwtd pr current
78
104
  gwtd board show
79
105
  gwtd hook workflow-policy
106
+ gwtd daemon status # プロジェクトごとの runtime daemon を確認
80
107
  ```
81
108
 
82
- managed hook と runtime 委譲は `gwtd` を使います。利用者が別の daemon
83
- プロセスを手動起動する必要はありません。
109
+ managed hook と runtime 委譲は `gwtd` を使います。macOS と Linux では、
110
+ ユーザーが `gwtd daemon start` を実行することでプロジェクトごとの
111
+ runtime daemon(Unix ドメインソケット IPC)が起動します。daemon
112
+ が live な間、同じリポジトリに繋がっている全 `gwt` インスタンスへ
113
+ イベントが fan-out されます(例: 片方のウィンドウで Board に投稿
114
+ した内容が、別インスタンスにも遅延なく届く)。Ctrl-C / SIGTERM で
115
+ daemon を停止するまでバックグラウンドで動き続けます。診断用に
116
+ `gwtd daemon status` で現在の endpoint を確認できます。`gwtd
117
+ daemon start` を実行していない場合は multi-instance fan-out は
118
+ 無効ですが、ローカルのファイルベース state とファイル watcher は
119
+ 従来どおり動作します。
120
+
121
+ Windows では現状 long-running daemon は提供されておらず、
122
+ `gwtd daemon start` は "not yet implemented" で終了します。managed
123
+ hook は同期的な `gwt hook ...` dispatch にフォールバックし、複数
124
+ インスタンス間のイベント fan-out は Windows 対応 (named-pipe 経路)
125
+ が完了するまで利用できません。`gwtd daemon status` 自体は Windows
126
+ でも実行可能ですが、daemon が動かないため常に `stopped` を表示します。
127
+
128
+ ## Agent Workflow
129
+
130
+ 1. プロジェクトを開く、または前回のプロジェクトを復元する
131
+ 2. `Board`、`Issue`、`SPEC`、Knowledge search surface で現在の作業、
132
+ 関連 owner、過去の判断を把握する
133
+ 3. まだ branch ではなく作業単位として曖昧な場合は、Project Bar または
134
+ Command Palette の `Start Work` を選ぶ
135
+ 4. `Start Work` から `Agent` を起動する。既知の owner がある場合は
136
+ Issue / SPEC detail から直接 Launch Agent する
137
+ 5. 起動確定時にのみ、gwt が背後の `work/YYYYMMDD-HHMM[-n]`
138
+ branch / worktree を materialize する
139
+ 6. Agent 実行中は shared Board に status、claim、next、blocked、
140
+ handoff、decision を残して coordination する
141
+ 7. Git の確認・filter・cleanup・低レベルな branch/worktree detail が必要な場合だけ
142
+ `Branches` を開く
143
+
144
+ 主なウィンドウ:
145
+
146
+ - `Agent` — Start Work / Launch Agent から作成される実 coding-agent process window
147
+ - `Board` — reasoning と coordination のための user / agent shared timeline
148
+ - `Issue` / `SPEC` — semantic search、detail pane、Launch Agent handoff を備えた
149
+ cache-backed Knowledge Bridge
150
+ - `Logs` — project diagnostics と live log surface
151
+ - `Memo` / `Profile` — repo-scoped note と environment/profile 管理
152
+ - `File Tree` — 実リポジトリの read-only tree
153
+ - `Branches` — branch 確認、filter、cleanup、Git detail
154
+ - `Settings` — application と agent の設定
155
+ - `PR` — pull-request workflow surface。詳細な一覧機能は cache-backed PR source の整備に依存します
156
+
157
+ `Agent` は coding agent セッション用の実プロセスウィンドウです。`Board` は
158
+ Agent が status、decision、handoff、request を外部化する coordination surface です。
159
+ `Issue` と `SPEC` は frontend から GitHub API response を直接描画せず、
160
+ ローカル cache と semantic index を使います。
84
161
 
85
- ## 基本フロー
162
+ Windows の Host 起動では、Launch Agent で Command Prompt、Windows PowerShell、
163
+ PowerShell 7 を選択できます。Docker 起動では引き続きコンテナ内のシェルを使います。
86
164
 
87
- 1. リポジトリを開く、または前回のプロジェクトを復元する
88
- 2. キャンバス上に必要なウィンドウを並べる
89
- 3. `Branches` でブランチを選択し、ダブルクリックで Launch Agent を開く
90
- 4. `Shell` または `Agent` ウィンドウを起動する
91
- 5. `File Tree` でリポジトリを閲覧する
165
+ ターミナルウィンドウでは、テキストをドラッグ選択してマウスボタンを離すとコピー
166
+ できます。Windows / Linux では `Ctrl+Shift+C` でも現在の選択をコピーできます。
167
+ `Ctrl+C` は実行中のターミナルプロセス向けの割り込みのままです。
92
168
 
93
- 利用できるウィンドウ:
169
+ ## Knowledge、Search、Managed Skills
94
170
 
95
- - `Shell`
96
- - `Agent`
97
- - `Branches`
98
- - `File Tree`
99
- - `Settings`
100
- - `Memo`
101
- - `Profile`
102
- - `Logs`
103
- - `Issue`
104
- - `SPEC`
105
- - `Board`
106
- - `PR`
171
+ gwt は project knowledge を Agent workspace の近くに置きます。
107
172
 
108
- `Shell` `Agent` は実プロセスを持つウィンドウです。`File Tree` は実装済みの
109
- read-only ツリーです。それ以外は現時点では mock surface です。
173
+ - `gwtd issue spec <n>` GitHub Issue-backed SPEC をローカル cache から読みます。
174
+ - `gwtd issue view <n>` と `gwtd issue comments <n>` は gwt CLI surface から
175
+ cache-backed Issue access を提供します。
176
+ - `gwt-search` は共有 ChromaDB runtime を通じて SPEC、Issue、source files、
177
+ docs を検索します。index が無い場合は必要に応じて build され、desktop app は
178
+ 管理対象 Python search runtime を修復できます。
179
+ - Issue / SPEC の Knowledge Bridge window は cache-backed list/detail と、
180
+ semantic ranking、exact match priority、match percentage を組み合わせます。
110
181
 
111
- Windows Host 起動では、Launch Agent Command Prompt、Windows PowerShell、
112
- PowerShell 7 を選択できます。選択したシェルは `Shell` `Agent` の両方に適用され、
113
- Docker 起動では引き続きコンテナ内のシェルを使います。
182
+ Bundled workflow skills active worktree `.claude/skills`、
183
+ `.claude/commands`、`.codex/skills` materialize されます。公開 entrypoint
184
+ 以下です。
114
185
 
115
- ターミナルウィンドウでは、テキストをドラッグ選択してマウスボタンを離すとコピー
116
- できます。Windows / Linux では `Ctrl+Shift+C` でも現在の選択をコピーできます。
117
- `Ctrl+C` は実行中のターミナルプロセス向けの割り込みのままです。
186
+ - `gwt-discussion` — investigation-first な議論と設計明確化
187
+ - `gwt-register-issue` / `gwt-fix-issue` — Issue intake と Issue 起点の修正
188
+ - `gwt-plan-spec` — 承認済み SPEC の implementation planning
189
+ - `gwt-build-spec` — 承認済み task からの TDD-oriented implementation
190
+ - `gwt-manage-pr` — PR create/check/fix lifecycle
191
+ - `gwt-arch-review` — architecture review と改善 routing
192
+ - `gwt-search` — unified semantic search
193
+ - `gwt-agent` — running agent pane の確認と操作
118
194
 
119
- ## ワークスペース構成
195
+ Managed hooks は user hook を保持しながら、Agent state、workflow guardrails、
196
+ Board reminders、discussion/plan/build Stop checks、coordination-event summaries
197
+ を追加します。
120
198
 
121
- gwt は各プロジェクトをワークスペースディレクトリ配下の **Nested Bare + Worktree**
122
- 構成として管理します。
199
+ ## ワークスペース基盤
200
+
201
+ Agent session の隔離と再現性のため、gwt は各プロジェクトをワークスペース
202
+ ディレクトリ配下の **Nested Bare + Worktree** 構成として管理できます。
123
203
 
124
204
  ```
125
205
  <workspace>/<project>/
@@ -160,12 +240,50 @@ bare リポジトリを作り直し、各 worktree を新レイアウトに再
160
240
  - `Cmd/Ctrl+Shift+Right` と `Cmd/Ctrl+Shift+Left` でフォーカス切替
161
241
  - フォーカスされたウィンドウは中央へ寄ります
162
242
 
163
- ## Managed Hook SPEC キャッシュ
243
+ ## Operator デザイン言語 (SPEC-2356)
244
+
245
+ Operator Design System 採用後、gwt は editorial-industrial 系タイポグラフィ
246
+ (本文 `Mona Sans` / ディスプレイ `Hubot Sans Condensed` / 等幅 `JetBrains Mono`)
247
+ を中核とした単一の mission-control サーフェスとして再設計されました。
248
+ Project Bar / Sidebar Layers / Status Strip / Command Palette / Hotkey
249
+ Overlay / Drawer モーダル / フローティングウィンドウ の全クロームが
250
+ 共通トークンを参照し、 2 つの旗艦テーマで提供されます:
164
251
 
165
- - gwt `.claude/settings.local.json` を再生成し、`.codex/hooks.json` をマージします
166
- - SPEC `gwt-spec` ラベル付き GitHub Issue として管理されます
252
+ - **Dark Operator** (Mission Control / carbon + neon) — 既定、 長時間作業向け
253
+ - **Light Operator** (Drafting Table / bone + ink) — 明るい環境向け
254
+
255
+ OS の `prefers-color-scheme` に追従しつつ、 Project Bar の **Theme** トグルで
256
+ `auto → dark → light → auto` を循環できます。 選択はブラウザストレージに
257
+ 永続化され、 再起動後も維持されます。 xterm 端末パネルは overall theme に
258
+ 追従します。 `prefers-reduced-motion: reduce` を有効にすると Living Telemetry
259
+ の pulse rim・Status Strip の ticking・Mission Briefing intro が静止表現に
260
+ 縮退します。 `forced-colors: active` (Windows High Contrast / macOS Increase
261
+ Contrast) では system colors にフォールバックします。
262
+
263
+ ### ホットキー
264
+
265
+ | 組合せ | 動作 |
266
+ | --- | --- |
267
+ | `⌘K` / `⌘P` | Command Palette を開く (全サーフェス アクションの fuzzy 検索) |
268
+ | `⌘B` | Board サーフェスを focus |
269
+ | `⌘G` | Git (Branches) サーフェスを focus |
270
+ | `⌘L` | Logs サーフェスを focus |
271
+ | `⌘?` | Hotkey Overlay (cheat sheet) を toggle |
272
+ | `Esc` | 開いている Palette / Overlay / Drawer を閉じる |
273
+
274
+ ## SPEC と runtime クイックリファレンス
275
+
276
+ - SPEC の正本: `gwt-spec` ラベル付き GitHub Issue
167
277
  - ローカルキャッシュ:
168
278
  `~/.gwt/cache/issues/<repo-hash>/`
279
+ - Managed agent integration files:
280
+ `.claude/settings.local.json` と `.codex/hooks.json`
281
+ - SPEC 一覧を読む:
282
+
283
+ ```bash
284
+ gwtd issue spec list
285
+ ```
286
+
169
287
  - SPEC 全体を読む:
170
288
 
171
289
  ```bash
package/README.md CHANGED
@@ -2,8 +2,35 @@
2
2
 
3
3
  [日本語](README.ja.md)
4
4
 
5
- gwt is a desktop GUI for managing Git worktrees and launching coding agents
6
- such as `Claude Code`, `Codex`, `Gemini`, and `OpenCode`.
5
+ gwt is a desktop control plane for agent-driven development. It brings coding
6
+ agents, project context, shared coordination, GitHub Issue-backed specs,
7
+ semantic search, and managed workflow automation into one native GUI and
8
+ browser-accessible workspace.
9
+
10
+ Git worktrees are the isolation substrate behind gwt. They let gwt materialize
11
+ safe per-task workspaces for agents, but the product flow starts from work,
12
+ Issues, SPECs, search, and Board context rather than from branch management.
13
+
14
+ ## Why gwt
15
+
16
+ - **Agent workspace** — launch, resume, and monitor `Claude Code`, `Codex`,
17
+ `Gemini`, `OpenCode`, `Copilot`, and custom agents from a shared canvas.
18
+ - **Shared Board** — keep user and agent communication in one repo-scoped
19
+ timeline with `status`, `claim`, `next`, `blocked`, `handoff`, `decision`,
20
+ and `question` posts.
21
+ - **Agent-to-agent coordination** — managed hooks remind agents to post
22
+ reasoning milestones and inject recent Board context so parallel agents can
23
+ see decisions, handoffs, blockers, and targeted requests.
24
+ - **Semantic Knowledge Bridge** — search Issues, SPECs, project source files,
25
+ and docs through a ChromaDB / multilingual-e5 index instead of relying only
26
+ on substring matches.
27
+ - **GitHub Issue-backed SPECs** — treat `gwt-spec` Issues as the source of
28
+ truth while reading and editing sections through the local cache-backed CLI.
29
+ - **Managed workflow skills** — use bundled `gwt-*` skills for discussion,
30
+ issue routing, planning, TDD implementation, PR work, architecture review,
31
+ project search, and agent-pane management.
32
+ - **Operator canvas** — arrange Agent, Board, Issue, SPEC, Logs, Memo, Profile,
33
+ File Tree, Branches, and PR surfaces in one mission-control style workspace.
7
34
 
8
35
  ## Install
9
36
 
@@ -78,50 +105,105 @@ gwtd issue spec 1784 --section plan
78
105
  gwtd pr current
79
106
  gwtd board show
80
107
  gwtd hook workflow-policy
108
+ gwtd daemon status # inspect the per-project runtime daemon
81
109
  ```
82
110
 
83
- Managed hooks and runtime delegation use `gwtd`. There is no separate daemon
84
- process to start by hand.
111
+ Managed hooks and runtime delegation use `gwtd`. On macOS and Linux,
112
+ running `gwtd daemon start` brings up a per-project runtime daemon
113
+ (Unix-domain socket IPC) that multi-instance event fan-out depends on
114
+ — for example, with the daemon running, Board posts you make in one
115
+ `gwt` window appear in another instance opened on the same repo
116
+ without a polling delay. The daemon keeps running in the background
117
+ until you stop it (Ctrl-C or SIGTERM). `gwtd daemon status` prints
118
+ the live endpoint for diagnostics. Without `gwtd daemon start`,
119
+ multi-instance fan-out is inactive but local file-based state and
120
+ the file watcher continue to work as before.
121
+
122
+ Windows currently has no long-running daemon: `gwtd daemon start`
123
+ exits with "not yet implemented", and managed hooks fall back to
124
+ synchronous `gwt hook ...` dispatch. Multi-instance fan-out is
125
+ therefore unavailable on Windows pending follow-up work; `gwtd
126
+ daemon status` still works there but always reports `stopped` until
127
+ the named-pipe path lands.
128
+
129
+ ## Agent Workflow
130
+
131
+ 1. Open a project directory or restore the previous project.
132
+ 2. Use `Board`, `Issue`, `SPEC`, and Knowledge search surfaces to understand
133
+ the current work, related owners, and prior decisions.
134
+ 3. Choose `Start Work` from the Project Bar or Command Palette when the task is
135
+ still work-shaped rather than branch-shaped.
136
+ 4. Launch an `Agent` from Start Work, or launch directly from an Issue/SPEC
137
+ detail when the owner is already known.
138
+ 5. Let gwt materialize the backing `work/YYYYMMDD-HHMM[-n]` branch/worktree
139
+ only when launch is confirmed.
140
+ 6. Use the shared Board for status, claims, next steps, blockers, handoffs,
141
+ and decisions while agents run.
142
+ 7. Open `Branches` only when you need Git inspection, filtering, cleanup, or
143
+ lower-level branch/worktree details.
144
+
145
+ Common windows include:
146
+
147
+ - `Agent` — live coding-agent process windows created through Start Work or
148
+ Launch Agent
149
+ - `Board` — shared user/agent timeline for reasoning and coordination
150
+ - `Issue` and `SPEC` — cache-backed Knowledge Bridge windows with semantic
151
+ search, detail panes, and Launch Agent handoff
152
+ - `Logs` — project diagnostics and live log surface
153
+ - `Memo` and `Profile` — repo-scoped notes and environment/profile management
154
+ - `File Tree` — live read-only repository tree
155
+ - `Branches` — branch inspection, filtering, cleanup, and Git details
156
+ - `Settings` — application and agent configuration
157
+ - `PR` — pull-request workflow surface; detailed list support depends on the
158
+ cache-backed PR source as it lands
159
+
160
+ `Agent` is the live process window for coding-agent sessions. `Board` is the
161
+ coordination surface agents use to expose status, decisions, handoffs, and
162
+ requests. `Issue` and `SPEC` use the local cache and semantic index rather than
163
+ rendering direct GitHub API responses in the frontend.
85
164
 
86
- ## Main Workflow
165
+ On Windows Host launches, Launch Agent lets you choose Command Prompt, Windows
166
+ PowerShell, or PowerShell 7. Docker launches continue to use the container
167
+ shell.
87
168
 
88
- 1. Open a repository directory or restore the previous project.
89
- 2. Use the canvas to arrange floating windows.
90
- 3. Open `Branches`, select a branch, and double-click to open Launch Agent.
91
- 4. Start `Shell` or `Agent` windows on the selected branch/worktree.
92
- 5. Inspect the repository with the read-only `File Tree` window.
169
+ In terminal windows, drag to select text and release the mouse button to copy.
170
+ On Windows and Linux, `Ctrl+Shift+C` also copies the current terminal
171
+ selection. `Ctrl+C` stays mapped to the running terminal process.
93
172
 
94
- Available windows include:
173
+ ## Knowledge, Search, and Managed Skills
95
174
 
96
- - `Shell`
97
- - `Agent`
98
- - `Branches`
99
- - `File Tree`
100
- - `Settings`
101
- - `Memo`
102
- - `Profile`
103
- - `Logs`
104
- - `Issue`
105
- - `SPEC`
106
- - `Board`
107
- - `PR`
175
+ gwt keeps project knowledge close to the agent workspace:
108
176
 
109
- `Shell` and `Agent` are live process windows. `File Tree` is a live read-only
110
- tree view. The remaining windows are currently mock surfaces where production
111
- behavior has not been wired yet.
177
+ - `gwtd issue spec <n>` reads GitHub Issue-backed SPECs from the local cache.
178
+ - `gwtd issue view <n>` and `gwtd issue comments <n>` provide cache-backed Issue
179
+ access through the gwt CLI surface.
180
+ - `gwt-search` searches SPECs, Issues, source files, and docs through the shared
181
+ ChromaDB runtime. Missing indexes are built on demand, and the desktop app can
182
+ repair the managed Python search runtime when needed.
183
+ - The Issue/SPEC Knowledge Bridge windows combine cache-backed list/detail views
184
+ with semantic ranking, exact-match priority, and match percentages.
112
185
 
113
- On Windows Host launches, Launch Agent lets you choose Command Prompt, Windows
114
- PowerShell, or PowerShell 7. The selected shell applies to both `Shell` and
115
- `Agent` windows; Docker launches continue to use the container shell.
186
+ Bundled workflow skills are materialized into `.claude/skills`,
187
+ `.claude/commands`, and `.codex/skills` for the active worktree. The public
188
+ entrypoints are:
116
189
 
117
- In terminal windows, drag to select text and release the mouse button to copy.
118
- On Windows and Linux, `Ctrl+Shift+C` also copies the current terminal
119
- selection. `Ctrl+C` stays mapped to the running terminal process.
190
+ - `gwt-discussion` investigation-first discussion and design clarification
191
+ - `gwt-register-issue` / `gwt-fix-issue` issue intake and issue-driven fixes
192
+ - `gwt-plan-spec` implementation planning for an approved SPEC
193
+ - `gwt-build-spec` — TDD-oriented implementation from an approved task
194
+ - `gwt-manage-pr` — PR create/check/fix lifecycle
195
+ - `gwt-arch-review` — architecture review and improvement routing
196
+ - `gwt-search` — unified semantic search
197
+ - `gwt-agent` — running agent-pane inspection and control
198
+
199
+ Managed hooks preserve user hooks while adding gwt runtime behavior for agent
200
+ state, workflow guardrails, Board reminders, discussion/plan/build Stop checks,
201
+ and coordination-event summaries.
120
202
 
121
- ## Workspace Layout
203
+ ## Workspace Foundation
122
204
 
123
- gwt manages each project as a **Nested Bare + Worktree** layout under your
124
- workspace directory:
205
+ For isolation and repeatable agent sessions, gwt can manage each project as a
206
+ **Nested Bare + Worktree** layout under your workspace directory:
125
207
 
126
208
  ```
127
209
  <workspace>/<project>/
@@ -160,13 +242,52 @@ confirmation modal with three actions:
160
242
  - Use `Cmd/Ctrl+Shift+Right` and `Cmd/Ctrl+Shift+Left` to cycle focus; the
161
243
  focused window is recentered
162
244
 
163
- ## Managed Hooks and SPEC Cache
164
-
165
- - gwt regenerates `.claude/settings.local.json` and merges `.codex/hooks.json`
166
- for managed hooks
167
- - SPECs are stored as GitHub Issues labeled `gwt-spec`
245
+ ## Operator Design Language (SPEC-2356)
246
+
247
+ Starting with the Operator Design System update, gwt is themed as a single
248
+ mission-control surface with editorial-industrial typography (`Mona Sans` for
249
+ body, `Hubot Sans` condensed for display, `JetBrains Mono` for terminal /
250
+ counters). Every chrome surface — Project Bar, Sidebar Layers, Status Strip,
251
+ Command Palette, Hotkey Overlay, Drawer modals, floating windows — shares a
252
+ single token system that ships in two flagship themes:
253
+
254
+ - **Dark Operator** (Mission Control / carbon + neon) — the default, optimized
255
+ for long sessions
256
+ - **Light Operator** (Drafting Table / bone + ink) — for bright environments
257
+
258
+ The active theme follows your OS `prefers-color-scheme`, but the **Theme**
259
+ toggle in the Project Bar lets you cycle `auto → dark → light → auto`. The
260
+ choice is persisted in browser storage and survives restarts. xterm terminal
261
+ panes follow the overall theme automatically. `prefers-reduced-motion: reduce`
262
+ disables the Living Telemetry pulse rim, status strip ticking, and Mission
263
+ Briefing intro reveal so the UI stays usable in motion-sensitive environments.
264
+ `forced-colors: active` (Windows High Contrast / macOS Increase Contrast)
265
+ falls back to system colors so accessibility is preserved.
266
+
267
+ ### Hotkeys
268
+
269
+ | Combo | Action |
270
+ | --- | --- |
271
+ | `⌘K` / `⌘P` | Open the Command Palette (fuzzy search over all surface actions) |
272
+ | `⌘B` | Focus the Board surface |
273
+ | `⌘G` | Focus the Git (Branches) surface |
274
+ | `⌘L` | Focus the Logs surface |
275
+ | `⌘?` | Toggle the Hotkey Overlay (cheat sheet) |
276
+ | `Esc` | Close any open palette / overlay / drawer |
277
+
278
+ ## SPEC and Runtime Quick Reference
279
+
280
+ - SPEC source of truth: GitHub Issues labeled `gwt-spec`
168
281
  - Local cache path:
169
282
  `~/.gwt/cache/issues/<repo-hash>/`
283
+ - Managed agent integration files:
284
+ `.claude/settings.local.json` and `.codex/hooks.json`
285
+ - List available SPECs:
286
+
287
+ ```bash
288
+ gwtd issue spec list
289
+ ```
290
+
170
291
  - Read a SPEC:
171
292
 
172
293
  ```bash
package/codecov.yml CHANGED
@@ -12,5 +12,8 @@ coverage:
12
12
  paths: [crates/]
13
13
  carryforward: true
14
14
  frontend:
15
- paths: [gwt-gui/src/]
15
+ # The Svelte frontend (gwt-gui/) was retired during the wry+tao+axum
16
+ # architecture migration. The current frontend is plain HTML/JS at
17
+ # crates/gwt/web/, which has no separate coverage target today.
18
+ paths: [crates/gwt/web/]
16
19
  carryforward: true
package/deny.toml CHANGED
@@ -1,33 +1,54 @@
1
1
  # cargo-deny configuration
2
2
  # https://embarkstudios.github.io/cargo-deny/
3
+ #
4
+ # Schema is for cargo-deny 0.18+. Older `vulnerability = "deny"` /
5
+ # `unmaintained = "warn"` style is no longer accepted by the
6
+ # parser — vulnerability is implicit deny, and the lint level for
7
+ # unmaintained crates is now controlled by the top-level `[advisories]`
8
+ # ignore list instead.
9
+ #
10
+ # Scope: this config currently only covers the advisories check
11
+ # (`cargo deny check advisories`). License/ban policy is intentionally
12
+ # left unconfigured pending owner review — the historical license
13
+ # allowlist did not enumerate every license actually present in the
14
+ # transitive graph (e.g. `bzip2-1.0.6`, `CDLA-Permissive-2.0`,
15
+ # `Unicode-3.0`, `MPL-2.0`), and the bans table flagged every
16
+ # `dep.workspace = true` reference as a "wildcard" due to a known
17
+ # cargo-deny resolution issue with workspace deps.
3
18
 
4
19
  [advisories]
5
20
  db-path = "~/.cargo/advisory-db"
6
21
  db-urls = ["https://github.com/rustsec/advisory-db"]
7
- vulnerability = "deny"
8
- unmaintained = "warn"
9
22
  yanked = "warn"
10
- notice = "warn"
11
-
12
- [licenses]
13
- unlicensed = "deny"
14
- allow = [
15
- "MIT",
16
- "Apache-2.0",
17
- "Apache-2.0 WITH LLVM-exception",
18
- "BSD-2-Clause",
19
- "BSD-3-Clause",
20
- "ISC",
21
- "Zlib",
22
- "CC0-1.0",
23
- "Unicode-DFS-2016",
23
+ # Allowlisted advisories. Each entry MUST cite the advisory ID and
24
+ # carry a `reason` explaining why the issue is not exploitable in
25
+ # our use, plus the planned exit path. Re-evaluate every time wry /
26
+ # tao / gtk-rs ecosystem ships a new release.
27
+ ignore = [
28
+ # All gtk-rs GTK3 bindings are unmaintained — their fix is the
29
+ # gtk-rs 0.20+ migration, which our wry 0.55 / tao 0.35 (latest
30
+ # tags) do not yet adopt. We pull these transitively only for
31
+ # Linux GUI rendering and never call the unsound paths directly.
32
+ { id = "RUSTSEC-2024-0411", reason = "gdkwayland-sys (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
33
+ { id = "RUSTSEC-2024-0412", reason = "gdk (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
34
+ { id = "RUSTSEC-2024-0413", reason = "atk (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
35
+ { id = "RUSTSEC-2024-0414", reason = "gdk-sys (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
36
+ { id = "RUSTSEC-2024-0415", reason = "gtk (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
37
+ { id = "RUSTSEC-2024-0416", reason = "atk-sys (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
38
+ { id = "RUSTSEC-2024-0417", reason = "gdkx11 (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
39
+ { id = "RUSTSEC-2024-0418", reason = "gdkx11-sys (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
40
+ { id = "RUSTSEC-2024-0419", reason = "gtk3-macros (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
41
+ { id = "RUSTSEC-2024-0420", reason = "gtk-sys (gtk3-rs unmaintained); blocked on wry/tao bumping to gtk-rs 0.20+" },
42
+ # proc-macro-error is unmaintained and reaches us only through
43
+ # gtk3-macros. Same upstream-migration exit path as the gtk3-rs
44
+ # crates above.
45
+ { id = "RUSTSEC-2024-0370", reason = "proc-macro-error unmaintained via gtk3-macros; same exit path as gtk3-rs crates" },
46
+ # glib::VariantStrIter unsoundness. We don't construct or iterate
47
+ # GVariant string iters directly — glib reaches us only through
48
+ # the gtk3-rs / wry stack on Linux. Same exit path. Also tracked
49
+ # as Dependabot alert #29.
50
+ { id = "RUSTSEC-2024-0429", reason = "glib::VariantStrIter unsoundness; not reachable from our code, blocked on gtk-rs 0.20+ (also tracked as Dependabot #29)" },
24
51
  ]
25
- copyleft = "deny"
26
-
27
- [bans]
28
- multiple-versions = "warn"
29
- wildcards = "deny"
30
- highlight = "all"
31
52
 
32
53
  [sources]
33
54
  unknown-registry = "deny"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akiojin/gwt",
3
- "version": "9.14.0",
3
+ "version": "9.16.0",
4
4
  "description": "Desktop GUI for Git worktree management and coding agent launch",
5
5
  "type": "module",
6
6
  "bin": {
@@ -12,8 +12,10 @@
12
12
  "dev": "cargo run -p gwt --bin gwt",
13
13
  "build": "cargo build --release -p gwt --bin gwt --bin gwtd",
14
14
  "test": "cargo test -p gwt-core -p gwt --all-features",
15
- "test:frontend-bundle": "node --check crates/gwt/web/app.js && node --check crates/gwt/web/branch-cleanup-modal.js && node --check crates/gwt/web/migration-modal.js",
15
+ "test:frontend-bundle": "node --check crates/gwt/web/app.js && node --check crates/gwt/web/branch-cleanup-modal.js && node --check crates/gwt/web/migration-modal.js && node --check crates/gwt/web/theme-manager.js && node --check crates/gwt/web/hotkey.js && node --check crates/gwt/web/operator-shell.js",
16
16
  "test:frontend-smoke": "node --test crates/gwt/web/__tests__/branch-cleanup.smoke.test.mjs crates/gwt/web/__tests__/migration-modal.smoke.test.mjs",
17
+ "test:frontend-unit": "node --test crates/gwt/web/__tests__/contrast.test.mjs crates/gwt/web/__tests__/theme-manager.test.mjs crates/gwt/web/__tests__/hotkey.test.mjs crates/gwt/web/__tests__/operator-chrome-structure.test.mjs crates/gwt/web/__tests__/board-surface.test.mjs",
18
+ "test:visual": "playwright test --config crates/gwt/playwright/playwright.config.ts",
17
19
  "test:release-assets": "node scripts/test_release_assets.cjs",
18
20
  "test:release-flow": "bash scripts/check-release-flow.sh",
19
21
  "test:all": "bash scripts/test-all.sh",
@@ -47,6 +49,7 @@
47
49
  "devDependencies": {
48
50
  "@commitlint/cli": "^20.5.0",
49
51
  "@commitlint/config-conventional": "^20.5.0",
52
+ "@playwright/test": "^1.49.1",
50
53
  "linkedom": "^0.18.12"
51
54
  }
52
55
  }
@@ -21,18 +21,22 @@ if (!Number.isFinite(threshold)) {
21
21
  const report = JSON.parse(fs.readFileSync(summaryPath, "utf8"));
22
22
  const files = report.data?.flatMap((entry) => entry.files ?? []) ?? [];
23
23
  const ignoredFilePatterns = [
24
- // Runtime entrypoints and OS/process orchestration are covered by focused
25
- // contract tests, but line coverage is not a useful release gate for them.
24
+ // Runtime entrypoints, process orchestration, and split CLI integration
25
+ // adapters are covered by focused contract tests; line coverage is not a
26
+ // useful release gate for these outer shells.
26
27
  /(^|[\\/])gwt[\\/]src[\\/]main\.rs$/i,
27
28
  /(^|[\\/])gwt[\\/]src[\\/]bin[\\/]gwtd\.rs$/i,
28
29
  /(^|[\\/])gwt[\\/]src[\\/]app_runtime\.rs$/i,
30
+ /(^|[\\/])gwt[\\/]src[\\/]app_runtime[\\/].+\.rs$/i,
29
31
  /(^|[\\/])gwt[\\/]src[\\/]docker_launch\.rs$/i,
30
32
  /(^|[\\/])gwt[\\/]src[\\/]index_worker\.rs$/i,
31
33
  /(^|[\\/])gwt[\\/]src[\\/]issue_cache\.rs$/i,
32
34
  /(^|[\\/])gwt[\\/]src[\\/]launch_runtime\.rs$/i,
33
35
  /(^|[\\/])gwt[\\/]src[\\/]native_app\.rs$/i,
34
36
  /(^|[\\/])gwt[\\/]src[\\/]update_front_door\.rs$/i,
37
+ /(^|[\\/])gwt[\\/]src[\\/]cli[\\/]daemon[\\/]mod\.rs$/i,
35
38
  /(^|[\\/])gwt[\\/]src[\\/]cli[\\/]index\.rs$/i,
39
+ /(^|[\\/])gwt[\\/]src[\\/]cli[\\/]index[\\/].+\.rs$/i,
36
40
  ];
37
41
 
38
42
  let coveredLines = 0;
@@ -89,10 +89,24 @@ run("package scripts keep the GUI front door and release contract explicit", ()
89
89
  assert.equal(pkg.bin.gwt, "bin/gwt.cjs");
90
90
  assert.equal(pkg.bin.gwtd, "bin/gwtd.cjs");
91
91
  assert.equal(pkg.scripts["test:release-assets"], "node scripts/test_release_assets.cjs");
92
- assert.equal(
93
- pkg.scripts["test:frontend-bundle"],
94
- "node --check crates/gwt/web/app.js && node --check crates/gwt/web/branch-cleanup-modal.js && node --check crates/gwt/web/migration-modal.js"
95
- );
92
+ // SPEC-2356 — the frontend bundle now also covers Operator Design System
93
+ // ESM modules (theme-manager / hotkey / operator-shell). The contract is
94
+ // expressed as required substrings so future modules can extend the chain
95
+ // without rewriting the test, while still keeping the legacy SPEC-2008
96
+ // surfaces (app, branch-cleanup-modal, migration-modal) wired up.
97
+ for (const required of [
98
+ "node --check crates/gwt/web/app.js",
99
+ "node --check crates/gwt/web/branch-cleanup-modal.js",
100
+ "node --check crates/gwt/web/migration-modal.js",
101
+ "node --check crates/gwt/web/theme-manager.js",
102
+ "node --check crates/gwt/web/hotkey.js",
103
+ "node --check crates/gwt/web/operator-shell.js",
104
+ ]) {
105
+ assert.ok(
106
+ pkg.scripts["test:frontend-bundle"].includes(required),
107
+ `test:frontend-bundle must include "${required}", got: ${pkg.scripts["test:frontend-bundle"]}`
108
+ );
109
+ }
96
110
  assert.equal(pkg.scripts["test:release-flow"], "bash scripts/check-release-flow.sh");
97
111
  assert.equal(pkg.scripts.dev, "cargo run -p gwt --bin gwt");
98
112
  assert.equal(pkg.scripts.build, "cargo build --release -p gwt --bin gwt --bin gwtd");
@@ -35,6 +35,19 @@ require_not_contains() {
35
35
  fi
36
36
  }
37
37
 
38
+ require_order() {
39
+ local file="$1"
40
+ local first="$2"
41
+ local second="$3"
42
+ local first_line
43
+ local second_line
44
+ first_line=$(grep -Fn "$first" "$file" | head -n 1 | cut -d: -f1 || true)
45
+ second_line=$(grep -Fn "$second" "$file" | head -n 1 | cut -d: -f1 || true)
46
+ if [ -z "$first_line" ] || [ -z "$second_line" ] || [ "$first_line" -ge "$second_line" ]; then
47
+ fail "Expected '$first' to appear before '$second' in $file"
48
+ fi
49
+ }
50
+
38
51
  require_file "$PACKAGE_JSON"
39
52
  require_contains "$PACKAGE_JSON" '"prepare": "test -n \"$CI\" || bunx husky install"'
40
53
  require_contains "$PACKAGE_JSON" "\"lint:skills\": \"bash scripts/validate-skill-frontmatter.sh\""
@@ -43,6 +56,11 @@ require_contains "$PACKAGE_JSON" "\"lint:husky\": \"bash scripts/verify-husky-ho
43
56
  require_file "$PRE_PUSH"
44
57
  require_contains "$PRE_PUSH" "cargo clippy --all-targets --all-features -- -D warnings"
45
58
  require_contains "$PRE_PUSH" "cargo fmt --all -- --check"
59
+ require_contains "$PRE_PUSH" "ensure_coverage_tooling"
60
+ require_contains "$PRE_PUSH" "rustup component add llvm-tools-preview"
61
+ require_contains "$PRE_PUSH" "cargo install cargo-llvm-cov --locked"
62
+ require_contains "$PRE_PUSH" "cargo llvm-cov --version"
63
+ require_order "$PRE_PUSH" "if cargo llvm-cov --version >/dev/null 2>&1; then" "if command -v rustup >/dev/null 2>&1; then"
46
64
  require_contains "$PRE_PUSH" "cargo llvm-cov -p gwt-core -p gwt --all-features --json --summary-only --output-path target/coverage-summary.json"
47
65
  require_contains "$PRE_PUSH" "node scripts/check-coverage-threshold.mjs target/coverage-summary.json 90"
48
66
  require_contains "$PRE_PUSH" "bunx --bun markdownlint-cli . --config .markdownlint.json --ignore target --ignore CHANGELOG.md --ignore tasks/todo.md"