@akiojin/gwt 9.15.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
 
@@ -99,44 +125,81 @@ hook は同期的な `gwt hook ...` dispatch にフォールバックし、複
99
125
  が完了するまで利用できません。`gwtd daemon status` 自体は Windows
100
126
  でも実行可能ですが、daemon が動かないため常に `stopped` を表示します。
101
127
 
102
- ## 基本フロー
103
-
104
- 1. リポジトリを開く、または前回のプロジェクトを復元する
105
- 2. キャンバス上に必要なウィンドウを並べる
106
- 3. `Branches` でブランチを選択し、ダブルクリックで Launch Agent を開く
107
- 4. `Shell` または `Agent` ウィンドウを起動する
108
- 5. `File Tree` でリポジトリを閲覧する
109
-
110
- 利用できるウィンドウ:
111
-
112
- - `Shell`
113
- - `Agent`
114
- - `Branches`
115
- - `File Tree`
116
- - `Settings`
117
- - `Memo`
118
- - `Profile`
119
- - `Logs`
120
- - `Issue`
121
- - `SPEC`
122
- - `Board`
123
- - `PR`
124
-
125
- `Shell` `Agent` は実プロセスを持つウィンドウです。`File Tree` は実装済みの
126
- read-only ツリーです。それ以外は現時点では mock surface です。
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 を使います。
127
161
 
128
162
  Windows の Host 起動では、Launch Agent で Command Prompt、Windows PowerShell、
129
- PowerShell 7 を選択できます。選択したシェルは `Shell` と `Agent` の両方に適用され、
130
- Docker 起動では引き続きコンテナ内のシェルを使います。
163
+ PowerShell 7 を選択できます。Docker 起動では引き続きコンテナ内のシェルを使います。
131
164
 
132
165
  ターミナルウィンドウでは、テキストをドラッグ選択してマウスボタンを離すとコピー
133
166
  できます。Windows / Linux では `Ctrl+Shift+C` でも現在の選択をコピーできます。
134
167
  `Ctrl+C` は実行中のターミナルプロセス向けの割り込みのままです。
135
168
 
136
- ## ワークスペース構成
169
+ ## Knowledge、Search、Managed Skills
170
+
171
+ gwt は project knowledge を Agent workspace の近くに置きます。
172
+
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 を組み合わせます。
181
+
182
+ Bundled workflow skills は active worktree の `.claude/skills`、
183
+ `.claude/commands`、`.codex/skills` に materialize されます。公開 entrypoint は
184
+ 以下です。
185
+
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 の確認と操作
194
+
195
+ Managed hooks は user hook を保持しながら、Agent state、workflow guardrails、
196
+ Board reminders、discussion/plan/build Stop checks、coordination-event summaries
197
+ を追加します。
198
+
199
+ ## ワークスペース基盤
137
200
 
138
- gwt は各プロジェクトをワークスペースディレクトリ配下の **Nested Bare + Worktree**
139
- 構成として管理します。
201
+ Agent session の隔離と再現性のため、gwt は各プロジェクトをワークスペース
202
+ ディレクトリ配下の **Nested Bare + Worktree** 構成として管理できます。
140
203
 
141
204
  ```
142
205
  <workspace>/<project>/
@@ -177,12 +240,50 @@ bare リポジトリを作り直し、各 worktree を新レイアウトに再
177
240
  - `Cmd/Ctrl+Shift+Right` と `Cmd/Ctrl+Shift+Left` でフォーカス切替
178
241
  - フォーカスされたウィンドウは中央へ寄ります
179
242
 
180
- ## Managed Hook SPEC キャッシュ
243
+ ## Operator デザイン言語 (SPEC-2356)
181
244
 
182
- - gwt は `.claude/settings.local.json` を再生成し、`.codex/hooks.json` をマージします
183
- - SPEC `gwt-spec` ラベル付き GitHub Issue として管理されます
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 つの旗艦テーマで提供されます:
251
+
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
184
277
  - ローカルキャッシュ:
185
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
+
186
287
  - SPEC 全体を読む:
187
288
 
188
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
 
@@ -99,45 +126,84 @@ therefore unavailable on Windows pending follow-up work; `gwtd
99
126
  daemon status` still works there but always reports `stopped` until
100
127
  the named-pipe path lands.
101
128
 
102
- ## Main Workflow
103
-
104
- 1. Open a repository directory or restore the previous project.
105
- 2. Use the canvas to arrange floating windows.
106
- 3. Open `Branches`, select a branch, and double-click to open Launch Agent.
107
- 4. Start `Shell` or `Agent` windows on the selected branch/worktree.
108
- 5. Inspect the repository with the read-only `File Tree` window.
109
-
110
- Available windows include:
111
-
112
- - `Shell`
113
- - `Agent`
114
- - `Branches`
115
- - `File Tree`
116
- - `Settings`
117
- - `Memo`
118
- - `Profile`
119
- - `Logs`
120
- - `Issue`
121
- - `SPEC`
122
- - `Board`
123
- - `PR`
124
-
125
- `Shell` and `Agent` are live process windows. `File Tree` is a live read-only
126
- tree view. The remaining windows are currently mock surfaces where production
127
- behavior has not been wired yet.
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.
128
164
 
129
165
  On Windows Host launches, Launch Agent lets you choose Command Prompt, Windows
130
- PowerShell, or PowerShell 7. The selected shell applies to both `Shell` and
131
- `Agent` windows; Docker launches continue to use the container shell.
166
+ PowerShell, or PowerShell 7. Docker launches continue to use the container
167
+ shell.
132
168
 
133
169
  In terminal windows, drag to select text and release the mouse button to copy.
134
170
  On Windows and Linux, `Ctrl+Shift+C` also copies the current terminal
135
171
  selection. `Ctrl+C` stays mapped to the running terminal process.
136
172
 
137
- ## Workspace Layout
173
+ ## Knowledge, Search, and Managed Skills
138
174
 
139
- gwt manages each project as a **Nested Bare + Worktree** layout under your
140
- workspace directory:
175
+ gwt keeps project knowledge close to the agent workspace:
176
+
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.
185
+
186
+ Bundled workflow skills are materialized into `.claude/skills`,
187
+ `.claude/commands`, and `.codex/skills` for the active worktree. The public
188
+ entrypoints are:
189
+
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.
202
+
203
+ ## Workspace Foundation
204
+
205
+ For isolation and repeatable agent sessions, gwt can manage each project as a
206
+ **Nested Bare + Worktree** layout under your workspace directory:
141
207
 
142
208
  ```
143
209
  <workspace>/<project>/
@@ -176,13 +242,52 @@ confirmation modal with three actions:
176
242
  - Use `Cmd/Ctrl+Shift+Right` and `Cmd/Ctrl+Shift+Left` to cycle focus; the
177
243
  focused window is recentered
178
244
 
179
- ## Managed Hooks and SPEC Cache
180
-
181
- - gwt regenerates `.claude/settings.local.json` and merges `.codex/hooks.json`
182
- for managed hooks
183
- - 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`
184
281
  - Local cache path:
185
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
+
186
291
  - Read a SPEC:
187
292
 
188
293
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akiojin/gwt",
3
- "version": "9.15.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
  }
@@ -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"