@tocca-systems/twp-cli 0.43.0 → 0.45.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.
Files changed (74) hide show
  1. package/CHANGELOG.public.md +16 -0
  2. package/README.md +92 -6
  3. package/dist/{agent-loop-MMWJHN3D.js → agent-loop-RMJXHBNG.js} +1 -1
  4. package/dist/{ai-dispatch-MXTI2KZ2.js → ai-dispatch-L6XZCCU4.js} +2 -2
  5. package/dist/analysis-KUCETWIJ.js +3 -0
  6. package/dist/{api-command-DND4342Q.js → api-command-6C3MFXVU.js} +8 -7
  7. package/dist/{app-2DWKZ2VE.js → app-6DA35MYO.js} +5 -5
  8. package/dist/{backlog-SDWC7OY5.js → backlog-Q7VYDMDL.js} +1 -1
  9. package/dist/budget-FOFE3YUJ.js +97 -0
  10. package/dist/{chunk-L35F47BO.js → chunk-4OSCQLZT.js} +1 -1
  11. package/dist/{chunk-CZMJXLDZ.js → chunk-7GSTR64T.js} +1 -1
  12. package/dist/chunk-C2MQANJO.js +9 -0
  13. package/dist/{chunk-YQ4DGLD3.js → chunk-D5FEOBB6.js} +20 -17
  14. package/dist/{chunk-RKYNTQAI.js → chunk-DS5TH5YQ.js} +1 -1
  15. package/dist/{chunk-XPYNN63B.js → chunk-DVKPGJMS.js} +1 -1
  16. package/dist/chunk-E7MUDY4P.js +82 -0
  17. package/dist/{chunk-HBYFCYWA.js → chunk-EM3SDCCU.js} +17 -16
  18. package/dist/{chunk-HBSD3UC6.js → chunk-EWTFE233.js} +2 -2
  19. package/dist/{chunk-O5AUX7AQ.js → chunk-IOCNJMVW.js} +2 -1
  20. package/dist/{chunk-67UNSXM7.js → chunk-JLNY7HRM.js} +2 -2
  21. package/dist/{chunk-XYIM36Q4.js → chunk-JNPCHV7S.js} +1 -1
  22. package/dist/{chunk-AHLI7BUX.js → chunk-NAAMNYX3.js} +1 -1
  23. package/dist/{chunk-XSSKEJGO.js → chunk-O3UQPM6L.js} +1 -1
  24. package/dist/chunk-Q3B65OFC.js +3 -0
  25. package/dist/{chunk-3ZOHVESS.js → chunk-QV6DH37Q.js} +1 -1
  26. package/dist/chunk-XTREYDO5.js +81 -0
  27. package/dist/{chunk-PGJ42IUR.js → chunk-XUNFV6ZQ.js} +1 -1
  28. package/dist/{chunk-NKIBB72I.js → chunk-XXVYGQ72.js} +1 -1
  29. package/dist/{chunk-OUP3JLVH.js → chunk-Y4SREWAG.js} +1 -1
  30. package/dist/chunk-Y5EN7RYN.js +4 -0
  31. package/dist/{chunk-PORE2NZO.js → chunk-YPMT453N.js} +1 -1
  32. package/dist/{chunk-QEWI75KI.js → chunk-ZM3MTWNT.js} +1 -1
  33. package/dist/cli.js +75 -9
  34. package/dist/{commands-BDYQKXPD.js → commands-5GP3REIU.js} +12 -12
  35. package/dist/{commands-255HOMWQ.js → commands-JUD4ZNWT.js} +1 -1
  36. package/dist/{company-7TFFYG4A.js → company-UTEAM246.js} +3 -3
  37. package/dist/{completion-H65LUFVF.js → completion-YSP6UE25.js} +1 -1
  38. package/dist/{contract-SIFZY6D4.js → contract-GUY73GRP.js} +2 -2
  39. package/dist/{department-NSK6YY6X.js → department-QMTJYMN2.js} +1 -1
  40. package/dist/{deposit-FUM7OA6F.js → deposit-FOATHWXV.js} +2 -2
  41. package/dist/{estimate-RL3N3JAE.js → estimate-6UWI7SKV.js} +4 -4
  42. package/dist/{inquiry-K7RSYLFW.js → inquiry-3VBBJT2K.js} +1 -1
  43. package/dist/{invoice-E7XIBLRA.js → invoice-FOZJR42A.js} +3 -3
  44. package/dist/{job-title-OF3ABHUQ.js → job-title-IIRFPZNV.js} +1 -1
  45. package/dist/{knowledge-ZQYVNFNI.js → knowledge-6SXUV46K.js} +2 -2
  46. package/dist/{leave-MAFA6EQO.js → leave-LQAXN6F4.js} +2 -2
  47. package/dist/{media-LL4AVP5H.js → media-VK6AUGZY.js} +1 -1
  48. package/dist/{notification-KBL7QJE3.js → notification-NTU3JCR2.js} +1 -1
  49. package/dist/{oneshot-EUW726TV.js → oneshot-67EDIE2F.js} +1 -1
  50. package/dist/outlook-PQ4OCB5Z.js +98 -0
  51. package/dist/{position-MZADW4R4.js → position-WGLV3JZ6.js} +1 -1
  52. package/dist/project-REBUFMPX.js +4 -0
  53. package/dist/{prospect-L43GCNWK.js → prospect-DJAJNTRQ.js} +3 -3
  54. package/dist/{purchase-643XP2UX.js → purchase-7RVUWXMS.js} +4 -4
  55. package/dist/{receivable-O7H2LJ4K.js → receivable-SHRWUYJW.js} +2 -2
  56. package/dist/{registry-PGMXXWHA.js → registry-CP4LGNGZ.js} +1 -1
  57. package/dist/{render-ASQBZ75M.js → render-4L5BDU3B.js} +1 -1
  58. package/dist/{report-YTPDB4Y7.js → report-SUTO7E7Z.js} +1 -1
  59. package/dist/run-NVS532DL.js +4 -0
  60. package/dist/{sales-ai-review-J5ICW6RB.js → sales-ai-review-LC4XDQLS.js} +2 -2
  61. package/dist/{sales-master-MCS3UL4M.js → sales-master-C4EYXIKP.js} +3 -3
  62. package/dist/sales-numbering-YK447QBC.js +4 -0
  63. package/dist/{server-settings-326MD7T4.js → server-settings-3E7G56G7.js} +1 -1
  64. package/dist/{supplier-payment-QF2YMAVT.js → supplier-payment-MLLTGVCO.js} +3 -3
  65. package/dist/{task-GSZZ7HT2.js → task-7SKWCZWV.js} +19 -14
  66. package/dist/{user-IF6PAMW7.js → user-FPXO3IHG.js} +7 -5
  67. package/dist/{workflow-BHOWO32V.js → workflow-FU2EBVBW.js} +1 -1
  68. package/package.json +2 -2
  69. package/dist/chunk-TDU6U5PY.js +0 -8
  70. package/dist/chunk-YO2RNKCQ.js +0 -4
  71. package/dist/outlook-KVMKMFUE.js +0 -37
  72. package/dist/project-ZVRVNXWI.js +0 -13
  73. package/dist/run-SRTDTEKL.js +0 -4
  74. package/dist/sales-numbering-2DVWFJFG.js +0 -4
@@ -11,6 +11,22 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.45.0
15
+
16
+ 予実管理を `twp budget` で扱えるようになりました。年度の予実ダッシュボード・サマリー・部署ごとの内訳・CSV 出力に加え、目標の一覧・まとめての登録・前年度からのコピー・CSV での取り込み(雛形の書き出しを含む)と、プロジェクトの部署按分の参照と設定ができます。既存の目標や按分を上書きする操作は、実行前に今の値を表示し、`--yes` の指定が必要です。
17
+
18
+ Outlook のメールを `twp outlook mail send` / `reply` / `reply-all` / `forward` で送信・返信・全員返信・転送できるようになりました。送ったメールは取り消せないため `--yes` の指定が必要で、`--dry-run` で宛先・件名・本文・添付を事前に確認できます。返信・全員返信では、届く相手の目安を送る前に表示します。
19
+
20
+ `twp api --wait` で状態の取り直し中にサーバの応答が想定外の形になった場合も、最後に取れた応答を出力して終了するようになりました。エラー表示に認証情報が含まれないよう伏字化も行います。
21
+
22
+ npm のパッケージページ・README・起動時の画面の「ドキュメント」から、TWP CLI の使い方をまとめた公開ドキュメント(https://docs.tocca.systems/cli)へ直接移動できるようになりました。
23
+
24
+ ## 0.44.0
25
+
26
+ プロジェクトメンバーの追加・役割と稼働期間の変更・削除を `twp project member` で行えるようになりました。自分(`twp project mine`)や指定したユーザー(`twp user projects`)が参画しているプロジェクトも一覧できます。
27
+
28
+ 稼働分析・プロジェクトアサイン・人材別アサイン・キャパシティ・負荷状況・プロジェクト健全性を `twp analysis` で確認できるようになりました。プロジェクトやタスクの工数(`twp project manhours` / `twp task manhours`)と、メンバーごとのタスク件数(`twp project workload`)も表示できます。
29
+
14
30
  ## 0.43.0
15
31
 
16
32
  Microsoft 365 の Outlook(メール・添付ファイル・予定)、Teams(チーム・チャネル・チャット・メッセージ・メンション)、OneDrive(ファイル)を CLI から読めるようになりました。TWP に Microsoft アカウントでログインしたことがあるユーザーが対象です。
package/README.md CHANGED
@@ -8,7 +8,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
8
8
  - **Shift+Tab でモードを切り替え**、開発作業と業務作業を1つの端末で行き来できます
9
9
  - Windows / macOS / Linux / WSL で動作します
10
10
 
11
- ドキュメント: <https://docs.tocca.systems/>
11
+ ドキュメント: <https://docs.tocca.systems/cli>
12
12
 
13
13
  ---
14
14
 
@@ -28,16 +28,18 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
28
28
  | **できる** | `twp media` によるメディアライブラリのファイルのアップロード・一覧・ダウンロード・削除(ゴミ箱へ移す)・一括操作(公開・非公開・アーカイブ・移動・削除・復元・ZIP ダウンロード)、`twp storage get` によるストレージ使用量の確認(管理者) |
29
29
  | **できる** | `twp attendance` による自分の勤怠の参照(いまの打刻状態・打刻の履歴・月の勤怠表)と打刻、管理者向けの残業サマリ(36協定を含む)・締め状況の参照 |
30
30
  | **できる** | `twp leave` による有給の残日数・取得履歴・付与履歴の参照と有給の申請(`twp leave request`)、`twp workchange list` / `twp shift list` による月の勤務変更・シフトの参照(`--me` で自分の分・無ければ全員分=勤怠の管理者) |
31
+ | **できる** | `twp analysis` による分析の読み取り(稼働分析・プロジェクトアサイン・人材別アサインを月ごとの列で、今週のキャパシティと過負荷アラート・再分配候補・標準勤務時間の設定、負荷のリスク判定、プロジェクト健全性スコアの一覧・推移と AI の所見)、`twp project manhours` / `twp task manhours` による工数の集計、`twp project workload` によるメンバーごとのタスク件数。分析の権限と、ページごとの閲覧対象への登録が要ります |
32
+ | **できる** | `twp budget` による予実管理(年度の予実ダッシュボード・サマリー・部署行の内訳と未割当・CSV 出力、目標の一覧・JSON でのまとめ登録・前年度からのコピー・CSV の取り込みと雛形、プロジェクトの部署按分の参照と全件置換)。分析の権限と予実管理ページの閲覧対象への登録が要り、目標の書き込みは全体管理者か分析の権限が「管理者」の人です |
31
33
  | **できる** | `twp workflow` による、自分が申請できる申請書・申請書の定義(管理者)・自分の申請・承認履歴・自分の承認待ちの参照(申請書は名前でも指定できます)と、申請の起票・提出・更新・削除、承認・却下・差し戻し・取下げ |
32
34
  | **できる** | `twp report` による自分のレポート(日報)の一覧(フォーマット・状態・語で絞り込み)・詳細と、下書きの作成(フォーマットの入力項目から雛形を出せます)・更新・提出、使えるレポートフォーマットの一覧 |
33
35
  | **できる** | `twp wiki` / `twp note` / `twp meeting` による、wiki ページ(親ページ直下の子の一覧を含む)・ノート・議事録(開催日の期間で絞り込み)の一覧と、本文を `--output text` で文書として読むこと |
34
- | **できる** | `twp outlook` / `twp teams` / `twp onedrive` による Microsoft 365 の読み取り(メール・添付・予定、Teams のチーム・チャネル・チャット・メッセージ・スレッド返信・自分宛てメンション、OneDrive のファイルの一覧・情報・ダウンロード)。TWP に Microsoft アカウントでログインしたことがあるユーザーが対象で、送信・投稿などの書き込みはまだできません |
36
+ | **できる** | `twp outlook` / `twp teams` / `twp onedrive` による Microsoft 365 の読み取り(メール・添付・予定、Teams のチーム・チャネル・チャット・メッセージ・スレッド返信・自分宛てメンション、OneDrive のファイルの一覧・情報・ダウンロード)。TWP に Microsoft アカウントでログインしたことがあるユーザーが対象です。書き込みはメールの送信・返信・全員返信・転送(`twp outlook mail send` / `reply` / `reply-all` / `forward`・`--yes` が必要)ができ、Teams の投稿・OneDrive・予定の書き込みはまだできません |
35
37
  | **できる** | `twp task-loop` による、TWP のタスクキューを手元の AI CLI に実行させる常駐ループ |
36
38
  | **できる** | `twp agent-loop` による、エージェントループのキューの一覧・投入・更新・先頭への移動・削除と、期間を指定した実行履歴の参照。更新・移動・削除はテナントの管理者の権限が要ります |
37
39
  | **できる** | `twp completion bash` / `zsh` / `fish` / `powershell` によるシェル補完(コマンド名・操作名・フラグ名。プロジェクトやステータスの値は補完しません)と、`twp configure` による既定のプロジェクト・出力形式・既定プロファイルの対話設定 |
38
40
  | **できる** | スラッシュコマンド: `/help` `/mode` `/model` `/clear` `/context` `/doctor` `/exit` `/demo`(動作デモ) `/tasks` `/task` `/projects`。`/tasks` などの TWP 系は `twp task list` と同じ結果を画面に出すだけで、AI は動かしません(クレジットも消費しません)。スラッシュコマンドは TUI の中だけで使えます(`twp -p` では解釈しません) |
39
41
  | **できる** | 自分用のスラッシュコマンドを markdown で追加すること(`.twp/commands/*.md` / `~/.twp/commands/*.md`・[下記](#スラッシュコマンドを自分で足す))。入力中の `@パス` でファイルを、`#ABC-123` でタスクの内容を AI へ添付できます |
40
- | **まだできない** | **会話中の AI が自分から TWP のデータを参照・操作すること。** AI に読ませたいタスクは `#ABC-123` と書いて添付してください。起票・更新などの操作は `twp task` コマンドをお使いください |
42
+ | **できる** | 会話中の AI が TWP のデータを調べて使うこと。AI は必要な操作を検索し、内容を確かめてから実行します(TWP のデータを読む・書く操作は実行前に確認が表示され、削除は毎回確認します)。特定のタスクを確実に読ませたいときは `#ABC-123` と書いて添付できます |
41
43
  | **まだできない** | タスクの起票・コメント・通知などを行うスラッシュコマンド(`/task-new` `/comment` `/inbox` など)。同じ操作は `twp task create` / `twp task comment create` で行えます |
42
44
 
43
45
  登録されていないコマンドは補完にも `/help` にも出しません。**「あるのに動かない」ものは置かない**方針です。
@@ -80,7 +82,7 @@ twp --version / --help
80
82
  AI を介さずに TWP を直接読み書きします。スクリプトからも使えます。
81
83
 
82
84
  ```
83
- twp project list | get <コード|ID> | members <コード|ID>
85
+ twp project list | get <コード|ID> | members <コード|ID> | mine
84
86
 
85
87
  twp task list [--project <コード|__private__>] [--status <名前>] [--type <名前>] [--assignee <me|名前>]
86
88
  twp task get <キー|ID> # 例: twp task get ACME-123
@@ -138,6 +140,28 @@ twp task status delete <ステータス> --yes [--project <コード>]
138
140
  twp task list --project ACME --status 進行中 --output json --query '[].{key:key,subject:subject}'
139
141
  ```
140
142
 
143
+ ### プロジェクトメンバーをアサインする
144
+
145
+ プロジェクトの管理者(または組織管理者)が、メンバーの追加・役割と稼働期間の変更・削除を行います。
146
+
147
+ ```
148
+ twp project mine # 自分がメンバーのプロジェクト(役割・参画期間つき)
149
+ twp user projects <ユーザー> # 指定したユーザーのプロジェクト(組織管理者のみ)
150
+
151
+ twp project member create <ユーザー> --role <役割> [--project <コード>] [--period-file <パス>] [--start-date <日付>] [--end-date <日付>] [--memo <文字列>]
152
+ twp project member update <メンバー> [--project <コード>] [--role <役割>] [--period-file <パス>] [--start-date <日付>] [--end-date <日付>] [--memo <文字列>]
153
+ twp project member delete <メンバー> [--project <コード>] --yes
154
+ twp project member promote <メンバー> [--project <コード>] # 管理者(manager)にする
155
+ twp project member demote <メンバー> [--project <コード>] # manager をメンバーに戻す
156
+ twp project member alias <別名> | --clear [--project <コード>] # 自分の別名
157
+ ```
158
+
159
+ - **稼働期間は `--period-file` の JSON 配列で渡します**(例: `[{"start_date":"2026-10-01","end_date":"2026-12-31","daily_hours":8,"input_mode":"hours"}]`。`-` で標準入力)。期間を渡すと参画開始日・終了日はサーバが期間から決めるので、`--start-date` / `--end-date` とは同時に指定できません
160
+ - **`update --period-file` は稼働期間を丸ごと置き換えます。** 送る前に今の期間を読み、消える期間を表示します(`--dry-run` でも出ます)。残す期間は `twp project members --output json` の `assignment_periods` から `id` を付けたまま送ってください
161
+ - **`--role` の値はサーバが検査します**(`member` / `manager` など。値は `twp project member create help` に載せています)
162
+ - `create` の相手はテナントのユーザー(`twp user` と同じ指定方法)、それ以外の相手はそのプロジェクトのメンバー(氏名・メールアドレス・ID・`me`。別名では指定できません)です。誰に送るかは送る前に表示します
163
+ - `delete` は担当中のタスクの担当者を変えません。参画を終えるだけなら `update --end-date` を使ってください
164
+
141
165
  ### テナントのユーザーと所属を参照する
142
166
 
143
167
  組織管理者(総務)向けに、ユーザーの一覧・詳細と所属の履歴を引きます。
@@ -741,6 +765,58 @@ twp shift list [--month <YYYY-MM>] [--me]
741
765
  - `workchange list` / `shift list` は `--me` で自分の分、無ければ全員分です(全員分は勤怠の管理者権限が要り、無ければその旨を案内して終了コード 3)。`--month` が無ければ今月です
742
766
  - 勤務変更やシフトの登録はできません(画面から行ってください。有給の申請は `leave request` でできます)
743
767
 
768
+ ### 分析を見る
769
+
770
+ ```bash
771
+ twp analysis operating-hours list [--scope project|user] [--month <YYYY-MM> | --from <YYYY-MM> --to <YYYY-MM> | --year <YYYY>] [--project <コード>] [--user <ユーザー>] [--department <部署>]
772
+ twp analysis project-assignment list [--month <YYYY-MM> | --from <YYYY-MM> --to <YYYY-MM>] [--project <コード>]
773
+ twp analysis staff-assignment list [--month <YYYY-MM> | --from <YYYY-MM> --to <YYYY-MM>] [--user <ユーザー>] [--department <部署>]
774
+ twp analysis capacity list [--user <ユーザー> ...]
775
+ twp analysis capacity alerts | redistribution | settings
776
+ twp analysis workload list [--team [--date <YYYY-MM-DD>]]
777
+ twp analysis project-health list [--date <YYYY-MM-DD>] [--warning-only]
778
+ twp analysis project-health history [--project <コード>] [--from <YYYY-MM-DD>] [--to <YYYY-MM-DD>] [--granularity day|week|month]
779
+ twp analysis project-health insights [--project <コード>] [--date <YYYY-MM-DD>] --yes
780
+ twp project manhours [<コード>] [--from <YYYY-MM-DD>] [--to <YYYY-MM-DD>]
781
+ twp task manhours <キー> [--from <YYYY-MM-DD>] [--to <YYYY-MM-DD>]
782
+ twp project workload [<コード>]
783
+ ```
784
+
785
+ - 稼働分析・プロジェクトアサイン・人材別アサインは、期間を指定しなければ**当月(この端末の時計)**です。当月で埋めたときは stderr でそう言います。表は月ごとの値を `YYYY-MM` 列に並べ、値は画面と同じくサーバの集計のままです(内訳は `--output json`)
786
+ - `--project` を省いたとき、稼働分析・プロジェクトアサインは全プロジェクトを集計します(既定のプロジェクトで絞りません)。健全性の `history` / `insights` は1プロジェクトが対象なので既定のプロジェクト(`TWP_PROJECT` 等)を使います
787
+ - `--from` / `--to` の形式は、稼働分析・アサイン分析が年月(`YYYY-MM`)、健全性の `history` と工数が日付(`YYYY-MM-DD`)です
788
+ - 稼働分析の絞り込みは軸ごとに効くものが違います(`--scope project` は `--project`、`--scope user` は `--user` / `--department`)。効かない組み合わせは送らずに止めます
789
+ - 分析の 403 は「分析の権限が無い」「そのページの閲覧対象に入っていない」「ページが要る機能(勤怠・プロジェクト・人事管理)の権限が無い」を分けて案内します
790
+ - `project-health insights` は呼ぶたびにサーバが AI で所見を作り、テナントの AI クレジットを消費するので `--yes` が要ります
791
+ - `project manhours`(プロジェクト管理者)と `task manhours` は、期間を省くと今月です(テナントの業務日の区切りでサーバが決めます)。応答にユーザー名は無いので、`user_id` は `twp project members` と突き合わせてください
792
+ - 標準勤務時間の変更・負荷判定の再実行・ページの閲覧対象の設定は CLI では行えません(画面か `twp api` を使ってください)
793
+
794
+ ### 予実を見る・目標を入れる
795
+
796
+ ```bash
797
+ twp budget dashboard [--year <YYYY>] [--start-month <月>] [--reliability <確度>]...
798
+ twp budget summary [--year <YYYY>] [--start-month <月>] [--department <部署>]
799
+ twp budget breakdown [--department <部署>] [--axis project|estimate_user|reliability|estimate] [--year <YYYY>] [--start-month <月>] [--reliability <確度>]...
800
+ twp budget unassigned [--year <YYYY>] [--start-month <月>] [--reliability <確度>]...
801
+ twp budget export --out <パス.csv> [--force] [--year <YYYY>] [--start-month <月>]
802
+ twp budget target list [--year <YYYY>] [--department <部署>]
803
+ twp budget target set --year <YYYY> --file <JSON> --yes
804
+ twp budget target copy-previous-year --year <YYYY> [--department <部署>] --yes
805
+ twp budget target import-template --out <パス.csv> [--force] [--year <YYYY>] [--start-month <月>]
806
+ twp budget target import --year <YYYY> --file <CSV> --yes
807
+ twp budget allocation list [--project <コード>]
808
+ twp budget allocation set [--project <コード>] (--split <部署>=<比率>% | --split <部署>=<金額>)... --yes
809
+ twp budget allocation set [--project <コード>] --clear --yes
810
+ ```
811
+
812
+ - 値は画面と同じくサーバの集計のままです(全社合計・部署の巻き上げを CLI で計算し直しません)。月ごとの値は `--output json` で読めます
813
+ - `--year` を省くと**サーバの今年(暦年)**の年度です。4月始まりのテナントで1〜3月に省くと翌年度になるので、省いたときは stderr でそう言います
814
+ - 目標の書き込み(`target set` / `copy-previous-year` / `import`)は同じ部署・月の既存の目標を上書きし、元に戻せません(目標を消す操作はありません)。送る前に今の値を読み、`set` と `copy-previous-year` は上書きされる件数と前後の値を、`import` はその年度の既存の目標の件数を出します(`--dry-run` でも出ます)
815
+ - `--reliability` は見積の確度コード(`60` など)です。サーバが知らない確度は使われず、そのときは stderr でそう言います
816
+ - `target set --file` の JSON は `[{"department": "開発部", "month": 4, "sales_target": 1000000, "profit_target": 200000}]` の形です。誤りは全部挙げて1件も送りません
817
+ - `target import` は雛形(`import-template`)の形の CSV を取り込みます。1行でも誤りがあればサーバが1件も書かず、行ごとの理由をすべて出して終了コード 3 です
818
+ - `allocation set` は按分を**全件置き換え**ます(指定しなかった部署の按分は消えます)。`--clear` で按分をすべて消します。送る前に置換前と置換後の按分を出します。比率の合計(100%)はサーバも CLI も検査しないので、自分で確かめてください
819
+
744
820
  ### ワークフロー(申請)を見る・出す・承認する
745
821
 
746
822
  ```bash
@@ -865,12 +941,17 @@ twp backlog issue update <課題キー> [--assignee <名前|ID>] [--status <
865
941
 
866
942
  ### Microsoft 365(Outlook・Teams・OneDrive)を読む
867
943
 
868
- TWP に Microsoft アカウントでログインしたことがあるユーザーは、自分のメール・予定・Teams・OneDrive を読めます(書き込みは今後追加します)。
944
+ TWP に Microsoft アカウントでログインしたことがあるユーザーは、自分のメール・予定・Teams・OneDrive を読めます。メールは送信・返信・転送もできます(Teams・OneDrive・予定の書き込みは今後追加します)。
869
945
 
870
946
  ```
871
947
  twp outlook mail list [--folder <名前|ID>] [--unread] [--search <語>] [--filter <OData>] [--orderby <OData>]
872
948
  [--select <項目>] [--limit <件数>] [--all]
873
949
  twp outlook mail get <メールID>
950
+ twp outlook mail send --to <アドレス> [--to …] [--cc <アドレス> …] --subject <件名> (--body-file <パス> | --body <文字列>)
951
+ [--html] [--attach <パス> …] --yes
952
+ twp outlook mail reply <メールID> (--body-file <パス> | --body <文字列>) [--html] --yes # 差出人へ
953
+ twp outlook mail reply-all <メールID> (--body-file <パス> | --body <文字列>) [--html] --yes # 差出人と To・Cc の全員へ
954
+ twp outlook mail forward <メールID> --to <アドレス> [--to …] [--body-file <パス> | --body <文字列>] [--html] --yes
874
955
  twp outlook attachment list <メールID> # id / name / size
875
956
  twp outlook attachment download <メールID> <添付ID> --out <パス>
876
957
  twp outlook event list [--from <yyyy-MM-dd>] [--to <yyyy-MM-dd>] [--filter <OData>] [--orderby <OData>]
@@ -899,6 +980,11 @@ twp onedrive item download <項目ID> --out <パス> [--drive <ID>]
899
980
  - `twp outlook mail list` の `--search` は `--filter` / `--unread` / `--orderby` と併用できません(Microsoft 365 が受け付けないため、送る前に止めます)。検索語に `"` は使えません
900
981
  - `twp outlook attachment list` の `type` が `fileAttachment` の添付だけ実体をダウンロードできます(添付されたメール・予定やリンクの添付は 0 バイトになり、そのことを表示します)
901
982
  - `twp outlook event list` の `--from` / `--to` は日本時間の日付です。⚠ **繰り返しの予定は系列の1件として返り、各回には展開されません**(系列の開始日時で絞るため、`--from` より前に始まった繰り返し予定は出ません)
983
+ - ⚠ **メールの送信・返信・全員返信・転送は、実行した瞬間に相手へ届き取り消せません。** `--yes` が無ければ実行しません。`--dry-run` で宛先・件名・本文・添付の名前と大きさを確かめてから `--yes` を付けてください。返信・全員返信は、届く相手の目安を元のメールから読んで送る前に表示します
984
+ - 宛先は `--to` / `--cc` にメールアドレスで指定します(名前からは探しません。複数ならフラグを繰り返します)。**Bcc は指定できません**。返信・転送では Cc・添付を足せません(Microsoft 365 の中継が受け付けないため)
985
+ - 本文は既定でテキストとして送ります。返信・転送の本文は Microsoft 365 が HTML として読むので、改行と記号が見たとおりに届くよう HTML に直して送ります。`--html` を付けると HTML のまま送ります
986
+ - 添付(`--attach`)は合計 3MB までです(Microsoft 365 がメールに直接載せられる上限)
987
+ - 送信に失敗して終了コード 4 になっても、送信済みのことがあります。打ち直す前に `twp outlook mail list --folder sentitems` で確かめてください
902
988
  - `twp teams message list` のチャネルで返るのはスレッドの最初の投稿だけです。返信は `twp teams reply list <投稿ID>` で読みます
903
989
  - `twp onedrive` の `--drive` を省くと自分の OneDrive が対象です(そのことを表示します)。Teams のチャネルのファイルは `twp teams channel folder` の `driveId` を `--drive` に渡します
904
990
  - ダウンロードは **`--out` のパスへ実体をそのまま書き出し**、既存ファイルは `--force` を付けたときだけ上書きします。添付・ファイルの名前から書き出し先を組み立てることはしません
@@ -1292,6 +1378,6 @@ twp task-loop skill pull --project <キー|UUID> --all # サーバの全件
1292
1378
 
1293
1379
  本ソフトウェアは TWP の利用契約を結んでいるテナントの利用者に対してのみ利用を許諾しています。詳細はパッケージに同梱の `LICENSE` をご確認ください。
1294
1380
 
1295
- - ドキュメント: <https://docs.tocca.systems/>
1381
+ - ドキュメント: <https://docs.tocca.systems/cli>
1296
1382
  - お問い合わせ・不具合のご報告: TWP の[サポート](https://app.tocca.systems/v1/support)からご連絡ください(ログインが必要です)
1297
1383
  - 変更履歴: パッケージに同梱の `CHANGELOG.public.md`
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{stepToItem}from"./chunk-L25UV7DE.js";import"./chunk-G2THOTBW.js";import{loadLocalConfig}from"./chunk-QVPU4HHG.js";import"./chunk-N2UVRM3Z.js";import{loadAiConfig}from"./chunk-AEJHDFXB.js";import"./chunk-GY7KI5E5.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-IOGMOXYF.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-LXIAOCUW.js";import{acknowledgement,
3
+ import{stepToItem}from"./chunk-L25UV7DE.js";import{loadLocalConfig}from"./chunk-QVPU4HHG.js";import"./chunk-N2UVRM3Z.js";import{loadAiConfig}from"./chunk-AEJHDFXB.js";import"./chunk-G2THOTBW.js";import"./chunk-GY7KI5E5.js";import"./chunk-II5RVJQN.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-IOGMOXYF.js";import{requireResolved,singleRef,withResolved}from"./chunk-LXIAOCUW.js";import{acknowledgement,
4
4
  isRecord,pick}from"./chunk-VTQAI52S.js";import{ApiResponseError,UsageError}from"./chunk-UFND7FBC.js";import"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30EB\u30FC\u30D7\u306E\u30A2\u30A4\u30C6\u30E0";var STATUSES=["pending","processing","completed","failed"];var AI_TYPES=["claude","gemini","codex","copilot"];var EFFORTS=["low","medium","high","xhigh","max"];var PRIORITIES=["P0","P1","P2","P3"];var LIST_COLUMNS=["item_id","status","task_key","label","ai_type","ai_effort","runner_id","created_at"];var GET_COLUMNS=["item_id","status","task_key","label","prompt","ai_type","ai_model","ai_effort","runn\
5
5
  er_id","attempt_count","reclaim_count","error_message","created_by_name","created_at","started_at","completed_at"];var HISTORY_COLUMNS=["item_id","status","task_key","skill","ai_type","runner_id","duration_ms","cost_usd","created_at"];var PROJECT_FLAG={name:"--project",summary:"\u30AD\u30E5\u30FC\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\uFF08\u30B3\u30FC\u30C9\u307E\u305F\u306F ID\u3002\u7701\u7565\u6642\u306F TWP_PROJECT / .twp/config.json / ~/.twp/config.json\uFF09",takesValue:true,placeholder:"\
6
6
  <\u30B3\u30FC\u30C9|ID>"};var ITEM_FLAG={name:"--item",summary:"\u30A2\u30A4\u30C6\u30E0\u306E ID\uFF08item_id\uFF09\u3002\u4F4D\u7F6E\u5F15\u6570\u3068\u540C\u3058\u610F\u5473\uFF08\u4E21\u65B9\u6307\u5B9A\u306F\u30A8\u30E9\u30FC\uFF09",takesValue:true,placeholder:"<\u30A2\u30A4\u30C6\u30E0ID>"};var FORBIDDEN_CORE="\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\uFF08admin \u30ED\u30FC\u30EB\uFF09\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\uFF08\u500B\u4EBA\u30AD\u30E5\u30FC\u3092\u9664\u304F\uFF09";
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-AITUMFCH.js";import"./chunk-H3WYVFTS.js";import{detectAiClis}from"./chunk-T4QZO6RQ.js";import"./chunk-AJO4O5ZF.js";import"./chunk-VRBI2NPI.js";import"./chunk-G2THOTBW.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";
4
- import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-AEJHDFXB.js";import"./chunk-GY7KI5E5.js";import"./chunk-UFND7FBC.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{detectAiClis}from"./chunk-T4QZO6RQ.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-AITUMFCH.js";import"./chunk-H3WYVFTS.js";import"./chunk-AJO4O5ZF.js";import"./chunk-VRBI2NPI.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{DEFAULT_CLAUDE_LAUNCHER,
4
+ activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-AEJHDFXB.js";import"./chunk-G2THOTBW.js";import"./chunk-GY7KI5E5.js";import"./chunk-UFND7FBC.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";import{spawnSync}from"child_process";import fs2 from"fs";import path2 from"path";import{spawn}from"child_process";import fs from"fs";import path from"path";var FINAL_REPORT_BEGIN="<<<AI_FINAL_REPORT>>>";var FINAL_REPORT_END="<<<END_AI_FINAL_REPORT>>>";var ClaudeStreamRenderer=class{constructor(now=()=>new Date){this.now=now}now;toolNames=new Map;toolCount=0;result={subtype:null,isError:null,numTurns:null,costUsd:null,durationMs:null,tokensIn:null,tokensOut:null,rateLimited:false,resetsAt:null,finalText:""};push(line){const trimmed=line.trim();if(trimmed==="")return[];let event;try{const parsed=JSON.parse(trimmed);if(parsed===null||typeof parsed!=="\
5
5
  object"||Array.isArray(parsed)){return[line]}event=parsed}catch{return[line]}switch(event["type"]){case"rate_limit_event":return this.onRateLimit(event);case"assistant":return this.onAssistant(event);case"user":return this.onUser(event);case"result":return this.onResult(event);default:return event["type"]==="system"?[]:[line]}}sawRateLimit(){return this.result.rateLimited}lastRateLimitNote="";onRateLimit(event){const info=event["rate_limit_info"];if(info===null||typeof info!=="object")return[];const rec=info;
6
6
  const status=typeof rec["status"]==="string"?rec["status"]:"";const resets=typeof rec["resetsAt"]==="number"?rec["resetsAt"]:null;if(status==="")return[];const at=isSaneEpochSec(resets)?` resets=${new Date(resets*1e3).toISOString()}`:"";if(status.startsWith("allowed")){if(status==="allowed")return[];const seen=`${status}|${resets??""}`;if(seen===this.lastRateLimitNote)return[];this.lastRateLimitNote=seen;return[this.line(`\u2139\uFE0F \u4E0A\u9650\u306B\u63A5\u8FD1\uFF08status=${status}${at}\uFF09\u2014 \u5B9F\
7
7
  \u884C\u306F\u7D99\u7D9A\u3057\u307E\u3059`)]}if(resets!==null)this.result.resetsAt=resets;this.result.rateLimited=true;return[this.line(`\u26A0\uFE0F \u30EC\u30FC\u30C8\u30EA\u30DF\u30C3\u30C8\u901A\u77E5: status=${status}${at}`)]}onAssistant(event){const out=[];for(const block of contentBlocks(event)){if(block.type==="tool_use"){const name=typeof block.name==="string"?block.name:"tool";if(typeof block.id==="string")this.toolNames.set(block.id,name);this.toolCount+=1;out.push(this.line(`>> ${name}${toolDetail(
@@ -0,0 +1,3 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,analysisDomain,analysisForbidden,currentMonth,manhourNotes,manhourQuery,manhourRows,monthsBetween,workloadDistributionNotes,workloadDistributionRows}from"./chunk-E7MUDY4P.js";import"./chunk-YLXW7TIU.js";import"./chunk-4B3T4UE7.js";import"./chunk-F7K37QG6.js";import"./chunk-QQRJLH6B.js";import"./chunk-LXIAOCUW.js";import"./chunk-VTQAI52S.js";import"./chunk-UFND7FBC.js";import"./chunk-VSJBJXZO.js";export{MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,analysisDomain,analysisForbidden,currentMonth,manhourNotes,manhourQuery,manhourRows,monthsBetween,workloadDistributionNotes,workloadDistributionRows};
@@ -1,9 +1,9 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-HBYFCYWA.js";import"./chunk-TDU6U5PY.js";import{evaluateQuery}from"./chunk-ATYA6DG5.js";import{renderOutput}from"./chunk-OUP3JLVH.js";import{redactSecretValues,withDebug}from"./chunk-O5AUX7AQ.js";import{readBody}from"./chunk-ORUDW52G.js";
4
- import{parseOperationArgs,repeatedValues}from"./chunk-F7K37QG6.js";import"./chunk-YQ4DGLD3.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-IF2K4PM5.js";import"./chunk-3HH5IYNO.js";import"./chunk-GMBJTG6A.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-YLM54X35.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-4VZKNEVN.js";
5
- import{HELP_TOKEN}from"./chunk-YO2RNKCQ.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-IOGMOXYF.js";import"./chunk-II5RVJQN.js";import"./chunk-VTQAI52S.js";import{ApiRejectedError,ApiResponseError,EXIT_OK,
6
- EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-UFND7FBC.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
3
+ import{CommandModelMissingError,MAX_REPORTED_VIOLATIONS,loadCommandModelDomain,loadCommandModelRoutes,validateBody,validateQuery}from"./chunk-NZ7WI4RZ.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-EM3SDCCU.js";import"./chunk-C2MQANJO.js";import{evaluateQuery}from"./chunk-ATYA6DG5.js";import{renderOutput}from"./chunk-Y4SREWAG.js";import{redactSecretValues,redactSecrets,withDebug}from"./chunk-IOCNJMVW.js";import"./chunk-Q3B65OFC.js";
4
+ import{readBody}from"./chunk-ORUDW52G.js";import"./chunk-D5FEOBB6.js";import"./chunk-GMBJTG6A.js";import"./chunk-3HH5IYNO.js";import{parseOperationArgs,repeatedValues}from"./chunk-F7K37QG6.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-IF2K4PM5.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-YLM54X35.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{effectiveApiUrl,resolveConfiguredOutput,
5
+ resolveProfile}from"./chunk-4VZKNEVN.js";import{HELP_TOKEN}from"./chunk-Y5EN7RYN.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import"./chunk-II5RVJQN.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-IOGMOXYF.js";import"./chunk-VTQAI52S.js";
6
+ import{ApiRejectedError,ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-UFND7FBC.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MIN_SEGMENT_CHARS=3;var parsedCache=new WeakMap;function splitSegments(path){return path.split("/").filter(segment=>segment!=="")}function parseRoutes(routes){const cached=parsedCache.get(routes);if(cached!==void 0)return cached;const parsed=[];for(const[key,domain]of Object.entries(routes.routes)){const space=key.indexOf(" ");if(space<=0)continue;const template=key.slice(space+1);parsed.push({method:key.slice(0,space),template,domain,segments:splitSegments(template).map(segment=>/^\{[^/{}]+\}$/.
7
7
  test(segment)?null:segment)})}parsedCache.set(routes,parsed);return parsed}function matches(route,segments){if(route.segments.length!==segments.length)return false;return route.segments.every((literal,i)=>literal===null||literal===segments[i])}function compareSpecificity(a,b){const literals=route=>route.segments.filter(segment=>segment!==null).length;const diff=literals(b)-literals(a);if(diff!==0)return diff;for(let i=0;i<a.segments.length;i+=1){const aLiteral=a.segments[i]!==null;const bLiteral=b.
8
8
  segments[i]!==null;if(aLiteral!==bLiteral)return aLiteral?-1:1}return 0}function lookupRoute(routes,method,path){const segments=splitSegments(path);const hits=parseRoutes(routes).filter(route=>matches(route,segments));const sameMethod=hits.filter(route=>route.method===method).sort(compareSpecificity);const best=sameMethod[0];if(best!==void 0)return{kind:"matched",domain:best.domain,template:best.template};if(hits.length>0){const[top]=[...hits].sort(compareSpecificity);const template=top.template;
9
9
  const methods=[...new Set(hits.filter(route=>route.template===template).map(route=>route.method))].sort();return{kind:"method-mismatch",template,methods}}return{kind:"unknown"}}function pickOperation(operations,method,template){return operations.find(op=>op.method===method&&op.path===template)??null}async function suggestRoutes(routes,path,limit=5){const{default:fuzzysort}=await import("./fuzzysort-DFVKV4B4.js");const parsed=parseRoutes(routes);const templates=[...new Set(parsed.map(route=>route.
@@ -93,8 +93,9 @@ intervalSeconds}}function seconds(flag,raw,fallback,min,max){if(raw===void 0)ret
93
93
  meout"?`\u4E0A\u9650 ${MAX_WAIT_TIMEOUT_SECONDS} \u79D2\u306F AI CLI \u306E Bash \u30C4\u30FC\u30EB\u306E\u4E0A\u9650\uFF08600\u79D2\uFF09\u306B\u53CE\u3081\u308B\u305F\u3081\u3067\u3059\u3002\u9577\u3044\u51E6\u7406\u306F\u9593\u3092\u7F6E\u3044\u3066\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`:void 0)}return value}function readWaitStatus(body){const status=pickStatus(body);if(status===void 0){throw new UsageError("--wait \u306F status \u3092\u8FD4\u3059\u5FDC\u7B54\u306B\u3057\u304B\u4F7F\u3048\u307E\u305B\u3093\uFF08\u5FDC\u7B54\u306B data.status / status \u304C\u3042\u308A\u307E\u305B\u3093\uFF09",
94
94
  "\u975E\u540C\u671F\u51E6\u7406\u306E\u72B6\u614B\u306E\u30D1\u30B9\uFF08\u4F8B: /v2/media/files/generate/video/<task_id>\uFF09\u306B\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002")}if(status===TERMINAL_OK)return{kind:"completed",status};if(TERMINAL_FAILED.includes(status))return{kind:"failed",status};if(PENDING_STATUSES.includes(status))return{kind:"pending",status};throw new ApiResponseError(`--wait \u304C\u77E5\u3089\u306A\u3044 status \u3067\u3059: ${status}\uFF08\u5F85\u3064\u306E\u306F ${PENDING_STATUSES.
95
95
  join(" / ")}\u3001\u7D42\u308F\u308A\u306F ${[TERMINAL_OK,...TERMINAL_FAILED].join(" / ")}\uFF09`)}function pickStatus(body){if(!isRecord(body))return void 0;const data=body["data"];if(isRecord(data)&&typeof data["status"]==="string")return data["status"];if(typeof body["status"]==="string")return body["status"];return void 0}function isRecord(value){return value!==null&&typeof value==="object"&&!Array.isArray(value)}async function waitUntilTerminal(firstBody,options,deps){const startedAt=deps.startedAt??
96
- deps.now();const deadline=startedAt+options.timeoutSeconds*1e3;let body=firstBody;let state=readWaitStatus(body);let polls=1;while(state.kind==="pending"){if(deps.now()+options.intervalSeconds*1e3>deadline){return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:true}}await deps.sleep(options.intervalSeconds*1e3);let next;try{next=await deps.fetchAgain()}catch(pollError){return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:false,pollError}}body=next;
97
- state=readWaitStatus(body);polls+=1}return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:false}}function elapsed(now,startedAt){return Math.round((now-startedAt)/1e3)}function describeWaitResult(result){const head=`\u5F85\u6A5F: ${result.polls} \u56DE\u53D6\u5F97\u30FB${result.elapsedSeconds} \u79D2`;if(result.pollError!==void 0){const reason=result.pollError instanceof Error?result.pollError.message:String(result.pollError);return{note:`${head}\u3002\u53D6\u308A\u76F4\u3057\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\uFF08${reason}\
96
+ deps.now();const deadline=startedAt+options.timeoutSeconds*1e3;let body=firstBody;let state=readWaitStatus(body);let polls=1;while(state.kind==="pending"){if(deps.now()+options.intervalSeconds*1e3>deadline){return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:true}}await deps.sleep(options.intervalSeconds*1e3);let next;try{next=await deps.fetchAgain()}catch(pollError){return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:false,pollError}}let nextState;
97
+ try{nextState=readWaitStatus(next)}catch(statusError){const pollError=statusError instanceof UsageError?new ApiResponseError("\u53D6\u308A\u76F4\u3057\u305F\u5FDC\u7B54\u306B status \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u6700\u521D\u306E\u5FDC\u7B54\u306B\u306F\u3042\u308A\u307E\u3057\u305F\uFF09"):statusError;return{body,state,polls,elapsedSeconds:elapsed(deps.now(),startedAt),timedOut:false,pollError}}body=next;state=nextState;polls+=1}return{body,state,polls,elapsedSeconds:elapsed(deps.now(),
98
+ startedAt),timedOut:false}}function elapsed(now,startedAt){return Math.round((now-startedAt)/1e3)}function describeWaitResult(result){const head=`\u5F85\u6A5F: ${result.polls} \u56DE\u53D6\u5F97\u30FB${result.elapsedSeconds} \u79D2`;if(result.pollError!==void 0){const reason=result.pollError instanceof Error?result.pollError.message:String(result.pollError);return{note:`${head}\u3002\u53D6\u308A\u76F4\u3057\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\uFF08${reason}\
98
99
  \uFF09\u3002\u6700\u5F8C\u306B\u53D6\u308C\u305F\u5FDC\u7B54\uFF08status=${result.state.status}\u30FB**\u672A\u5B8C\u4E86**\uFF09\u3092 stdout \u306B\u51FA\u3057\u3066\u3044\u307E\u3059\u3002\u51E6\u7406\u306F\u30B5\u30FC\u30D0\u3067\u7D9A\u3044\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308B\u306E\u3067\u3001\u958B\u59CB\u304B\u3089\u6253\u3061\u76F4\u3055\u305A\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`,error:result.pollError instanceof
99
100
  Error?result.pollError:new Error(reason)}}if(result.timedOut){return{note:`${head}\u3002\u6B21\u306E\u53D6\u5F97\u304C\u4E0A\u9650\u3092\u8D8A\u3048\u308B\u305F\u3081\u6253\u3061\u5207\u308A\u307E\u3057\u305F\u3002status=${result.state.status} \u306E\u307E\u307E**\u672A\u5B8C\u4E86**\u3067\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 6\uFF09\u3002\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3059\u3068\u7D9A\u304D\u3092\u5F85\u3066\u307E\u3059\u3002`,error:null}}if(result.state.kind===
100
101
  "failed"){return{note:`${head}\u3002status=${result.state.status} \u3067\u7D42\u308F\u308A\u307E\u3057\u305F\u3002`,error:new ApiRejectedError(`\u975E\u540C\u671F\u51E6\u7406\u304C ${result.state.status} \u3067\u7D42\u308F\u308A\u307E\u3057\u305F\uFF08\u5FDC\u7B54\u306F stdout \u306B\u51FA\u3057\u3066\u3044\u307E\u3059\uFF09`)}}return{note:`${head}\u3002status=${result.state.status} \u3067\u7D42\u308F\u308A\u307E\u3057\u305F\u3002`,error:null}}var writeOut=text=>void process.stdout.write(text);var writeErr=text=>void process.stderr.write(text);function line(text){return text===""?"":text.endsWith("\n")?text:`${text}
@@ -128,7 +129,7 @@ const plan={method,path,query,...body!==void 0?{body}:{}};const stored=loadCrede
128
129
  `);if(noValidate)writeErr("\u6CE8\u8A18: --no-validate \u306E\u305F\u3081\u9001\u4FE1\u524D\u306E\u30B9\u30AD\u30FC\u30DE\u691C\u8A3C\u3092\u884C\u3044\u307E\u305B\u3093\u3002\n");if(noRedact){writeErr(`${NO_REDACT_NOTICE}
129
130
  `)}if(globals.dryRun){writeOut(line(renderOutput(dryRunValue(apiUrl,plan),format,noRedact)));return EXIT_OK}const transport=options.fetchImpl??httpFetch;const fetchImpl=globals.debug?withDebug(transport):transport;const session=new AuthSession(profile.name,apiUrl,process.env,fetchImpl);const client=new TwpApiClient(apiUrl,session,fetchImpl,options.version);const send=async()=>{try{return await client.request(plan.method,appendQuery(plan.path,plan.query),plan.body)}catch(err){if(err instanceof ApiError||
130
131
  err instanceof NotLoggedInError||err instanceof SessionExpiredError)throw err;throw new NetworkError(`${apiUrl} \u3078\u306E\u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F: ${err.message}`,{cause:err})}};const waitStartedAt=(options.nowImpl??Date.now)();let responseBody=await send();if(wait!==null){const result=await waitUntilTerminal(responseBody,wait,{fetchAgain:send,sleep:options.sleepImpl??(ms=>new Promise(resolve=>setTimeout(resolve,ms))),now:options.nowImpl??Date.now,startedAt:waitStartedAt});
131
- const source2=noRedact?result.body:redactSecretValues(result.body);const unfinished=result.timedOut||result.pollError!==void 0;const value2=globals.query===void 0||unfinished?source2:await evaluateQuery(globals.query,source2);writeOut(line(renderOutput(value2,format,noRedact)));const outcome=describeWaitResult(result);writeErr(`${stripTerminalControls(outcome.note)}
132
+ const source2=noRedact?result.body:redactSecretValues(result.body);const unfinished=result.timedOut||result.pollError!==void 0;const value2=globals.query===void 0||unfinished?source2:await evaluateQuery(globals.query,source2);writeOut(line(renderOutput(value2,format,noRedact)));const outcome=describeWaitResult(result);writeErr(`${redactSecrets(stripTerminalControls(outcome.note))}
132
133
  `);if(unfinished&&globals.query!==void 0)writeErr("\u6CE8\u8A18: \u672A\u5B8C\u4E86\u306E\u305F\u3081 --query \u3092\u5F53\u3066\u305A\u3001\u5FDC\u7B54\u5168\u4F53\u3092\u51FA\u3057\u3066\u3044\u307E\u3059\u3002\n");if(outcome.error!==null)throw outcome.error;return result.timedOut?EXIT_WAIT_TIMEOUT:EXIT_OK}const pageNumbered=method==="GET"&&isPageNumberList(responseBody,paging.resultPath);const sentPage=pageNumberOf(paging.startingToken??plan.query[PAGE_NUMBER_PARAM]);const firstState=pageNumbered?
133
134
  readPageNumberState(responseBody,sentPage):null;if(paging.startingToken!==void 0&&firstState?.kind==="ignored"){throw new UsageError(`\u3053\u306E\u4E00\u89A7\u306F\u30DA\u30FC\u30B8\u756A\u53F7\u65B9\u5F0F\u306E\u305F\u3081 --starting-token \u306F\u52B9\u304D\u307E\u305B\u3093\uFF08cursor=${stripTerminalControls(paging.startingToken)} \u3092\u9001\u308A\u3001\u30DA\u30FC\u30B8 ${firstState.returned} \u304C\u8FD4\u308A\u307E\u3057\u305F\uFF09`,`\u30DA\u30FC\u30B8\u306F --query-param ${PAGE_NUMBER_PARAM}\
134
135
  =<\u30DA\u30FC\u30B8\u756A\u53F7> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}let paged;let pageNoIgnored;const mode=paging.resultPath===null?null:pagingMode(responseBody,{...paging,resultPath:paging.resultPath},firstState);if(mode!==null){const label=`${method} ${model.template??path}`;try{paged=await fetchAllPages({client,apiUrl,plan,paging:mode.kind==="page"?pageNumberApiPaging(label,mode.itemsKey,sentPage):envelopePaging({label,itemsKey:mode.itemsKey,cursorParam:CURSOR_PARAM}),
@@ -1,8 +1,8 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-XPYNN63B.js";import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";
4
- import"./chunk-NZ7WI4RZ.js";import"./chunk-O5AUX7AQ.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-YQ4DGLD3.js";import"./chunk-IF2K4PM5.js";import"./chunk-3HH5IYNO.js";import"./chunk-GMBJTG6A.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-6QOT7CHX.js";import"./chunk-D233KKXW.js";import"./chunk-XNLIEUAW.js";import{checkMinSupportedVersion,isBelowMinSupported,
5
- minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{parseArgv}from"./chunk-L35F47BO.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-NAUH75MM.js";import"./chunk-YO2RNKCQ.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import"./chunk-N2UVRM3Z.js";import"./chunk-II5RVJQN.js";import"./chunk-UFND7FBC.js";
3
+ import{RESIDENT_TOKEN_CAP,activateModeFiles,activatePermissionSettings,buildResidentSet,buildSystemPrompt,createAuditLogger,createTwpToolkit,currentBranch,describeAuditLog,describeToolCatalog,displayCwd,executeTool,findProjectTwpSubdir,localTools,lstatOrNull,parseFrontMatter,parseRule,persistProjectAllow,projectPermissionsPath,projectRootFor,readFileTool,residentInputs,resolveGitExecutable,runTurn,secretReason}from"./chunk-DVKPGJMS.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
+ diffStat}from"./chunk-VRBI2NPI.js";import"./chunk-IOCNJMVW.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-D5FEOBB6.js";import"./chunk-GMBJTG6A.js";import"./chunk-3HH5IYNO.js";import"./chunk-IF2K4PM5.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-6QOT7CHX.js";import"./chunk-D233KKXW.js";import"./chunk-XNLIEUAW.js";import{checkMinSupportedVersion,isBelowMinSupported,
5
+ minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{parseArgv}from"./chunk-4OSCQLZT.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-NAUH75MM.js";import"./chunk-Y5EN7RYN.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import"./chunk-N2UVRM3Z.js";import"./chunk-II5RVJQN.js";import"./chunk-UFND7FBC.js";
6
6
  import"./chunk-PMOUHEJQ.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{__commonJS,__export,__require,__toESM}from"./chunk-VSJBJXZO.js";var require_react_production=__commonJS({"node_modules/react/cjs/react.production.js"(exports){"use strict";var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element");var REACT_PORTAL_TYPE=Symbol.for("react.portal");var REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");var REACT_STRICT_MODE_TYPE=Symbol.for("react.strict_mode");var REACT_PROFILER_TYPE=Symbol.for("react.profiler");var REACT_CONSUMER_TYPE=Symbol.for("react.consumer");var REACT_CONTEXT_TYPE=Symbol.for("react.context");var REACT_FORWARD_REF_TYPE=Symbol.
7
7
  for("react.forward_ref");var REACT_SUSPENSE_TYPE=Symbol.for("react.suspense");var REACT_MEMO_TYPE=Symbol.for("react.memo");var REACT_LAZY_TYPE=Symbol.for("react.lazy");var REACT_ACTIVITY_TYPE=Symbol.for("react.activity");var REACT_VIEW_TRANSITION_TYPE=Symbol.for("react.view_transition");var MAYBE_ITERATOR_SYMBOL=Symbol.iterator;function getIteratorFn(maybeIterable){if(null===maybeIterable||"object"!==typeof maybeIterable)return null;maybeIterable=MAYBE_ITERATOR_SYMBOL&&maybeIterable[MAYBE_ITERATOR_SYMBOL]||
8
8
  maybeIterable["@@iterator"];return"function"===typeof maybeIterable?maybeIterable:null}var ReactNoopUpdateQueue={isMounted:function(){return false},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};var assign=Object.assign;var emptyObject={};function Component(props,context,updater){this.props=props;this.context=context;this.refs=emptyObject;this.updater=updater||ReactNoopUpdateQueue}Component.prototype.isReactComponent={};Component.prototype.setState=
@@ -1212,7 +1212,7 @@ cwd()){const listed=await gitListFiles(cwd2);const raw=listed??await walkFiles(c
1212
1212
  1;const after=/^[^\s]*/.exec(text.slice(cursor))?.[0]??"";return{query,start,end:cursor+after.length}}var TWP_SLASH_ROUTES={"/tasks":{domain:"task",operation:"list"},"/task":{domain:"task",operation:"get"},"/projects":{domain:"project",operation:"list"}};function isTwpSlashCommand(name){return Object.hasOwn(TWP_SLASH_ROUTES,name)}async function runTwpSlashCommand(name,args,deps){const route=TWP_SLASH_ROUTES[name];if(!Object.hasOwn(TWP_SLASH_ROUTES,name)||route===void 0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u30B3\u30DE\u30F3\u30C9: ${name}
1213
1213
  `}}const parsed=parseArgv([route.domain,route.operation,...args]);if(parsed.command!=="domain"||parsed.domain!==route.domain){return{code:2,out:"",err:`${name}: \u3053\u306E\u5F15\u6570\u306F\u4F7F\u3048\u307E\u305B\u3093\uFF08${args.join(" ")}\uFF09
1214
1214
  `}}if(parsed.unknown.length>0){return{code:2,out:"",err:`\u4E0D\u660E\u306A\u5F15\u6570: ${parsed.unknown.join(" ")}
1215
- `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-SRTDTEKL.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1215
+ `}}let out="";let err="";const io={out:text=>void(out+=text),err:text=>void(err+=text),isTty:true};const globals={profile:parsed.profile??deps.profile,...parsed.output!==void 0?{output:parsed.output}:{},...parsed.query!==void 0?{query:parsed.query}:{},dryRun:parsed.dryRun,debug:parsed.debug,yes:parsed.yes,refresh:parsed.refresh};const{runDomain}=await import("./run-NVS532DL.js");try{const code=await runDomain({domain:route.domain,...parsed.operation!==void 0?{operation:parsed.operation}:
1216
1216
  {},argv:parsed.domainArgv,help:parsed.domainHelp,globals,version:deps.version,io,...deps.fetchImpl!==void 0?{fetchImpl:deps.fetchImpl}:{}});return{code,out,err}}catch(e){return{code:1,out,err:`${err}${e.message}
1217
1217
  `}}}var GIT_LOG_OUTPUT=["9f3c1a2 feat(ui): \u4E00\u89A7\u306E\u30D5\u30A3\u30EB\u30BF\u3092 URL \u30AF\u30A8\u30EA\u3068\u540C\u671F\u3059\u308B","4b8e0d7 fix(ui): \u4EEE\u60F3\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u884C\u9AD8\u3055\u3092\u5B9F\u6E2C\u5024\u306B\u5408\u308F\u305B\u308B","c15a99e refactor(api): \u4E00\u89A7\u53D6\u5F97\u306E\u30DA\u30FC\u30B8\u30F3\u30B0\u51E6\u7406\u3092\u5171\u901A\u5316\u3059\u308B","2d70f4b test: \u4E00\u89A7\u30D5\u30A3\u30EB\u30BF\u306E\u56DE\u5E30\u30C6\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
1218
1218
  "a6e2b38 fix(api): \u7A7A\u306E\u691C\u7D22\u6761\u4EF6\u3067\u5168\u4EF6\u8FD4\u3089\u306A\u3044\u3088\u3046\u306B\u3059\u308B","7c40d51 chore(deps): \u958B\u767A\u4F9D\u5B58\u3092\u6700\u65B0\u3078\u66F4\u65B0\u3059\u308B","e83b1c6 docs: \u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u624B\u9806\u306B Node 22 \u306E\u524D\u63D0\u3092\u8FFD\u8A18\u3059\u308B","b91f7a4 fix(ui): \u30E2\u30FC\u30C0\u30EB\u306E\u91CD\u306A\u308A\u9806\u3092\u6307\u5B9A\u3059\u308B","5a2c8e0 perf(api): \u4E00\u89A7\u306E N+1 \u3092\u89E3\u6D88\u3059\u308B",
@@ -1246,7 +1246,7 @@ spec);const choose=index=>{const item=items[index];if(item===void 0)return{state
1246
1246
  state:{...state,selected:Math.min(items.length-1,state.selected+1)}};if(ev.name==="enter")return choose(state.selected);if(ev.name==="escape"){return state.stage==="scope"?{state:{...state,stage:"choose",selected:indexOf(topItems(spec),"always")}}:{answer:"no"}}if(ev.name==="char"&&ev.value&&/^[1-9]$/.test(ev.value)){const index=Number(ev.value)-1;return index<items.length?choose(index):{state}}return{state}}function indexOf(items,key){return Math.max(0,items.findIndex(i=>i.key===key))}import{readFileSync as readFileSync2}from"fs";import{homedir,userInfo}from"os";import{join}from"path";function displayName(){const fromEnv=process.env["GIT_AUTHOR_NAME"]??process.env["GIT_COMMITTER_NAME"];if(fromEnv)return fromEnv;const fromGitConfig=readGitUserName(join(homedir(),".gitconfig"));if(fromGitConfig)return fromGitConfig;try{return userInfo().username}catch{return"there"}}function readGitUserName(path3){let text;try{text=readFileSync2(path3,"utf8")}catch{return null}let inUser=false;
1247
1247
  for(const raw of text.split("\n")){const line=raw.trim();if(line.startsWith("[")){inUser=line.startsWith("[user");continue}if(!inUser)continue;const m=/^name\s*=\s*(.+)$/.exec(line);if(m?.[1])return m[1].trim()}return null}var LOGO=["\u2580\u2588\u2580 \u2584 \u2584 \u2588\u2580\u2580\u2584"," \u2588 \u2588\u2584\u2588\u2584\u2588 \u2588\u2580\u2580\u2598"," \u2588 \u2580 \u2580 \u2588 "];function buildBanner(opts){const cwd2=displayCwd();return{title:`twp-cli v${opts.version}`,welcome:`Welcome back ${displayName()}!`,logo:LOGO,meta:[`${modelLabel(opts.model)} \xB7 Tocca Systems`,opts.branch?`${cwd2} \u2387 ${opts.branch}`:cwd2],sections:[{heading:"\u306F\u3058\u3081\u304B\u305F",lines:["/help \u3067\u30B3\u30DE\u30F3\u30C9\u4E00\u89A7\u3001/de\
1248
1248
  mo \u3067\u4E00\u9023\u306E\u6D41\u308C\u3092\u518D\u751F","Shift+Tab\uFF08\u52B9\u304B\u306A\u3044\u7AEF\u672B\u306F Alt+M\uFF09\u3067\u30E2\u30FC\u30C9\u3092\u5DE1\u56DE","/model \u3067\u30E2\u30C7\u30EB\u5207\u66FF\uFF08\u30E2\u30FC\u30C9\u3068\u306F\u72EC\u7ACB\uFF09","/doctor \u3067\u7AEF\u672B\u306E\u30AD\u30FC\u5165\u529B\u3092\u5B9F\u6E2C"]},{heading:"\u3053\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306B\u3064\u3044\u3066",lines:["\u4F1A\u8A71\u3068\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\u306F\u5B9F\u7269\u3067\u3059\uFF08\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u8AB2\u91D1\u3055\u308C\u307E\u3059\uFF09",
1249
- `\u30B9\u30E9\u30C3\u30B7\u30E5\u30B3\u30DE\u30F3\u30C9${COMMANDS.length}\u672C / \u4F1A\u8A71\u4E2D\u306E AI \u304B\u3089 TWP \u3092\u64CD\u4F5C\u3059\u308B\u6A5F\u80FD\u306F\u6E96\u5099\u4E2D`,"\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8: https://docs.tocca.systems/"]}],width:opts.width}}var import_react35=__toESM(require_react(),1);var FLUSH_INTERVAL_MS=33;var TOKEN_INTERVAL_MS=9;function tokenize2(text){return text.match(/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]{1,3}|[A-Za-z0-9_./-]+|\s|./gu)??[]}function useTokenStream(){const[text,setText]=(0,import_react35.useState)("");const[streaming,setStreaming]=(0,import_react35.useState)(false);const bufferRef=(0,import_react35.useRef)("");const timersRef=(0,import_react35.useRef)([]);const cancelRef=(0,import_react35.useRef)(
1249
+ `\u30B9\u30E9\u30C3\u30B7\u30E5\u30B3\u30DE\u30F3\u30C9${COMMANDS.length}\u672C / \u4F1A\u8A71\u4E2D\u306E AI \u3082 TWP \u3092\u8ABF\u3079\u3066\u4F7F\u3048\u307E\u3059`,"\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8: https://docs.tocca.systems/cli"]}],width:opts.width}}var import_react35=__toESM(require_react(),1);var FLUSH_INTERVAL_MS=33;var TOKEN_INTERVAL_MS=9;function tokenize2(text){return text.match(/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]{1,3}|[A-Za-z0-9_./-]+|\s|./gu)??[]}function useTokenStream(){const[text,setText]=(0,import_react35.useState)("");const[streaming,setStreaming]=(0,import_react35.useState)(false);const bufferRef=(0,import_react35.useRef)("");const timersRef=(0,import_react35.useRef)([]);const cancelRef=(0,import_react35.useRef)(
1250
1250
  null);const clearTimers=(0,import_react35.useCallback)(()=>{for(const t of timersRef.current)clearInterval(t);timersRef.current=[]},[]);const cancel=(0,import_react35.useCallback)(()=>{clearTimers();cancelRef.current?.();cancelRef.current=null;setStreaming(false)},[clearTimers]);const begin=(0,import_react35.useCallback)(()=>{clearTimers();bufferRef.current="";setText("");setStreaming(true);const flusher=setInterval(()=>setText(bufferRef.current),FLUSH_INTERVAL_MS);timersRef.current=[flusher]},[
1251
1251
  clearTimers]);const push2=(0,import_react35.useCallback)(chunk=>{bufferRef.current+=chunk},[]);const end=(0,import_react35.useCallback)(()=>{clearTimers();const full=bufferRef.current;setText(full);setStreaming(false);cancelRef.current=null;return full},[clearTimers]);const start=(0,import_react35.useCallback)(target=>new Promise(resolve=>{clearTimers();bufferRef.current="";setText("");setStreaming(true);const tokens=tokenize2(target);let i=0;let finished=false;const producer=setInterval(()=>{if(i>=
1252
1252
  tokens.length){finished=true;return}bufferRef.current+=tokens[i]??"";i+=1},TOKEN_INTERVAL_MS);const flusher=setInterval(()=>{setText(bufferRef.current);if(finished){clearTimers();setStreaming(false);cancelRef.current=null;resolve()}},FLUSH_INTERVAL_MS);timersRef.current=[producer,flusher];cancelRef.current=()=>resolve()}),[clearTimers]);const clear=(0,import_react35.useCallback)(()=>{clearTimers();bufferRef.current="";setText("");setStreaming(false)},[clearTimers]);(0,import_react35.useEffect)(()=>clearTimers,
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{readBody}from"./chunk-ORUDW52G.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-YQ4DGLD3.js";import"./chunk-IF2K4PM5.js";import"./chunk-3HH5IYNO.js";import"./chunk-GMBJTG6A.js";import"./chunk-4VZKNEVN.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-LXIAOCUW.js";import{isRecord,pick}from"./chunk-VTQAI52S.js";
3
+ import{readBody}from"./chunk-ORUDW52G.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-D5FEOBB6.js";import"./chunk-GMBJTG6A.js";import"./chunk-3HH5IYNO.js";import"./chunk-IF2K4PM5.js";import"./chunk-4VZKNEVN.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-LXIAOCUW.js";import{isRecord,pick}from"./chunk-VTQAI52S.js";
4
4
  import{ApiResponseError,UsageError}from"./chunk-UFND7FBC.js";import"./chunk-J7QYPKVK.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var DEFAULT_COUNT=20;var MAX_COUNT=100;var NUMERIC=/^[0-9]+$/;var ISSUE_REF=/^(?:[A-Za-z0-9_]+-[0-9]+|[0-9]+)$/;var DATE=/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;var SPACE_COLUMNS=["id","space_url"];var PROJECT_COLUMNS=["id","projectKey","name"];var ISSUE_LIST_COLUMNS=["issueKey","summary","status","assignee","priority","dueDate","updated","descriptionTruncated"];var ISSUE_GET_COLUMNS=["id","issueKey","projectId","summary","description","descriptionTruncated","status","issueType","priority","assignee","cr\
5
5
  eatedUser","parentIssueId","startDate","dueDate","estimatedHours","actualHours","created","updated"];var COMMENT_COLUMNS=["id","created","createdUserId","createdUser","content","changeLog"];function commentRow(row){const source=isRecord(row)?row:{};const user=isRecord(source["createdUser"])?source["createdUser"]:{};return pick({...source,createdUserId:user["id"]??null,createdUser:user["name"]??null},COMMENT_COLUMNS)}var ATTACHMENT_COLUMNS=["id","name","size","contentType","createdUserId","create\
6
6
  dUser","created"];var STATUS_COLUMNS=["id","name","color"];var USER_COLUMNS=["id","userId","name","mailAddress","roleType"];var SPACE_FLAG={name:"--space",summary:"Backlog \u30B9\u30DA\u30FC\u30B9\uFF08ID / \u30B9\u30DA\u30FC\u30B9URL / \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\uFF09\u3002\u767B\u9332\u304C1\u4EF6\u306A\u3089\u7701\u7565\u3067\u304D\u307E\u3059",takesValue:true,placeholder:"<ID|URL>"};var BODY_MAX_CHARS=1e5;var BODY_FLAGS=[{name:"--body-file",summary:"\u672C\u6587\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u8AAD\u3080\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09\u3002\u6539\u884C\u30FBMarkdown\