Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
180 commits
Select commit Hold shift + click to select a range
00479d8
chore: merge release v0.8.1 to develop
Kewton Jul 5, 2026
0465fd7
feat(files): スマホ版でファイルをダウンロード可能に(attachment配信+FileViewer DL導線)(#1024)…
Kewton Jul 5, 2026
47d6d2a
chore: merge release v0.8.2 to develop
Kewton Jul 6, 2026
8d50d15
fix(session): Timer 発火の送信を History に記録(send ロジックを共有サービス化)(#1028) (#1029)
Kewton Jul 7, 2026
8c854f6
chore: merge release v0.8.3 to develop
Kewton Jul 8, 2026
5738685
feat(todo): ブランチ単位ToDoを3状態化(未着手/仕掛/完了)(#1032) (#1033)
Kewton Jul 10, 2026
75ae9cc
feat(todo): ブランチ単位ToDoに詳細フィールド追加+クリックで件名/詳細を編集 (#1034) (#1035)
Kewton Jul 10, 2026
bc3296a
feat(todo): ブランチ単位ToDoの詳細にコピーボタンを追加 (#1036) (#1037)
Kewton Jul 10, 2026
c9b3f8d
chore: merge release v0.8.4 to develop
Kewton Jul 10, 2026
e904f36
feat(ui): セマンティックデザイントークン基盤を導入 (#1041) (#1054)
Kewton Jul 12, 2026
57a8663
feat(ui): cn()/cva によるバリアント管理基盤とプリミティブ改修 (#1042) (#1055)
Kewton Jul 12, 2026
4d0104d
feat(ui): アイコンを lucide-react に統一 (#1044) (#1056)
Kewton Jul 12, 2026
3ec1743
feat(ui): next/font で Geist Sans/Mono を導入 (#1043) (#1057)
Kewton Jul 12, 2026
e5267d3
feat(ui): RadixベースUIプリミティブを拡充 (#1046) (#1058)
Kewton Jul 12, 2026
e5204ae
feat(ui): アクセント色を統一しセマンティックトークンへ置換 (#1045) (#1059)
Kewton Jul 12, 2026
e1bad72
feat(ui): 主要ページを共通UIプリミティブへ移行 (#1047) (#1060)
Kewton Jul 12, 2026
5a14444
feat(ui): globals.css の @apply クラスを廃止し cva プリミティブを自己完結化 (#1048) (#1062)
Kewton Jul 12, 2026
cee7db5
feat(ui): サーフェス・奥行きを再設計しモダンダークテーマへ刷新 (#1049) (#1063)
Kewton Jul 12, 2026
d447ad9
feat(ui): モーション基盤とマイクロインタラクションを追加 (#1050) (#1064)
Kewton Jul 12, 2026
32049fb
feat(ui): Home をダッシュボード(bento グリッド)化 (#1052) (#1065)
Kewton Jul 12, 2026
54e38a4
feat(ui): コマンドパレット(⌘K)を追加 (#1053) (#1066)
Kewton Jul 12, 2026
722ee7e
feat(ui): エージェント/セッションステータスの視覚を強化 (#1051) (#1067)
Kewton Jul 12, 2026
9eda5d9
fix(ui): サイドバーがヘッダーに遮蔽される左上レイアウト破綻を修正 (#1070) (#1083)
Kewton Jul 12, 2026
19c2230
feat(ui): テーマ既定を system 化しヘッダーにトグルを追加 (#1071) (#1084)
Kewton Jul 12, 2026
9a7fe0e
fix(hooks): useIsMobile を matchMedia ベースにし混成レイアウトバグを解消 (#1069) (#1085)
Kewton Jul 12, 2026
120f535
feat(ui): Home 第一フォールドを回収(バナー削除・見出し降格・tabular-nums) (#1072) (#1086)
Kewton Jul 12, 2026
e0b51e5
feat(ui): ライトモードのエレベーション階梯を反転(グレー地+白カード+2層影) (#1074) (#1087)
Kewton Jul 12, 2026
dbd44ad
feat(ui): サイドバーを --sidebar-* トークン化しテーマ追従に (#1073) (#1088)
Kewton Jul 12, 2026
f709889
feat(ui): ⌘K パレットを Raycast 級に強化(アイコン/StatusDot/kbd/Recents/ヘッダー導線)(#1…
Kewton Jul 13, 2026
29db345
feat(ui): ターミナルクロームを刷新(全周枠廃止・カード化・CLIセレクタDropdownMenu化)(#1079) (#1090)
Kewton Jul 13, 2026
709f759
feat(ui): worktree詳細/Chat のダーク直書き島を surface トークン化しテーマ追従に (#1075) (#1091)
Kewton Jul 13, 2026
0a30bf0
feat(ui): データ画面コントロールの意味論を整理(Review/Repositories/More)(#1081) (#1092)
Kewton Jul 13, 2026
6630174
feat(ui): コンポーザーをカード化しモバイルworktreeコントロールを整理 (#1080) (#1093)
Kewton Jul 13, 2026
369dcd5
feat(ui): 稼働ステータスを StatusDot 一本化し idle ノイズを縮退 (#1078) (#1094)
Kewton Jul 13, 2026
f661b51
feat(ui): ネイティブ checkbox/radio を Radix プリミティブに統一 (#1076) (#1095)
Kewton Jul 13, 2026
d9c45bf
feat(ui): トークン規律の確立(生gray/slate置換・focus-visible統一・CIガード)(#1082) (#1096)
Kewton Jul 13, 2026
f9d307f
refactor(ui): worktree/共通の生gray/buttonをトークン・プリミティブへ (#1061 群A 1/4) (#…
Kewton Jul 13, 2026
4b16798
refactor(ui): worktree詳細/markdown/fileの生gray/buttonをトークンへ (#1061 群B 2…
Kewton Jul 13, 2026
dd3348d
refactor(ui): worktree/mobile/gitの生gray/buttonをトークンへ (#1061 群C 3/4) (…
Kewton Jul 13, 2026
e6b677e
refactor(ui): worktree/git/todoの生gray/buttonをトークンへ (#1061 群D 4/4) (#1…
Kewton Jul 13, 2026
b507e3d
ci(guard): token-discipline ガードを worktree/mobile/external-apps へ拡大 (#…
Kewton Jul 13, 2026
b17c7ef
test: integration スイートの drift を解消(モック/期待値追随・CI追加)(#1102) (#1103)
Kewton Jul 13, 2026
84dafcb
fix(external-apps): 重複nameで500ではなく409を返す (#1104) (#1105)
Kewton Jul 13, 2026
8b46d59
feat(timer): Timer履歴の詳細モーダル表示と失敗理由の記録 (#1107) (#1109)
Kewton Jul 13, 2026
f8d67c5
feat(files): Filesツリー展開状態のworktree単位永続化と表示リセット (#1108) (#1111)
Kewton Jul 13, 2026
1832522
fix(mobile): viewportFit:'cover' を追加しiOS safe-area対応を有効化 (#1132)
Kewton Jul 13, 2026
1162672
feat(ui): ステータスカラーtintトークン導入とダーク非対応フィードバックUIの移行 (#1133)
Kewton Jul 13, 2026
8994290
refactor(ui): window.confirmを共通ConfirmDialogへ全面置換 (#1134)
Kewton Jul 13, 2026
c3cc903
chore(ui): UI死コード削除(WorktreeList・放棄infinite-scroll hooks・hasNewOutput…
Kewton Jul 13, 2026
f97e515
fix(ui): 未定義animate-fade-*の定義とModal/Toast/ContextMenuのexitアニメーション実装 (…
Kewton Jul 13, 2026
cc71c1c
feat(ui): ヘッダーナビのアクティブインジケータ実装と角丸スケール規約の導入 (#1137)
Kewton Jul 13, 2026
322d5f3
refactor(ui): チャット履歴UIをConversationPairCard系デザインへ統一 (#1138)
Kewton Jul 13, 2026
b3776dc
feat(ui): スケルトンローディング展開とSpinner統一・loading.tsx整備 (#1139)
Kewton Jul 13, 2026
b3df3e9
refactor(ui): 生chromatic色をtintトークンへ全面移行しCIガードを拡大 (#1140)
Kewton Jul 14, 2026
80a3f96
feat(ui): View Transitions APIによるページ遷移クロスフェードを導入 (#1141)
Kewton Jul 14, 2026
3d16e6a
perf(ui): HistoryPaneを@tanstack/react-virtualで仮想化し250件上限を撤廃 (#1123) (…
Kewton Jul 14, 2026
82506fe
feat(realtime): ターミナル出力・セッションステータスをWebSocketストリーミング化 (#1120) (#1143)
Kewton Jul 14, 2026
18a2c76
feat(chat): メッセージ送信のOptimistic UIを実装 (#1144)
Kewton Jul 14, 2026
f50d3e1
fix(mobile): useIsMobileを描画前レイアウトエフェクトで解決し初回デスクトップ描画フリップを解消 (#1145)
Kewton Jul 14, 2026
bec0640
feat(pwa): PWA対応(manifest+Service Worker+インストール可能化) (#1146)
Kewton Jul 14, 2026
ac08851
fix(mobile): モバイルA11y改善(focus trap・44pxタップターゲット・tablistキーボード) (#1147)
Kewton Jul 14, 2026
8a139b4
feat(mobile): ジェスチャー強化(スワイプタブ切替・pull-to-refresh・キーボード追従) (#1148)
Kewton Jul 14, 2026
5d5d172
feat(pwa): エージェント状態のWeb Push通知(プロンプト待ち/完了) (#1149)
Kewton Jul 14, 2026
65b4659
fix(worktree): 同一ディレクトリのブランチ切替で履歴がCASCADE削除される問題を修正 (#1153)
Kewton Jul 14, 2026
2eff262
fix(detection): Codex v0.141ステータスバー陳腐化で処理中がready誤判定される問題を修正 (#1154)
Kewton Jul 14, 2026
1ee7ec5
fix(worktree): ヘッダーのインスタンス切替をターミナルsplitに配線(PC) (#1155)
Kewton Jul 14, 2026
d3d10d9
fix(tmux): セッションターゲットを=厳密一致にしプレフィックス衝突インスタンスへの漏洩を防止 (#1157)
Kewton Jul 14, 2026
310a054
fix(tmux): exactTargetを=name:にしpaneターゲット(capture-pane/send-keys)の解決失敗…
Kewton Jul 14, 2026
9213d82
fix(detection): codexの回答済み承認プロンプト陳腐化でwaiting固着する問題を修正 (#1161)
Kewton Jul 14, 2026
0f7ba8e
feat(ui): コックピット画面ポリッシュ(Agent Instances表示改善・ショートカットヘルプ) (#1162)
Kewton Jul 14, 2026
e2b0545
fix(tmux): TUIペイン高さをwindow-size manual+固定高さでピン留めし縮小を防止 (#1164)
Kewton Jul 14, 2026
6408a87
fix(slash): Codex選択時に .agents/skills のスキルをスラッシュ候補へ追加スキャン (#1165) (#1168)
Kewton Jul 14, 2026
11535cf
fix(mobile): キーボード表示時に入力欄が上部へ飛ぶ問題をvisualViewport高さ追従で解消 (#1166) (#1169)
Kewton Jul 14, 2026
72b8aa8
fix(terminal): 1000行ペインのプロンプト処理を安定化 (#1167) (#1170)
Kewton Jul 14, 2026
65991d6
feat(terminal): Claude/Codexの1000行ペインで表示専用に空行を圧縮 (#1172) (#1173)
Kewton Jul 14, 2026
f9c9ddb
feat(terminal): PC各ターミナルsplitにセッション終了ボタンを追加 (#1171) (#1174)
Kewton Jul 14, 2026
df6ce74
chore: merge main (#1106 squash) to develop
Kewton Jul 15, 2026
d7f688d
chore: merge main (#1175 squash) to develop
Kewton Jul 15, 2026
27c876b
chore: merge release v0.9.0 to develop
Kewton Jul 15, 2026
689c48b
chore(deps): Next.js 15 / React 19 アップグレード (#1177) (#1179)
Kewton Jul 15, 2026
1aeecee
chore(deps): Tailwind CSS 4 アップグレード (#1178) (#1183)
Kewton Jul 15, 2026
6de7332
test(sidebar): wait for scroll restore before driving scrollTop (#118…
Kewton Jul 15, 2026
da10c17
fix(ui): make RouteLoading neutral so route changes stop flashing a f…
Kewton Jul 15, 2026
e52668d
test(e2e): E2Eスイートのdrift修復とCI組込み・本番DB汚染リスクの是正 (#1180) (#1187)
Kewton Jul 15, 2026
844a4be
chore(deps): regenerate package-lock.json to drop orphaned autoprefix…
Kewton Jul 15, 2026
16dc16f
chore(lint): next lint から ESLint CLI へ移行 (#1181) (#1190)
Kewton Jul 15, 2026
0f8a535
chore: ignore UI検証のデバッグ生成物と CommandMate 実行時データ
Kewton Jul 15, 2026
6715f3d
chore: merge release v0.9.1 to develop
Kewton Jul 15, 2026
838b661
fix(test): GitPane DR3-004 の非同期競合を解消し CI 限定のランダム失敗を止める (#1204) (#1205)
Kewton Jul 15, 2026
e379575
fix(i18n): Home/Repository 画面の英語ハードコード文言を i18n 化 (#1197) (#1203)
Kewton Jul 15, 2026
d6cdbbd
feat(cli): commandmate update コマンドを追加 (#1194) (#1207)
Kewton Jul 15, 2026
78d814e
fix(test): issue-288 Scenario 5 の非同期競合を解消し CI 限定のランダム失敗を止める (#1209) (…
Kewton Jul 15, 2026
05132a4
feat(cli): 引数なし実行をガイド付きクイックスタート化し engines を追加 (#1195) (#1208)
Kewton Jul 15, 2026
27db925
fix(i18n): Header / GlobalMobileNav の nav ラベルを i18n 化 (#1206) (#1212)
Kewton Jul 15, 2026
6c3be8c
fix(mobile): 下部ナビのラベルに折返し防止を追加し 320px 日本語の2行折返しを解消 (#1211) (#1213)
Kewton Jul 15, 2026
6ff52c0
docs: ドキュメント間の矛盾を解消し README に Update セクションを追加 (#1196) (#1214)
Kewton Jul 15, 2026
cc0cf8c
fix(test): MarkdownEditor TOC テストの非同期競合を解消し CI 限定の失敗を止める (#1216) (#1217)
Kewton Jul 15, 2026
26fd7ec
feat(ui): アップデート通知バナーに「今すぐアップデート」ボタンを追加 (#1198) (#1215)
Kewton Jul 15, 2026
fdb6d54
feat(ui): 初回オンボーディング導線を追加(空状態CTA+セットアップチェックリスト) (#1199) (#1218)
Kewton Jul 15, 2026
476ef87
fix(test): MessageInput の非同期競合3件を解消(#1209 の修正漏れ) (#1222) (#1223)
Kewton Jul 15, 2026
295e5e8
research(db): better-sqlite3 → node:sqlite 移行調査(判定: No-Go・時期尚早) (#120…
Kewton Jul 15, 2026
53a5bd9
feat(lp): GitHub Pages ランディングページを構築 (#1200) (#1220)
Kewton Jul 15, 2026
9c81df2
fix(lp): スクリーンショットを現行UIで撮り直す(旧名 MyCodeBranchDesk の解消) (#1221) (#1225)
Kewton Jul 15, 2026
53c5993
fix(i18n): リポジトリ登録画面(RepositoryManager)を i18n 化 (#1219) (#1226)
Kewton Jul 15, 2026
bebb797
fix(test): start-issue/status-issue/stop-issue が実装を検証していない問題を修正 (#126…
Kewton Jul 15, 2026
12fdfca
fix(polling): Claude の応答が History に反映されない問題を修正 (#1268) (#1281)
Kewton Jul 15, 2026
60aad76
feat(db): better-sqlite3 の ABI mismatch を検知して自動 rebuild する (#1263) (#…
Kewton Jul 15, 2026
17a703f
chore(build): tsconfig の include を実ディレクトリに限定する (#1265) (#1278)
Kewton Jul 15, 2026
d06e22d
fix(config): 不正な CM_DB_PATH を黙って既定値に差し替えず起動時に停止する (#1267) (#1280)
Kewton Jul 15, 2026
8989110
chore(engines): Node 20 EOL のため engines を >=22.0.0 に引き上げる (#1264) (#1…
Kewton Jul 15, 2026
5e3ae54
fix(test): UpdateNotificationBanner のフレークを解消(待つ対象の誤り) (#1287)
Kewton Jul 15, 2026
26e9787
chore(lint): モジュールスコープ const の literal label を検出する ESLint ルールを追加 (#12…
Kewton Jul 15, 2026
6389cdc
fix(cli): status が実際の起動ポートを報告するよう .env の優先順位を揃える (#1266) (#1288)
Kewton Jul 15, 2026
4904154
fix(website): LP から動画を外し、ヒーロー/og:image を隔離環境の素材に差し替える (#1272) (#1290)
Kewton Jul 16, 2026
edbd3bc
fix(polling): Claude のフッターを抽出時点で落とし応答の重複保存を止める (#1289) (#1291)
Kewton Jul 16, 2026
bc75a58
chore(deps): package-lock.json の engines を package.json に同期する (#1293)
Kewton Jul 16, 2026
4891982
fix(security): isSystemDirectory をパス境界+symlink 解決で判定する (#1285) (#1294)
Kewton Jul 16, 2026
c0e3521
fix(polling): 起動バナーを assistant message として保存しない (#1292) (#1295)
Kewton Jul 16, 2026
97e36c4
feat(i18n): ui/common/sidebar/external-apps の文言を移行し namespace 方針を確定する…
Kewton Jul 16, 2026
3748096
fix(i18n): worktree/ ファイル閲覧・編集系の文言を worktree namespace へ移行する (#1275) …
Kewton Jul 16, 2026
9472c33
feat(i18n): worktree/ セッション・メッセージ系の文言を移行する (#1276) (#1298)
Kewton Jul 16, 2026
eabfefb
feat(i18n): home/review/mobile/layout の文言を移行し実辞書ガードを追加する (#1274) (#1300)
Kewton Jul 16, 2026
3fad6d9
fix(i18n): worktree/ パネル・ダイアログ系と git/ の文言を移行する (#1277) (#1303)
Kewton Jul 16, 2026
d873fbf
fix(i18n): status-colors.ts のラベルを辞書キーへ移行する (#1304) (#1309)
Kewton Jul 16, 2026
f3d42d5
feat(i18n): プッシュ通知のロケール対応(購読時に locale 保存・サーバサイド解決) (#1308) (#1310)
Kewton Jul 16, 2026
ccfb035
fix(i18n): src/app(sessions/review/layout/offline)の文言を移行する (#1305) (#…
Kewton Jul 16, 2026
ec60802
fix(i18n): standard-commands.ts のスラッシュコマンド description を移行する (#1306) …
Kewton Jul 16, 2026
c06be0c
fix(i18n): AI プロンプトテンプレート(git/schedule)を翻訳可能にする (#1307) (#1313)
Kewton Jul 16, 2026
837f0a8
chore: release v0.10.0
Kewton Jul 16, 2026
d318e7d
chore: merge release v0.10.0 to develop (restore ancestry)
Kewton Jul 16, 2026
65c5e0c
feat(website): quick start を2トラック化し npx を @latest に統一する (#1317) (#1321)
Kewton Jul 16, 2026
15cdd04
fix(docs): npx 案内を @latest に統一し npx daemon 推奨を見直す (#1318) (#1322)
Kewton Jul 16, 2026
ce7349b
fix(cli): npx 実行時の update を検出して誤動作を防ぐ (#1319) (#1323)
Kewton Jul 16, 2026
f7e1083
fix: 公開パッケージから .next/cache を除外する (#1315) (#1324)
Kewton Jul 16, 2026
1873dcf
chore: release v0.10.1
Kewton Jul 17, 2026
0d4398c
chore: merge release v0.10.1 to develop (restore ancestry)
Kewton Jul 17, 2026
300e8f4
docs: リリース手順を実態に合わせて更新する (#1326)
Kewton Jul 17, 2026
2845d43
feat(website): Track A を可視化しチュートリアル導線を追加する (#1327) (#1330)
Kewton Jul 17, 2026
1580f11
fix(config): CM_ROOT_DIR の壊れた自動発見を削除し管理範囲に統一する (#1328) (#1331)
Kewton Jul 17, 2026
d26cba6
docs(tutorial): 起動を修正より前に置きループを本物にする (#1332)
Kewton Jul 17, 2026
74f9ad8
chore: release v0.10.2
Kewton Jul 17, 2026
238684c
chore: merge release v0.10.2 to develop (restore ancestry)
Kewton Jul 17, 2026
e98f5bb
fix(clone): git spawn に cwd を明示しクローン失敗(exit 128)を解消する (#1335)
Kewton Jul 17, 2026
54d75a3
chore: release v0.10.3
Kewton Jul 17, 2026
eaac0a1
chore: merge release v0.10.3 to develop (restore ancestry)
Kewton Jul 17, 2026
5182aa2
fix(db): 将来版スキーマの DB を検知して起動を停止する (#1353) (#1366)
Kewton Jul 17, 2026
a1af7c8
fix(scheduler): createExecutionLog 例外時に isExecuting が固定されるのを防ぐ (#1343…
Kewton Jul 17, 2026
2f7601d
fix(clone): executeClone の同期例外でジョブが running 固着するのを防ぐ (#1342) (#1367)
Kewton Jul 17, 2026
985909d
fix(scheduler): #1343 の後始末(CI flake 修正 + CHANGELOG 追記) (#1369)
Kewton Jul 17, 2026
e3c2932
fix(clone): onCloneSuccess の失敗を握り潰さずジョブを failed に落とす (#1340) (#1370)
Kewton Jul 17, 2026
ed1fd5d
fix(assistant): 実行開始の失敗で会話が running 固着するのを防ぐ (#1344) (#1372)
Kewton Jul 17, 2026
6ba9c67
fix(update): ロック取得後の例外でロックが解放されないのを防ぐ (#1345) (#1371)
Kewton Jul 17, 2026
d38635c
fix(api): リポジトリ DELETE の 404 応答時に幽霊行を作らない (#1346) (#1373)
Kewton Jul 17, 2026
32e7cb7
fix(db): CM_ROOT_DIR 由来の幽霊リポジトリ行を掃除する (#1339) (#1374)
Kewton Jul 17, 2026
9cd01d2
fix(ui): ツールチップをポータル化しビューポート端で clamp する (#1341, #1364) (#1375)
Kewton Jul 17, 2026
70366e2
fix(ui): BranchCheckoutDropdown をポータル化し下端でフリップする (#1363) (#1376)
Kewton Jul 17, 2026
763fe5b
fix(ui): 右クリックメニューをビューポート内に clamp する (#1362) (#1377)
Kewton Jul 17, 2026
650a03d
fix(ui): BranchTooltip をビューポート内に clamp する (#1361) (#1378)
Kewton Jul 17, 2026
9380a06
fix(ui): 残るフローティング UI の見切れを解消する (#1365) (#1379)
Kewton Jul 17, 2026
9669e5b
fix(api): scan 経路で repositories 行を登録する (#1348) (#1381)
Kewton Jul 17, 2026
b223d90
fix(db): busy_timeout と WAL を設定し多重オープン時の SQLITE_BUSY を防ぐ (#1360) (#1382)
Kewton Jul 17, 2026
3e4a531
fix(build): サーバーの currentVersion を実行時 package.json から解決する (#1359) (#1…
Kewton Jul 17, 2026
c6304ad
fix(api): DELETE のパスを正規化して worktree 残置を防ぐ (#1347) (#1384)
Kewton Jul 17, 2026
a54301e
fix(api): UNIQUE 違反を事前検証し 409 で返す(schedules 同名 / memos position)(#135…
Kewton Jul 17, 2026
62faa51
fix(db): repositories 行のライフサイクルを整える(幽霊行の再clone封鎖と UNIQUE 未捕捉)(#1350, …
Kewton Jul 17, 2026
dd7abac
fix(cli): デーモン state ファイルに版・実効設定・プロセス同一性を記録する (#1354, #1355, #1358) (…
Kewton Jul 17, 2026
da07e6c
fix(cli): quickstart で稼働デーモンと CLI の版を照合し警告する (#1337) (#1388)
Kewton Jul 17, 2026
707dcfa
fix(cli): API レスポンスをシェイプ検証し版照会で版ずれを警告する (#1357) (#1389)
Kewton Jul 17, 2026
d1caefc
fix(sync): リポジトリ消滅時に stale worktree 行を剪定する (#1349) (#1390)
Kewton Jul 17, 2026
332c372
fix(ui,realtime): 版不一致を検知してリロード導線を出す (#1338, #1356) (#1391)
Kewton Jul 17, 2026
7911e30
fix(slash): 同名スキルの Claude/Codex 版が併存できるようマージ層の重複排除キーを揃える (#1380) (#1392)
Kewton Jul 18, 2026
df58ab8
chore: release v0.10.4
Kewton Jul 18, 2026
2e39358
chore: merge release v0.10.4 to develop (restore ancestry)
Kewton Jul 18, 2026
e994955
fix(update): npx 起動時に GUI アップデートが誤動作するのを防ぐ (#1394) (#1396)
Kewton Jul 18, 2026
f131563
feat(update): npx 起動サーバの GUI ワンクリック更新を実装 (#1395) (#1397)
Kewton Jul 18, 2026
d6b6751
chore: release v0.11.0
Kewton Jul 18, 2026
0dc352c
chore: merge release v0.11.0 to develop (restore ancestry)
Kewton Jul 18, 2026
ea21f15
fix(toast): サイドバー基準になるトーストを body ポータルで右下固定 (#1399) (#1401)
Kewton Jul 18, 2026
b8daaee
refactor(toast): ToastProvider でトーストをグローバル1本化 (#1400) (#1402)
Kewton Jul 18, 2026
13293e1
chore: release v0.11.1
Kewton Jul 18, 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
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.11.1] - 2026-07-19

> **Highlight**: **サイドバー同期トーストの見切れ修正と Toast のグローバル1本化**。サイドバーの同期ボタン押下時に表示されるトーストが、`transform` を持つ祖先(`AppShell` のサイドバー枠)の containing block に閉じ込められてビューポート右下ではなくサイドバー基準に配置され、左端が見切れていた問題を解消した。#1399 で `ToastContainer` を `document.body` への `createPortal` 化(`mounted` ガードで SSR 安全)して根本修正し、#1400 で散在していた `ToastContainer`/`useToast` を単一の `ToastProvider` + 単一 Portal ホストへ統合して、描画位置がツリー構造に依存しなくなるようにし再発を構造的に防止した。

### Fixed

- **サイドバー同期トーストの見切れを修正** (#1399): 同期ボタンのトーストは `position: fixed` だが、描画元 `SyncButton` の祖先 `<aside data-testid="sidebar-container">`(`AppShell`)が `transform`(スライド演出)を持つため、CSS 仕様上その祖先が `fixed` の containing block となり、トーストがビューポートではなくサイドバー枠(既定幅 224px)基準に配置され、`min-w-[300px]` の左端が画面外へはみ出していた。`ToastContainer` を `createPortal(..., document.body)` で描画するよう変更(`mounted` ガードでクライアントマウント後のみ portal、`Modal`/`CommandPalette` と同パターン)し、呼び出し元のツリー位置に関わらず `fixed` がビューポート基準となるようにした。

### Changed

- **Toast をグローバル1本化(`ToastProvider` + 単一 Portal ホスト)** (#1400): 各コンポーネントでローカルに生成していた `ToastContainer`/`useToast` を、単一の `ToastProvider`(Context)+ 1 箇所だけ描画する Portal ホストへ統合した。`useToast()` は共有 Context を返すフックに変更(Provider 外でもクラッシュしないフォールバック付き)。`Sidebar`・`CommandPalette`・`NotificationsSettings`・`worktree` 配下の各 consumer からローカルの `ToastContainer` を撤去し、共有 Context 経由に置き換え。fixed トーストホストが 1 つに集約され、位置の一貫性・スタッキング制御・重複排除を実現し、`transform` 祖先による見切れ等の再発を構造的に防止する。

## [0.11.0] - 2026-07-18

> **Highlight**: **npx 起動サーバの GUI アップデート対応**。`npx commandmate` で起動したサーバの GUI アップデート機能を2段で整備した。#1394 で npx を正しく検知して誤動作(「今すぐアップデート」が `202 started` を返すのに no-op → 5 分 timeout・`commandmate update` の誤案内)を解消し、#1395 で同ボタンから npx サーバをその場更新(新しい npx キャッシュ取得 → 旧デーモン停止 → 新デーモン起動 → GUI 自動リロード)できるようにした。停止前に版検証してダウンタイム0で fail-fast し、#1198 のセキュリティ不変条件(固定 argv・多重実行ロック・認証は middleware 任せ)を維持する。素の CLI `commandmate update`(npx)は従来どおり案内のみの no-op(#1319)。
Expand Down
2 changes: 1 addition & 1 deletion docs/module-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@
| `src/components/ui/Modal.tsx` | モーダルダイアログコンポーネント(Z_INDEX.MODAL使用。Issue #1114: useExitAnimationでdata-state=closedのfade+zoom-out exitを200ms再生後にアンマウント) |
| `src/components/ui/StatusDot.tsx` | 共通ステータスドット(Issue #1051: running/generating=緑グロー+パルス+静的リング(reduced-motion凍結時もreadyと識別)、waiting=amber弱点滅、idle/ready/error+未知state=静的、size sm/md/lg。infinite CSSアニメでポーリング非リセット、reduced-motionはglobals.css準拠。適用はサイドバー/Home/Sessionsのみ、worktree詳細/MobileHeaderは従来spinner据置) |
| `src/components/common/FullScreenModal.tsx` | モバイル向けフルスクリーンモーダルシェル(Issue #825: slide-up、右上クローズ、sticky footer、visualViewportでキーボード回避、focus時scrollIntoView) |
| `src/components/common/Toast.tsx` | トースト通知コンポーネント(Z_INDEX.TOAST使用。Issue #1114: 閉時はfade+slide-out exitを再生しonClose通知を200ms遅延) |
| `src/components/common/Toast.tsx` | トースト通知コンポーネント(Z_INDEX.TOAST使用。Issue #1114: 閉時はfade+slide-out exitを再生しonClose通知を200ms遅延。Issue #1399: ToastContainerをdocument.bodyへcreatePortal。Issue #1400: `ToastProvider`(Context)でキューを1本化しAppProviders直下に単一ホストを描画、`useToast()`はProvider配下で共有・非配下ではローカルにフォールバック) |
| `src/components/worktree/ContextMenu.tsx` | ファイル/ディレクトリコンテキストメニュー(Issue #162: 「移動」項目、Issue #299: Z_INDEX.CONTEXT_MENU使用。Issue #1114: 閉時fade+zoom-out exit 100ms) |
| `src/components/worktree/FileViewer.tsx` | ファイルビューア(Issue #162: コピーボタン追加、Copy/Checkアイコン切替、useMemo最適化、画像ファイル非表示。**Issue #302: 動画表示分岐追加、canCopyロジック修正(isVideo除外)**。**Issue #411: React.memo()ラップ(named export形式、isOpen=false時のポーリング起因再レンダースキップ)**)。ファイルビューア、検索ロジックを `useFileContentSearch` に統一(Issue #723)。**Issue #1024: ダウンロード導線追加** - `<a href={worktreeId+encodePathForUrl(filePath)+'?download=1'} download>`(`data-testid="download-file-button"`、ハードコードラベル、canCopy非依存)をツールバーとエラーブロック両方に描画し全状態(成功/エラー/上限超/バイナリ)で到達可能に(モバイル専用コンポーネントのため PC file-tab の FilePanelContent は対象外) |
| `src/components/worktree/FileTreeView.tsx` | ファイルツリー表示(Issue #162: birthtime表示、formatRelativeTime()ロケール対応、sm:inline条件表示。Issue #300: 非空状態にツールバー追加、data-testid=file-tree-toolbar/toolbar-new-file-button/toolbar-new-directory-button、onNewFile('')/onNewDirectory('')でルートレベル作成)。ファイルツリービュー(Issue #479) |
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "commandmate",
"version": "0.11.0",
"version": "0.11.1",
"description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
"keywords": [
"claude-code",
Expand Down
8 changes: 2 additions & 6 deletions src/components/common/CommandPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import { useLocaleSwitch } from '@/hooks/useLocaleSwitch';
import { repositoryApi } from '@/lib/api-client';
import { StatusDot, type StatusDotStatus } from '@/components/ui/StatusDot';
import { Kbd } from '@/components/ui/Kbd';
import { useToast, ToastContainer } from '@/components/common/Toast';
import { useToast } from '@/components/common/Toast';
import type { Worktree } from '@/types/models';

/** Navigation targets shown in the palette (mirrors Header / GlobalMobileNav). */
Expand Down Expand Up @@ -207,7 +207,7 @@ export function CommandPalette() {
// Read from the shared worktrees cache (always fresh + auto-retried). Optional
// so the palette degrades gracefully when no provider is present (unit tests).
const worktreesCache = useOptionalWorktreesCacheContext();
const { toasts, showToast, removeToast } = useToast();
const { showToast } = useToast();

const [mounted, setMounted] = useState(false);
const [search, setSearch] = useState('');
Expand Down Expand Up @@ -630,10 +630,6 @@ export function CommandPalette() {
</div>
</div>
)}

{/* Persistent so a toast (e.g. Sync repositories) survives the palette
closing after the command runs. */}
<ToastContainer toasts={toasts} onClose={removeToast} />
</>,
document.body
);
Expand Down
132 changes: 95 additions & 37 deletions src/components/common/Toast.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,17 @@

'use client';

import React, { useEffect, useState, useCallback, useRef } from 'react';
import React, {
createContext,
useContext,
useEffect,
useState,
useCallback,
useMemo,
useRef,
type ReactNode,
} from 'react';
import { createPortal } from 'react-dom';
import { useTranslations } from 'next-intl';
import { CheckCircle, XCircle, Info, AlertTriangle, X } from 'lucide-react';
import { Z_INDEX } from '@/config/z-index';
Expand Down Expand Up @@ -240,7 +250,20 @@ export interface ToastContainerProps {
* ```
*/
export function ToastContainer({ toasts, onClose }: ToastContainerProps) {
return (
// [Issue #1399] Render through a portal to `document.body` so the container's
// `position: fixed` resolves against the viewport. When mounted inside a
// transformed ancestor (AppShell's `<aside data-testid="sidebar-container">`
// uses a transform), that ancestor becomes the containing block for `fixed`,
// pinning the toasts to the sidebar's box and clipping their left edge instead
// of the intended bottom-right of the screen. Guarded on `mounted` so the
// server render (where `document` is absent) yields null and the portal only
// appears after client hydration — the same pattern as CommandPalette / Modal.
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);

const container = (
<div
data-testid="toast-container"
aria-live="polite"
Expand All @@ -259,36 +282,35 @@ export function ToastContainer({ toasts, onClose }: ToastContainerProps) {
))}
</div>
);

if (!mounted) return null;

return createPortal(container, document.body);
}

/**
* Hook for managing toast notifications
*
* @example
* ```tsx
* function MyComponent() {
* const { showToast, toasts, removeToast } = useToast();
*
* const handleSave = () => {
* showToast('File saved successfully', 'success');
* };
*
* return (
* <>
* <button onClick={handleSave}>Save</button>
* <ToastContainer toasts={toasts} onClose={removeToast} />
* </>
* );
* }
* ```
* Shared shape for the toast controls returned by {@link useToast} and provided
* by {@link ToastProvider}.
*/
export function useToast() {
export interface ToastContextValue {
/** Currently visible toasts */
toasts: ToastItem[];
/** Show a new toast notification; returns the generated id */
showToast: (message: string, type?: ToastType, duration?: number) => string;
/** Remove a toast by id */
removeToast: (id: string) => void;
/** Clear all toasts */
clearToasts: () => void;
}

/**
* Internal state machine for toast notifications. Backs both the shared
* {@link ToastProvider} and the provider-less fallback in {@link useToast}.
*/
function useToastState(): ToastContextValue {
const [toasts, setToasts] = useState<ToastItem[]>([]);
const idCounterRef = useRef(0);

/**
* Show a new toast notification
*/
const showToast = useCallback(
(message: string, type: ToastType = 'info', duration: number = DEFAULT_DURATION) => {
const id = `toast-${++idCounterRef.current}-${Date.now()}`;
Expand All @@ -304,26 +326,62 @@ export function useToast() {
[]
);

/**
* Remove a toast by ID
*/
const removeToast = useCallback((id: string) => {
setToasts((prev) => prev.filter((toast) => toast.id !== id));
}, []);

/**
* Clear all toasts
*/
const clearToasts = useCallback(() => {
setToasts([]);
}, []);

return {
toasts,
showToast,
removeToast,
clearToasts,
};
return useMemo(
() => ({ toasts, showToast, removeToast, clearToasts }),
[toasts, showToast, removeToast, clearToasts]
);
}

const ToastContext = createContext<ToastContextValue | null>(null);

/**
* ToastProvider (Issue #1400)
*
* Holds a single app-wide toast queue and renders the one and only
* <ToastContainer> (portaled to `document.body`, per Issue #1399, so it escapes
* any transformed ancestor and pins to the viewport's bottom-right). Mount it
* once above the app (see AppProviders); every useToast() below then shares the
* same queue instead of spawning its own detached container.
*/
export function ToastProvider({ children }: { children: ReactNode }) {
const value = useToastState();
return (
<ToastContext.Provider value={value}>
{children}
<ToastContainer toasts={value.toasts} onClose={value.removeToast} />
</ToastContext.Provider>
);
}

/**
* Hook for showing toast notifications.
*
* Returns the shared controls from the nearest {@link ToastProvider} (the normal
* case — AppProviders mounts one globally, so a single container renders every
* toast). With no provider above it falls back to a local, self-contained
* instance so isolated components/tests still work; render your own
* <ToastContainer> in that case.
*
* @example
* ```tsx
* function SaveButton() {
* const { showToast } = useToast();
* return <button onClick={() => showToast('Saved', 'success')}>Save</button>;
* }
* ```
*/
export function useToast(): ToastContextValue {
const ctx = useContext(ToastContext);
const local = useToastState();
return ctx ?? local;
}

// Re-export types for convenience
Expand Down
5 changes: 2 additions & 3 deletions src/components/layout/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import { TruncationTooltip } from '@/components/common/TruncationTooltip';
import { LocaleSwitcher } from '@/components/common/LocaleSwitcher';
import { ThemeToggle } from '@/components/common/ThemeToggle';
import { LogoutButton } from '@/components/common/LogoutButton';
import { useToast, ToastContainer } from '@/components/common/Toast';
import { useToast } from '@/components/common/Toast';
import { repositoryApi, ApiError } from '@/lib/api-client';
import { toBranchItem } from '@/types/sidebar';
import type { SidebarBranchItem } from '@/types/sidebar';
Expand Down Expand Up @@ -838,7 +838,7 @@ const SyncButton = memo(function SyncButton({
}) {
const [isSyncing, setIsSyncing] = useState(false);
const isSyncingRef = useRef(false);
const { showToast, toasts, removeToast } = useToast();
const { showToast } = useToast();
const t = useTranslations('common');

const handleSync = useCallback(async () => {
Expand Down Expand Up @@ -880,7 +880,6 @@ const SyncButton = memo(function SyncButton({
<SyncIcon className={isSyncing ? 'animate-spin' : ''} />
</button>
</Tooltip>
<ToastContainer toasts={toasts} onClose={removeToast} />
</>
);
});
5 changes: 2 additions & 3 deletions src/components/notifications/NotificationsSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { useCallback, useEffect, useState } from 'react';
import { useTranslations } from 'next-intl';
import { Bell } from 'lucide-react';
import { Button, Card, Spinner, Switch } from '@/components/ui';
import { useToast, ToastContainer } from '@/components/common/Toast';
import { useToast } from '@/components/common/Toast';
import {
urlBase64ToUint8Array,
isPushSupported,
Expand All @@ -26,7 +26,7 @@ interface Prefs {

export function NotificationsSettings() {
const t = useTranslations('notifications');
const { showToast, toasts, removeToast } = useToast();
const { showToast } = useToast();

const [loading, setLoading] = useState(true);
const [busy, setBusy] = useState(false);
Expand Down Expand Up @@ -292,7 +292,6 @@ export function NotificationsSettings() {
return (
<Card>
{renderBody()}
<ToastContainer toasts={toasts} onClose={removeToast} />
</Card>
);
}
66 changes: 36 additions & 30 deletions src/components/providers/AppProviders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { WorktreesCacheProvider } from '@/components/providers/WorktreesCachePro
import { ViewTransitionsProvider } from '@/components/providers/ViewTransitionsProvider';
import { RealtimeProvider } from '@/hooks/useRealtimeConnection';
import { ConfirmProvider } from '@/components/ui/ConfirmDialog';
import { ToastProvider } from '@/components/common/Toast';
import { ServiceWorkerRegistrar } from '@/components/pwa/ServiceWorkerRegistrar';

interface AppProvidersProps {
Expand All @@ -45,36 +46,41 @@ interface AppProvidersProps {
export function AppProviders({ children, locale, messages, timeZone, authEnabled = false }: AppProvidersProps) {
return (
<NextIntlClientProvider locale={locale} messages={messages} timeZone={timeZone}>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<AuthProvider authEnabled={authEnabled}>
<PcDisplaySizeProvider>
<SidebarProvider>
{/* Issue #1120: single shared WebSocket connection wrapping the
worktrees cache so session-status / message / terminal pushes
feed the sidebar and terminal panes; polling remains the
fallback when disconnected. */}
<RealtimeProvider>
<WorktreesCacheProvider>
<CommandPaletteProvider>
{/* Issue #1130: `?` keyboard-shortcuts help overlay open state. */}
<KeyboardShortcutsProvider>
<ConfirmProvider>
{/* Issue #1141: View Transitions wraps the routed content. */}
<ViewTransitionsProvider>
{children}
</ViewTransitionsProvider>
{/* Issue #1124: registers the Service Worker (prod only)
and shows the update-available prompt. */}
<ServiceWorkerRegistrar />
</ConfirmProvider>
</KeyboardShortcutsProvider>
</CommandPaletteProvider>
</WorktreesCacheProvider>
</RealtimeProvider>
</SidebarProvider>
</PcDisplaySizeProvider>
</AuthProvider>
</ThemeProvider>
{/* Issue #1400: single app-wide toast queue + one portaled ToastContainer.
Sits inside NextIntlClientProvider so the toast close-button aria-label
resolves, and wraps everything so any useToast() below shares it. */}
<ToastProvider>
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
<AuthProvider authEnabled={authEnabled}>
<PcDisplaySizeProvider>
<SidebarProvider>
{/* Issue #1120: single shared WebSocket connection wrapping the
worktrees cache so session-status / message / terminal pushes
feed the sidebar and terminal panes; polling remains the
fallback when disconnected. */}
<RealtimeProvider>
<WorktreesCacheProvider>
<CommandPaletteProvider>
{/* Issue #1130: `?` keyboard-shortcuts help overlay open state. */}
<KeyboardShortcutsProvider>
<ConfirmProvider>
{/* Issue #1141: View Transitions wraps the routed content. */}
<ViewTransitionsProvider>
{children}
</ViewTransitionsProvider>
{/* Issue #1124: registers the Service Worker (prod only)
and shows the update-available prompt. */}
<ServiceWorkerRegistrar />
</ConfirmProvider>
</KeyboardShortcutsProvider>
</CommandPaletteProvider>
</WorktreesCacheProvider>
</RealtimeProvider>
</SidebarProvider>
</PcDisplaySizeProvider>
</AuthProvider>
</ThemeProvider>
</ToastProvider>
</NextIntlClientProvider>
);
}
Loading
Loading