@tocca-systems/twp-cli 0.63.0 → 0.65.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 (98) hide show
  1. package/CHANGELOG.public.md +16 -0
  2. package/README.md +90 -4
  3. package/dist/{agent-TLKSUAYA.js → agent-HM4FHCJT.js} +1 -1
  4. package/dist/{agent-loop-6FS7FFXY.js → agent-loop-VC47FGPR.js} +2 -2
  5. package/dist/{ai-dispatch-HRXPRWCT.js → ai-dispatch-GN5ZQPHC.js} +2 -2
  6. package/dist/analysis-NEZXCJGT.js +5 -0
  7. package/dist/{announcement-LNG32J6X.js → announcement-BEPIDOMO.js} +1 -1
  8. package/dist/{api-command-SFJFE2PE.js → api-command-HP3ABNDG.js} +4 -4
  9. package/dist/{app-N2ZLD6HG.js → app-C4TUNEAO.js} +4 -4
  10. package/dist/{attendance-correct-3C2BHJQG.js → attendance-correct-ZEWRXHUU.js} +2 -2
  11. package/dist/{attendance-lists-VMOIE3XO.js → attendance-lists-BXAHFZYY.js} +2 -2
  12. package/dist/{backlog-D5LZIEN4.js → backlog-UD226SVD.js} +38 -28
  13. package/dist/{budget-RENLLCYQ.js → budget-6HOZNG3E.js} +2 -2
  14. package/dist/capacity-report-command-A6RYG2NV.js +15 -0
  15. package/dist/{chunk-UVCIVMT6.js → chunk-2G6ZZPME.js} +2 -2
  16. package/dist/{chunk-T5CRU4DB.js → chunk-5AQ2JPIS.js} +1 -1
  17. package/dist/{chunk-52V2AZ7D.js → chunk-AYE4DF6J.js} +1 -1
  18. package/dist/{chunk-EWRZ4GSN.js → chunk-BTN4M7Y5.js} +2 -2
  19. package/dist/{chunk-S5DEP2HA.js → chunk-BXTAAF5F.js} +1 -1
  20. package/dist/{chunk-2B7A3OY7.js → chunk-CGHGQAEM.js} +14 -52
  21. package/dist/{chunk-7LFYDASU.js → chunk-ENVASCZU.js} +2 -2
  22. package/dist/{chunk-PIB6MGG5.js → chunk-FAHDBWW2.js} +1 -1
  23. package/dist/{chunk-4PROMNXI.js → chunk-FBBKRVVS.js} +1 -1
  24. package/dist/{chunk-LMYOCAEY.js → chunk-FTAKYID7.js} +1 -1
  25. package/dist/{chunk-WBSAJ3P2.js → chunk-G26GIBRL.js} +1 -1
  26. package/dist/chunk-G4TZFGNN.js +41 -0
  27. package/dist/{chunk-EO3M43TN.js → chunk-G6RLNOIZ.js} +1 -1
  28. package/dist/{chunk-NXWXTUU6.js → chunk-RSATLT5H.js} +1 -1
  29. package/dist/{chunk-CSXCHRYE.js → chunk-SCU74Z4U.js} +16 -13
  30. package/dist/chunk-SPZ3GBYC.js +16 -0
  31. package/dist/{chunk-QEWCTKPV.js → chunk-UODNIEO2.js} +1 -1
  32. package/dist/chunk-UUP4X3WH.js +97 -0
  33. package/dist/{chunk-4ZREAAP4.js → chunk-WG6NCT4L.js} +18 -17
  34. package/dist/{chunk-T4YEQWJO.js → chunk-WHCMWXLC.js} +2 -2
  35. package/dist/{chunk-BZJJAJGN.js → chunk-XNOZJ6T2.js} +1 -1
  36. package/dist/{chunk-SLD6FCXA.js → chunk-Y2J4M2MG.js} +1 -1
  37. package/dist/chunk-YASL34FY.js +11 -0
  38. package/dist/chunk-YYURQG4E.js +4 -0
  39. package/dist/{chunk-HEQCEFAW.js → chunk-Z2I5BGXV.js} +1 -1
  40. package/dist/{chunk-E3KMIBSP.js → chunk-ZJW3GBE5.js} +57 -18
  41. package/dist/{chunk-MYWDL3WX.js → chunk-ZSPWHEBL.js} +44 -37
  42. package/dist/cli.js +82 -10
  43. package/dist/{commands-6QNMVCU3.js → commands-2FOGOL65.js} +97 -149
  44. package/dist/{commands-WIQVCMQE.js → commands-EK3EYLQH.js} +1 -1
  45. package/dist/{company-F3IGQMOJ.js → company-MUGKJNY3.js} +2 -2
  46. package/dist/{completion-MUSSUG6N.js → completion-DGPGHQNL.js} +4 -3
  47. package/dist/{contract-OWR27GIO.js → contract-DJJQBAWX.js} +2 -2
  48. package/dist/{department-3QDHMZ5P.js → department-RMZ72N6B.js} +1 -1
  49. package/dist/{deposit-IPYESXIQ.js → deposit-45Y3POXT.js} +1 -1
  50. package/dist/{estimate-4P67OZWB.js → estimate-HTAF6FZT.js} +3 -3
  51. package/dist/{evaluation-ZA23GR7P.js → evaluation-J634U7JQ.js} +1 -1
  52. package/dist/{expense-GEOAM7B3.js → expense-EVNQ653C.js} +1 -1
  53. package/dist/fiscal-year-MVOGDAIP.js +17 -0
  54. package/dist/{inquiry-3SCMJOEM.js → inquiry-XO5R47OO.js} +1 -1
  55. package/dist/{invoice-ONTG53HY.js → invoice-WE2SOMYN.js} +3 -3
  56. package/dist/{job-title-OQQH5W6C.js → job-title-3CGRQILF.js} +1 -1
  57. package/dist/{knowledge-IX7AZIBJ.js → knowledge-X3FGXIBL.js} +1 -1
  58. package/dist/{leave-7HMMZPCR.js → leave-IFYBLQBF.js} +3 -3
  59. package/dist/{logout-guard-GQBF3GQH.js → logout-guard-S2PVXK4V.js} +1 -1
  60. package/dist/{media-4RUOR6LY.js → media-X32Y2MOY.js} +3 -3
  61. package/dist/{notification-ZT23M4R6.js → notification-MHYSQKYZ.js} +1 -1
  62. package/dist/{oneshot-4NIS4J4S.js → oneshot-VL45DNR7.js} +1 -1
  63. package/dist/{outlook-AAS5DXYQ.js → outlook-YG7GFF44.js} +1 -1
  64. package/dist/{plan-submit-AWMD7XOY.js → plan-submit-CUVVYDTN.js} +2 -1
  65. package/dist/{position-HWBHYAD2.js → position-6UC7X2BJ.js} +1 -1
  66. package/dist/{project-3ROID2HA.js → project-LG47ZCEZ.js} +1 -1
  67. package/dist/{prospect-7B5UWFLH.js → prospect-FEU3WQYN.js} +2 -2
  68. package/dist/{purchase-QVINV4TM.js → purchase-44B2NOOB.js} +3 -3
  69. package/dist/{receivable-66MYAIVR.js → receivable-NQNZ2B6B.js} +1 -1
  70. package/dist/redmine-T3JDIH37.js +35 -0
  71. package/dist/{registry-4V3YNENU.js → registry-LBL4AOZW.js} +1 -1
  72. package/dist/{report-XFTM4GCX.js → report-GJK2YXVO.js} +1 -1
  73. package/dist/{run-J7ACNZ3D.js → run-RLV6W5JA.js} +2 -2
  74. package/dist/{sales-ai-review-IVRISSWX.js → sales-ai-review-PUJCOMP6.js} +1 -1
  75. package/dist/{sales-master-BGVF2AZL.js → sales-master-GRR4WKLO.js} +3 -3
  76. package/dist/{sales-numbering-4423JWN6.js → sales-numbering-IUYAABSM.js} +1 -1
  77. package/dist/{schedule-command-R5KTFAVZ.js → schedule-command-ZX5WNSAC.js} +1 -1
  78. package/dist/{search-TMROBRYD.js → search-N5UE5CUL.js} +1 -1
  79. package/dist/segment-FQHY6DVH.js +6 -0
  80. package/dist/server-settings-77MPN3UN.js +3 -0
  81. package/dist/{server-skills-IFTDV3IQ.js → server-skills-KX236POI.js} +1 -1
  82. package/dist/{setup-MUPUY2AX.js → setup-PF2VH2TW.js} +1 -1
  83. package/dist/{skill-S7EPMW5Z.js → skill-PWCJCIQO.js} +1 -1
  84. package/dist/{supplier-payment-O7GZSKGD.js → supplier-payment-HTENSEXJ.js} +2 -2
  85. package/dist/{support-U3VY5JI5.js → support-DOWAY63P.js} +1 -1
  86. package/dist/{task-EQBPQ7H4.js → task-OMYFPWQZ.js} +3 -3
  87. package/dist/{teams-GPJ6HMIX.js → teams-AUFHZRDH.js} +1 -1
  88. package/dist/{user-XYUB54QT.js → user-C7UKUPGT.js} +2 -2
  89. package/dist/user-contract-type-DO576EHJ.js +32 -0
  90. package/dist/{worker-agent-VPRWBAWG.js → worker-agent-OBYRYPLC.js} +1 -1
  91. package/dist/{workflow-GMP6W5EF.js → workflow-C2BEVHQ2.js} +1 -1
  92. package/package.json +1 -1
  93. package/dist/analysis-XO3WRAJR.js +0 -4
  94. package/dist/chunk-AT432SCP.js +0 -15
  95. package/dist/chunk-PNLP5SXG.js +0 -10
  96. package/dist/chunk-QHX5YFMM.js +0 -23
  97. package/dist/chunk-QZBE4KC2.js +0 -4
  98. package/dist/server-settings-3YD7RR3A.js +0 -3
@@ -11,6 +11,22 @@
11
11
  `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
12
  -->
13
13
 
14
+ ## 0.65.0
15
+
16
+ 組織設定「各種マスタ設定」のセグメント・契約形態・事業年度設定を CLI から一覧・取得・作成・更新・削除できるようになりました(`twp segment` / `twp user-contract-type` / `twp fiscal-year`)。作成・更新・削除は管理者の権限が要ります。
17
+
18
+ `twp attendance report-category` / `report-reason` / `report-reason-detail` で、勤怠連絡の連絡区分・連絡理由・連絡理由詳細のマスタを一覧・作成・変更・削除できるようになりました(作成・変更・削除はテナント管理者)。紐づける区分・理由は名前で指定できます。
19
+
20
+ ループを回さない機からも、AIアカウント枠の利用状況と再ログイン期限をエージェントループ画面へ送れるようになりました(`twp task-loop capacity report`)。1回送って終わるので、systemd timer や cron で定期実行してください。claude-auto-switch を使っていない場合も、正準スキーマ(`twp.capacity/v1`)を標準出力へ出すラッパを `capacity_probe.command` に指定すれば使えます。
21
+
22
+ Backlog へのコメント投稿・課題更新で、通知先のユーザーを指定できるようになりました(`--notify`)。
23
+
24
+ エージェントループの計画AIが `plan submit` で計画を提出したとき、他の実行機が処理中のタスクや既にキューにあるタスクもその場で理由つきで返るようになりました。計画ごとに、何件積んで何をなぜ積まなかったかがログの `PLAN_RESULT:` 行で読めます。
25
+
26
+ ## 0.64.0
27
+
28
+ `twp redmine` を追加しました。TWP の個人設定(外部システム連携)に登録した Redmine のチケット本文・コメント・添付を読めます(`issue get` / `attachment download` など)。書き込みはできません。
29
+
14
30
  ## 0.63.0
15
31
 
16
32
  エージェントループの計画AIが `twp task-loop plan submit` で計画を提出できるようになりました。検査に落ちた step は理由つきで返るので、計画AIがその場で直して出し直せます。
package/README.md CHANGED
@@ -22,7 +22,7 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
22
22
  | **できる** | `twp project` / `twp task` によるプロジェクト・タスクの読み書き(一覧・取得・作成・更新・削除・コメント) |
23
23
  | **できる** | `twp user` によるテナントのユーザーの作成・更新・失効(退社)と招待(1件・CSV 一括・再送・取消)、ユーザーと所属(部署・役職)の参照(一覧・取得・所属の履歴)、所属の付け替え(異動)・作成・更新・終了・削除、在籍者の棚卸と人事台帳 CSV との突き合わせ。作成・更新・招待と取得、所属の書き込み、他人の所属の参照、棚卸は組織管理者の権限が要ります |
24
24
  | **できる** | `twp skill` / `twp qualification` によるスキルマスタ・資格マスタの一覧、スキルマップの表示(部署で絞り込める)とスキル保有者の横断検索(所属付き)、自分のスキルプロファイルへの自己評価の提出(`--yes` が要ります)、`twp user skills` / `qualifications` / `trainings` / `contracts` によるユーザーのスキル評価・保有資格・研修受講履歴・雇用契約の参照。スキルマップと横断検索は HR管理者、雇用契約は原価管理者か管理者、研修履歴は人事管理の権限が要ります |
25
- | **できる** | `twp department` / `twp position` / `twp job-title` による組織マスタ(部署・役職・職位)の一覧・取得・作成・更新・削除と、部署ツリー・部署の所属者の表示。作成・更新・削除は管理者の権限が要ります |
25
+ | **できる** | `twp department` / `twp position` / `twp job-title` / `twp segment` / `twp user-contract-type` / `twp fiscal-year` による組織マスタ(部署・役職・職位・セグメント・契約形態・事業年度設定)の一覧・取得・作成・更新・削除と、部署ツリー・部署の所属者の表示。作成・更新・削除は管理者の権限が要ります |
26
26
  | **できる** | `twp inquiry category` による問い合わせカテゴリの一覧・取得・作成・更新(通知先の設定・末尾への並べ替えを含む)。取得・作成・更新は問い合わせ機能の管理者の権限が要ります |
27
27
  | **できる** | `twp evaluation` / `twp goal-sheet` による人事評価と目標シートの読み取り(評価期間・見てよい範囲の評価と目標シートの一覧・部下の評価の状況・評価の詳細とプロジェクト別評価・自分の目標シート・受け取ったフィードバック)。書き込みはまだありません |
28
28
  | **できる** | `twp support` によるシステムサポートへの依頼(依頼者側)の一覧・詳細(コメントの経過を含む)・起票(添付3件まで)・コメント・完了・再問い合わせ・取り下げと、カテゴリの一覧。運営側(回答・ステータス変更)は扱いません |
@@ -370,7 +370,7 @@ leader@example.com,admin
370
370
  - `twp user invite list` に出るのは**期限内の未受諾の招待だけ**です。期限が切れた招待は再送も取消もできないので、`twp user invite create` で招待し直してください
371
371
  - `resend` / `delete` はメールアドレスで指定します(未受諾の招待が1件に絞れたときだけ受け付けます)。トークンは招待を受諾できる秘密なので、`twp user invite list` では伏字で出ます(`--no-redact` で表示)
372
372
 
373
- ### 組織マスタ(部署・役職・職位)を扱う
373
+ ### 組織マスタ(部署・役職・職位・セグメント・契約形態・事業年度設定)を扱う
374
374
 
375
375
  作成・更新・削除は管理者向けです。一覧・取得・ツリー・所属者は、ログインしていれば使えます。
376
376
 
@@ -385,6 +385,19 @@ twp department delete <部署> --yes
385
385
 
386
386
  twp position list | get <役職> | create --code <コード> --name <役職名> [--rank <0〜9999>] [--manager true|false] … | update <役職> … | delete <役職> --yes
387
387
  twp job-title list | get <職位> | create --code <コード> --name <職位名> [--position <役職>] … | update <職位> [--position <役職> | --no-position] … | delete <職位> --yes
388
+ twp segment list | get <セグメント> | create --code <コード> --name <セグメント名> [--sort-order <0〜9999>] [--status active|inactive] … | update <セグメント> … | delete <セグメント> --yes
389
+
390
+ twp user-contract-type list [--active true|false]
391
+ twp user-contract-type get <契約形態>
392
+ twp user-contract-type create --name <名前> --calculation-type <計算区分> [--code <コード>] [--monthly-hours <1〜744>] [--daily-hours <1〜24>] [--work-schedule 0111110] …
393
+ twp user-contract-type update <契約形態> [--active false] …
394
+ twp user-contract-type delete <契約形態> --yes
395
+
396
+ twp fiscal-year list
397
+ twp fiscal-year get <年度>
398
+ twp fiscal-year create <年度> --indirect-cost-rate <0〜100> --target-profit-rate <0〜100> [--description <説明>]
399
+ twp fiscal-year update <年度> [--indirect-cost-rate <0〜100>] [--target-profit-rate <0〜100>] [--description <説明>]
400
+ twp fiscal-year delete <年度> --yes
388
401
  ```
389
402
 
390
403
  - **`<部署>` / `<役職>` / `<職位>`、`--parent`、`--position` は名前・コード・ID のどれでも指定できます。** 名前が複数に一致すれば候補を出して止まります。一覧は10分キャッシュするので、作成・改名の直後に名前で指定するときは `--refresh` を付けてください(ID ならそのまま通ります)
@@ -394,7 +407,10 @@ twp job-title list | get <職位> | create --code <コード> --name <職位名>
394
407
  - `twp department tree` は現在有効な部署だけを親子の順に出します(table / text / tsv では `depth` と字下げした名前、`--output json` はサーバの木構造のまま)。無効な部署も含めた全件は `twp department list` です
395
408
  - 一覧は API がページングを持たず、`--limit` 件(既定 1000)で打ち切ります。打ち切ったときは stderr で知らせます
396
409
  - **所属者がいる(過去の所属履歴を含む)・子部署がある部署、所属から参照されている役職・職位は削除できません**(サーバが断ります)。そのときはサーバの理由に続けて、次に打つコマンドを案内します(部署は `--valid-to` で無効化、子部署は `--parent` で移す、役職・職位は `--status inactive` で無効化)。終了コードは 3 です
397
- - ヘルプは `twp department help` / `twp position help` / `twp job-title help`
410
+ - **契約形態**は状態を `--active true|false` で切り替えます(役職・職位・セグメントの `--status` ではありません)。コードは任意なので、コードの無い契約形態は名前か ID で指定してください。計算区分(`--calculation-type`)は `salary_based`(一般従業員)/ `salary_executive`(役員)/ `salary_manager`(管理監督者)/ `hourly_based`(時給制)/ `contract_based`(業務委託)/ `other_exempt`(計算対象外)です。`--work-schedule` は**日曜始まり**(日月火水木金土)の 0 / 1 を7桁で指定します(月〜金なら `0111110`)。契約形態の一覧は全件を返します
411
+ - **事業年度設定**は年度(4桁の数字)で指定します。同じ年度の設定が既にあると `create` は断られるので `update` を使ってください。設定を消した年度はシステムの既定値で計算されます
412
+ - **プロジェクトから参照されているセグメント、契約(終了済みの履歴を含む)から参照されている契約形態も削除できません。** サーバの理由に続けて無効化のコマンド(セグメントは `--status inactive`、契約形態は `--active false`)を案内します
413
+ - ヘルプは `twp department help` / `twp position help` / `twp job-title help` / `twp segment help` / `twp user-contract-type help` / `twp fiscal-year help`
398
414
 
399
415
  ### スキル・資格・研修履歴を見る
400
416
 
@@ -991,6 +1007,27 @@ twp attendance flex-settlement [--month <YYYY-MM>] [--user <ユーザー>]
991
1007
  - `team` は画面の「チームの勤怠」と同じ集計で、一人ずつのいまの打刻状態と今日の勤怠連絡・休暇を出します
992
1008
  - `flex-settlement` はフレックス勤務制の人の清算期間の所定・実労働・過不足です。フレックス制でない人は `is_flex: false` を返します。他の人の分は勤怠の管理者か上長だけが見られます
993
1009
 
1010
+ ### 勤怠連絡のマスタ(連絡区分・連絡理由・連絡理由詳細。テナント管理者)
1011
+
1012
+ ```bash
1013
+ twp attendance report-category list [--status active|inactive] [--keyword <語>] [--limit <件数>]
1014
+ twp attendance report-category get <区分>
1015
+ twp attendance report-category create --code <コード> --name <名前> [--name-short <略称>] [--sort <0-9999>] [--status active|inactive] [--admin-only true|false] [--description <説明>]
1016
+ twp attendance report-category update <区分> [項目…]
1017
+ twp attendance report-category delete <区分> --yes
1018
+ twp attendance report-reason list [--category <区分>] [--status …] [--keyword <語>]
1019
+ twp attendance report-reason create --code <コード> --name <名前> [--category <区分>]… [--sort …] [--status …] [--admin-only …] [--description …]
1020
+ twp attendance report-reason get | update | delete <理由>
1021
+ twp attendance report-reason-detail list [--reason <理由>] [--status …] [--keyword <語>]
1022
+ twp attendance report-reason-detail create --code <コード> --name <名前> [--reason <理由>]… [--yearly-count true|false] [--sort …] [--status …] [--admin-only …] [--description …]
1023
+ twp attendance report-reason-detail get | update | delete <理由詳細>
1024
+ ```
1025
+
1026
+ - 画面「各種マスタ設定 > 連絡区分/連絡理由/連絡理由詳細」と同じものです。作成・変更・削除はテナント管理者だけができます(閲覧は誰でもできます)
1027
+ - 対象と紐づけ先(`--category` / `--reason`)は名前・コード・ID の完全一致で指定します。無効にしたものも候補に入ります。一致しない・複数当たるときは候補を出して終了コード 2 で止まります。作った直後の区分も名前で指定できます
1028
+ - 紐づけ先は繰り返して複数指定できます。**`create` で省くと、サーバがその時点で有効な区分(理由)すべてに紐づけます。** `update` で指定すると紐づけを置き換えます(足すのではありません)
1029
+ - 削除は子 → 親の順です(理由詳細 → 理由 → 区分)。子が紐づいているとサーバが断り、その文面と、紐づく子を確かめるコマンドを出します。今後使わないだけなら `update <対象> --status inactive` で無効にできます
1030
+
994
1031
  ### 残業・締め状況を見る(勤怠の管理者)
995
1032
 
996
1033
  ```bash
@@ -1350,6 +1387,27 @@ twp backlog issue update <課題キー> [--assignee <名前|ID>] [--status <
1350
1387
  - 担当の解除(未設定に戻す)はできません
1351
1388
  - ⚠ **失敗しても機械的に再実行しないでください。** Backlog に冪等キーは無く、投稿が届いた後に応答の読み取りだけ失敗した場合、再実行すると同じコメントが二重に残ります(終了コードだけでは区別できません。`twp backlog comment list <課題キー>` で実物を確かめてください)
1352
1389
 
1390
+ ### Redmine のチケットを読む
1391
+
1392
+ TWP の個人設定(外部システム連携)に登録した Redmine を通して、チケットの本文・コメント・添付を読みます。書き込み(チケット更新・コメント投稿)はできません。
1393
+
1394
+ ```
1395
+ twp redmine space list # 登録済みの接続先(--space に渡す ID)
1396
+ twp redmine project list [--space <ID|URL>] [--all]
1397
+ twp redmine issue list [--project <識別子|ID>] [--status open|closed|*|<ID>] [--assignee me|<ID>]
1398
+ [--limit <件数>] [--cursor <カーソル>] [--all]
1399
+ twp redmine issue get <チケット番号> # 本文・コメント(journals)・添付一覧
1400
+ twp redmine attachment list <チケット番号> # id / filename / filesize
1401
+ twp redmine attachment download <添付ID> --out <パス> # 実体をファイルへ書き出す
1402
+ ```
1403
+
1404
+ - **接続先の登録が1件だけなら `--space` は省略できます**(そのとき、どの接続先を使ったかを必ず表示します)。2件以上なら `--space` で指定してください。`--space` には ID のほか、表示名・接続先URL・ホスト名が使えます
1405
+ - `twp redmine issue get` の `--output json` は Redmine の応答をそのまま返します。コメントは `journals` に入り、ステータス・担当などの変更履歴(`details`)も含まれます
1406
+ - `twp redmine issue list` の既定は Redmine と同じく**未完了のチケットだけ**です。完了済みも含めるときは `--status '*'` を付けてください
1407
+ - 一覧は `--all` で最後まで辿れます(`--limit` の上限は 100 です)
1408
+ - `twp redmine attachment download` は `twp backlog attachment download` と同じく **`--out` のパスへ実体を書き出し、既存ファイルは `--force` を付けたときだけ上書きします**。添付ID は `twp redmine attachment list` の `id` で、ファイル名では指定できません
1409
+ - 接続先が IP 制限などで TWP から届かないときは、その旨のエラーで失敗します(終了コード 4)
1410
+
1353
1411
  ### Microsoft 365(Outlook・Teams・OneDrive)を読む
1354
1412
 
1355
1413
  TWP に Microsoft アカウントでログインしたことがあるユーザーは、自分のメール・予定・Teams・OneDrive を読めます。メールの送信・返信・転送、Teams のチャット送信・チャネル投稿・スレッド返信、予定の作成・更新・削除、OneDrive へのアップロードと共有リンクの作成もできます。
@@ -1825,7 +1883,35 @@ twp task-loop plan submit --file plan.json --check # 検査だけ(提出し
1825
1883
 
1826
1884
  - **計画フェーズの中でだけ使えます。** ループが計画AIを起動するときにだけ鍵(環境変数 `TWP_LOOP_PLAN_TOKEN` / `TWP_LOOP_PLAN_DIR`)を渡し、計画フェーズが終わると無効にします。それ以外で打つと終了コード `2` で拒否します
1827
1885
  - 計画の形は応答の文章に書く場合と同じ `{"steps": [{"skill": "...", "args": "...", "label": "...", "priority": "P2"}]}` です。step ごとに受理/棄却と理由(存在しないスキル・`/twp-` 付きのスキル名・雛形のままのタスクキー・同じタスクキーの重複・型の誤り)を表と JSON で表示し、棄却が1件でもあれば何も提出せず終了コード `1` で終わります。直して出し直すと、最後に受理された提出が有効です
1828
- - **提出しただけではキューに積まれません。** 計画AIの終了後にループが一度に登録します(他ランナーが処理中・キュー待ち等の検査はこのとき従来どおり行います)。提出が無いときは、従来どおり応答の文章から計画を取り出します
1886
+ - **他ランナーが処理中・キュー待ち・直近に同じスキルが状態を進めたタスクキーも、提出時に棄却します。** 判定はループが計画AIを起動する直前に取った実測の写しで行います。写しを取れなかった検査は「提出時には効いていません」と表示します(「直近に状態を進めた」は台帳に契約行が記録された実行だけを見ます。それ以外はエンキュー時に判定されます)
1887
+ - **提出しただけではキューに積まれません。** 計画AIの終了後にループが一度に登録します(計画AIが走る間に状態が変わるので、上の検査はこのとき改めて行います)。提出が無いときは、従来どおり応答の文章から計画を取り出します
1888
+ - 計画1回ごとに、ループのログと計画のログ(`plan-<時刻>-<サイクル>.log`)の末尾へ `PLAN_RESULT: {...}` の1行を残します。`source`(`submit`=提出 / `text`=文章から取り出し / `none`)・`planned`・`enqueued`・`dropped`(積まなかった step とその理由)・`unchecked`(提出時に効いていなかった検査)・`rejected_submissions`(`plan submit` で棄却された提出と理由。新しい順に最大5件)が読めます。計画AIが失敗した・中断したサイクルには出ません
1889
+
1890
+ ### ループを回さない機から枠情報だけを送る(`capacity report`)
1891
+
1892
+ ```bash
1893
+ twp task-loop capacity report --project <キー|UUID>
1894
+ ```
1895
+
1896
+ - **AI アカウント枠の観測値を1回だけ送って終わります(常駐しません)。** 自前のループを使っていて `twp task-loop run` を回さない機でも、エージェントループ画面に枠の利用状況・再ログイン期限を出せます。定期実行は systemd timer / cron / launchd に任せてください(目安は300秒ごと)
1897
+ - 設定はループと同じ `~/.twp/loops/<プロジェクトUUID>.json` の `capacity_probe` を読みます(任意のコマンドを実行するため、サーバ側の設定には置けません)。claude-auto-switch を使っていない場合も、**正準スキーマ `twp.capacity/v1` の JSON を標準出力へ出すラッパ**を `command` に指定し、`format` を既定のままにすれば使えます
1898
+
1899
+ ```json
1900
+ {
1901
+ "capacity_probe": {
1902
+ "command": ["claude-auto-switch", "status", "--json"],
1903
+ "format": "claude_auto_switch/v1"
1904
+ }
1905
+ }
1906
+ ```
1907
+
1908
+ ラッパを使う場合は `{"capacity_probe": {"command": ["/path/to/my-capacity-wrapper"]}}` のように `format` を省略します(既定 `twp.capacity/v1`)。`generated_at` には出力した時刻ではなく実測した時刻を入れてください
1909
+ - **timer / cron にはループと同じ環境を渡してください。** 実行機の識別子(runner_id)は状態ディレクトリ(`TWP_OPS_STATE_DIR`、未指定なら `~/.twp-task-loop`、それが無く `~/.twp-ops` があればそちら)の `runner-id` か `RUNNER_ID` から決まります。対話シェルと timer で `HOME` や `TWP_OPS_STATE_DIR` が違うと別の実行機として登録されます。状態ディレクトリへ書けない場合は送らずに終了コード `1` で終わります
1910
+
1911
+ - 画面には「枠報告のみ」の実行機として表示され、ループの台数上限・稼働台数には数えられません
1912
+ - プローブが失敗したときは、直前の成功から30分以内ならその値を送り、それより古ければ失敗を送ります(ループと同じ規則。直前の成功値は伏字済みの送信値だけを状態ディレクトリに控えます。実行間隔を30分以上にすると使い回しは効きません)
1913
+ - `twp task-loop` の他のサブコマンドと違い、自動アップデートの対象です(ループを回さない機には専用の更新経路が無いため)
1914
+ - 終了コード: 送れたら `0`(プローブが失敗して失敗を送れた場合も `0`)。`capacity_probe` が未設定なら何もせず `0`。**同じ機が同じプロジェクトでループとして登録済みなら送らずに `0`**(ループが動いている間は heartbeat で送られます。止めたループの登録が残っている間も同じです)。送信自体に失敗したら `1`
1829
1915
 
1830
1916
  ### 必要なもの
1831
1917
 
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{AGENT_REPOSITORIES_PATH,AGENT_SESSIONS_PATH}from"./chunk-MYWDL3WX.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";
3
+ import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{AGENT_REPOSITORIES_PATH,AGENT_SESSIONS_PATH}from"./chunk-ZSPWHEBL.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import{ApiError}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";
4
4
  import{ApiRejectedError,ApiResponseError,NetworkError,UsageError,WaitTimeoutError}from"./chunk-VFPY2A23.js";import{NotLoggedInError,SessionExpiredError}from"./chunk-XNLIEUAW.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var SESSION_COLUMNS=["sessionId","status","repositoryFullName","baseBranch","workBranch","prUrl","aiModel","myRole","createdAt"];var SESSION_GET_COLUMNS=["sessionId","status","repositoryFullName","repositoryId","baseBranch","workBranch","branchName","prUrl","errorMessage","aiProvider","aiModel","sessionMode","executionMode","masterUserName","myRole","createdAt","updatedAt","completedAt","instructions"];var CHAT_COLUMNS=["timestamp","role","user_name","content"];var REPOSITORY_COLUMNS=["id","full\
5
5
  _name","default_branch","private"];var BRANCH_COLUMNS=["name","protected"];var DIFF_COLUMNS=["path","status","additions","deletions"];var INSTRUCTION_MAX_CHARS=1e4;var ACTIVE=new Set(["created","pending","provisioning","running"]);var FAILED=new Set(["failed","cancelled","expired"]);var WAIT_POLL_INTERVAL_MS=5e3;var WAIT_DEFAULT_SECONDS=300;var WAIT_MAX_SECONDS=540;var WAIT_CHAT_SCAN_LIMIT=2e3;var sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms));var SESSION_REF_HELP="<\u30BB\u30C3\u30B7\u30E7\u30F3> \u306F\u30BB\u30C3\u30B7\u30E7\u30F3 ID\uFF08twp \
6
6
  agent session list \u306E sessionId \u5217\uFF09\u3067\u3059\u3002";var CREDIT_CONFIRMATION="AI \u30AF\u30EC\u30B8\u30C3\u30C8\u3092\u6D88\u8CBB\u3059\u308B\u64CD\u4F5C";function usageOf(op){return`twp agent ${op} help`}function noArgs(input,op){if(input.args.length>0)throw new UsageError(`${op} \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,usageOf(op))}function single(input,op,label,hint){const values=input.args.map(arg=>arg.trim());if(values.length>
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{loadLocalConfig}from"./chunk-2B7A3OY7.js";import{loadAiConfig}from"./chunk-AEJHDFXB.js";import"./chunk-N2UVRM3Z.js";import{stepToItem}from"./chunk-QEWCTKPV.js";import"./chunk-DXUFECE7.js";import"./chunk-AT432SCP.js";import"./chunk-GY7KI5E5.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";
4
- import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.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\
3
+ import{stepToItem}from"./chunk-UODNIEO2.js";import"./chunk-DXUFECE7.js";import{loadLocalConfig}from"./chunk-CGHGQAEM.js";import{loadAiConfig}from"./chunk-AEJHDFXB.js";import"./chunk-G4TZFGNN.js";import"./chunk-N2UVRM3Z.js";import"./chunk-SPZ3GBYC.js";import"./chunk-GY7KI5E5.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-MI6HVYR2.js";import{requireResolved,singleRef,withResolved}from"./chunk-PS5QFKHB.js";
4
+ import"./chunk-II5RVJQN.js";import{acknowledgement,isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.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";
7
7
  var CREATE_HINT="\u30A2\u30A4\u30C6\u30E0\u306E\u6295\u5165\uFF08twp agent-loop create\uFF09\u306F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30E1\u30F3\u30D0\u30FC\u306A\u3089\u7BA1\u7406\u8005\u3067\u306A\u304F\u3066\u3082\u884C\u3048\u307E\u3059";var FORBIDDEN_UPDATE=`\u30AD\u30E5\u30FC\u306E\u30A2\u30A4\u30C6\u30E0\u306E\u66F4\u65B0\u306B\u306F${FORBIDDEN_CORE}\u3002\u5B9F\u884C\u4E2D\u306E\u30A2\u30A4\u30C6\u30E0\u3078\u306E\u66F8\u304D\u623B\u3057\u3060\u3051\u306F\u3001\u305D\u306E\u30A2\u30A4\u30C6\u30E0\u3092 claim \u3057\u305F\u30EB\u30FC\u30D7\u81EA\u8EAB\u304C run_id \u3092\u6DFB\u3048\u3066\u884C\u3048\u307E\u3059\u3002`+
@@ -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{detectAiClis}from"./chunk-T4QZO6RQ.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-PIB6MGG5.js";import"./chunk-YJZT3UD3.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,
4
- resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-AEJHDFXB.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{ClaudeStreamRenderer}from"./chunk-DXUFECE7.js";import"./chunk-AT432SCP.js";import"./chunk-GY7KI5E5.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
3
+ import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-FAHDBWW2.js";import"./chunk-YJZT3UD3.js";import{detectAiClis}from"./chunk-T4QZO6RQ.js";import"./chunk-A4LFG7MW.js";import"./chunk-VRBI2NPI.js";import{ClaudeStreamRenderer}from"./chunk-DXUFECE7.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,
4
+ detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-AEJHDFXB.js";import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import"./chunk-SPZ3GBYC.js";import"./chunk-GY7KI5E5.js";import"./chunk-VFPY2A23.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-J7QYPKVK.js";import"./chunk-5WGOHFAS.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
5
5
  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 DEFAULT_AI_TIMING={abortGraceMs:5e3,abortReapMs:2e3,pollIntervalMs:5e3};function resolveTiming(over){return{abortGraceMs:over?.abortGraceMs??DEFAULT_AI_TIMING.abortGraceMs,abortReapMs:over?.abortReapMs??DEFAULT_AI_TIMING.abortReapMs,pollIntervalMs:over?.pollIntervalMs??DEFAULT_AI_TIMING.pollIntervalMs}}var MAX_RETAINED_BYTES=4*1024*1024;function closeStream(stream){return new Promise(resolve=>{if(stream===null)return resolve();stream.once("error",()=>resolve());stream.end(()=>resolve())})}function buildArgs(req,cfg,env,workspace){
6
6
  const warnings=[];const requested=(req.model??"").trim();const usable=requested!==""&&isUsableModelId(requested);if(requested!==""&&!usable){warnings.push(`ai_model '${requested}' \u306F\u4F7F\u3048\u306A\u3044\u5F62\u3067\u3059 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fitsRoute=!usable||!isClaudeAi(req.ai)||modelFitsRoute(requested,env);if(usable&&!fitsRoute){warnings.push(`ai_model '${requested}' \u306F\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\uFF08\u3053\u306E\u6A5F\u4F53\u306F ${usesBedrock(
7
7
  env)?"Bedrock":"Anthropic \u76F4"}\uFF09 \u2192 \u30AB\u30C6\u30B4\u30EA\u65E2\u5B9A\u306E\u30E2\u30C7\u30EB\u3092\u4F7F\u3044\u307E\u3059`)}const fallback=cfg.modelFor(req.ai,req.category,env);const safeFallback=fallback===""||!isClaudeAi(req.ai)||modelFitsRoute(fallback,env)?fallback:"";if(fallback!==""&&safeFallback===""){warnings.push(`CLAUDE_MODEL '${fallback}' \u3082\u73FE\u5728\u306E\u5B9F\u884C\u7D4C\u8DEF\u3067\u306F\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093 \u2192 \u30E2\u30C7\u30EB\u3092\u6307\u5B9A\u3057\u307E\u305B\u3093`)}
@@ -0,0 +1,5 @@
1
+ import { createRequire as __twpCreateRequire } from 'node:module';
2
+ const require = __twpCreateRequire(import.meta.url);
3
+ import{FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,listIn,manhourNotes,manhourQuery,manhourRows,monthRange,monthsBetween,noArgs,profitRows,rangeNotes,recordOf,staffKpiRows,workloadDistributionNotes,workloadDistributionRows}from"./chunk-5AQ2JPIS.js";import"./chunk-ZJW3GBE5.js";import"./chunk-EXT4AIDF.js";import"./chunk-SCU74Z4U.js";import"./chunk-JJSBBWJ5.js";import"./chunk-MI6HVYR2.js";
4
+ import"./chunk-RX5HWI4L.js";import"./chunk-6LSQCOCJ.js";import"./chunk-ZSPWHEBL.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";
5
+ import"./chunk-VSJBJXZO.js";export{FROM_FLAG,MANHOUR_DESCRIPTION,MANHOUR_FROM_FLAG,MANHOUR_TO_FLAG,MONTH_FLAG,TO_FLAG,analysisDomain,analysisForbidden,currentMonth,dataOf,listIn,manhourNotes,manhourQuery,manhourRows,monthRange,monthsBetween,noArgs,profitRows,rangeNotes,recordOf,staffKpiRows,workloadDistributionNotes,workloadDistributionRows};
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{composeDocument,htmlToText,metaLine}from"./chunk-QSXS5SB2.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{ANNOUNCEMENTS_PATH}from"./chunk-MYWDL3WX.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";
3
+ import{composeDocument,htmlToText,metaLine}from"./chunk-QSXS5SB2.js";import{boundedText}from"./chunk-JJSBBWJ5.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,positiveInteger}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import{ANNOUNCEMENTS_PATH}from"./chunk-ZSPWHEBL.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";
4
4
  import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var LABEL="\u304A\u77E5\u3089\u305B";var LIST_COLUMNS=["id","publish_start_at","sender_name","category_name","title","is_read","require_confirmation","is_confirmed"];var UNCONFIRMED_COLUMNS=["id","publish_start_at","publish_end_at","importance","title"];var GET_COLUMNS=["id","title","sender_name","category_name","importance_name","publish_start_at","publish_end_at","is_organization","is_read","require_confirmation","is_confirmed","allow_replies","link_url"];var REPLY_COLUMNS=["id","created_at","\
5
5
  user_name","is_mine","content"];var REPLY_MAX_CHARS=2e3;function noArgs(input,op){if(input.args.length>0){throw new UsageError(`${op} \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,`twp announcement ${op} help`)}}function checkId(raw,help){const id=raw.trim();if(id==="")throw new UsageError("\u304A\u77E5\u3089\u305B\u306E ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",help);if(!isSafePathSegment(id)){throw new UsageError(`\u304A\u77E5\u3089\u305B\u306E ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\
6
6
  \u5024\u3067\u3059: ${id}`,"\u304A\u77E5\u3089\u305B\u306E ID \u306F twp announcement list \u306E id \u5217\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002")}return id}function announcementId(input,op){const help=`twp announcement ${op} help`;const[raw,...rest]=input.args;if(rest.length>0)throw new UsageError(`${op} \u304C\u53D7\u3051\u53D6\u308C\u308B\u304A\u77E5\u3089\u305B ID \u306F1\u3064\u3060\u3051\u3067\u3059: ${rest.join(" ")}`,help);return checkId(raw??"",help)}function announcementIds(input){
@@ -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{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-UVCIVMT6.js";import"./chunk-PNLP5SXG.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{renderOutput}from"./chunk-YXVN6OCH.js";
4
- import{redactSecretValues,redactSecrets,withDebug}from"./chunk-UFGJSWKU.js";import"./chunk-Q3B65OFC.js";import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-MI6HVYR2.js";import{readBody}from"./chunk-6LSQCOCJ.js";import"./chunk-MYWDL3WX.js";import"./chunk-HVZUXLQ4.js";import{
5
- ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import{ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-VFPY2A23.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,
6
- resolveConfiguredOutput,resolveProfile}from"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-QZBE4KC2.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.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{describeWaitResult,parseWaitOptions,waitUntilTerminal}from"./chunk-WVCEKC7V.js";import{NO_REDACT_FLAG,NO_REDACT_NOTICE,exitCodeFor,fetchAllPages,reportError}from"./chunk-2G6ZZPME.js";import"./chunk-YASL34FY.js";import"./chunk-Q3B65OFC.js";import{evaluateQuery}from"./chunk-GFLGXGWE.js";import{renderOutput}from"./chunk-YXVN6OCH.js";
4
+ import{redactSecretValues,redactSecrets,withDebug}from"./chunk-UFGJSWKU.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-MI6HVYR2.js";import{parseOperationArgs,repeatedValues}from"./chunk-RX5HWI4L.js";import{readBody}from"./chunk-6LSQCOCJ.js";import"./chunk-ZSPWHEBL.js";import"./chunk-HVZUXLQ4.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-JA5A6UJ2.js";
5
+ import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-3ZRMMBP5.js";import{ApiResponseError,EXIT_OK,EXIT_WAIT_TIMEOUT,NetworkError,UsageError}from"./chunk-VFPY2A23.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-PECIBNFD.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-4VZKNEVN.js";
6
+ import"./chunk-RZVI6PMW.js";import{HELP_TOKEN}from"./chunk-YYURQG4E.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-74BPZOKU.js";import"./chunk-UREA4ZIG.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.
@@ -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-7PDUN5MS.js";import"./chunk-NZ7WI4RZ.js";import{buildDiffLines,
4
- diffStat}from"./chunk-VRBI2NPI.js";import"./chunk-UFGJSWKU.js";import"./chunk-N2UVRM3Z.js";import"./chunk-MYWDL3WX.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-5WTFZJT7.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";
5
- import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-4ZREAAP4.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-2LOT54OO.js";import"./chunk-QZBE4KC2.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-7PDUN5MS.js";import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";
4
+ import"./chunk-NZ7WI4RZ.js";import"./chunk-UFGJSWKU.js";import"./chunk-N2UVRM3Z.js";import"./chunk-ZSPWHEBL.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-II5RVJQN.js";import"./chunk-VFPY2A23.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-5WTFZJT7.js";import"./chunk-D233KKXW.js";import"./chunk-PMOUHEJQ.js";
5
+ import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.js";import{parseArgv}from"./chunk-WG6NCT4L.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-2LOT54OO.js";import"./chunk-YYURQG4E.js";
6
6
  import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-UREA4ZIG.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.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-J7ACNZ3D.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-RLV6W5JA.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",
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-E3KMIBSP.js";import{dateFlag,monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-6LSQCOCJ.js";import"./chunk-MYWDL3WX.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,
4
- ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
3
+ import{PUNCH_TYPES,assertMonthOpen,attendanceDomain}from"./chunk-ZJW3GBE5.js";import{dateFlag,monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-SCU74Z4U.js";import"./chunk-JJSBBWJ5.js";import"./chunk-MI6HVYR2.js";import"./chunk-RX5HWI4L.js";import"./chunk-6LSQCOCJ.js";import"./chunk-ZSPWHEBL.js";import{isSafePathSegment}from"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import{requireResolved,withResolved}from"./chunk-PS5QFKHB.js";
4
+ import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var CREATE_USAGE="twp attendance record create --date <YYYY-MM-DD> --time <HH:MM> --type <clock-in|clock-out|break-start|break-end|switch> [--project <\u30B3\u30FC\u30C9|ID>] [--task <\u30BF\u30B9\u30AFID>] [--memo <\u30E1\u30E2>]";var UPDATE_USAGE="twp attendance record update <\u8A18\u9332ID> --memo <\u30E1\u30E2> [--month <YYYY-MM>]";var DELETE_USAGE="twp attendance record delete <\u8A18\u9332ID> --reason <\u7406\u7531> --yes [--month <YYYY-MM>]";var MOVE_USAGE="twp attendance record move <\u8A18\u9332\
5
5
  ID> --project <\u30B3\u30FC\u30C9|ID> [--month <YYYY-MM>]";var TEXT_MAX=500;var UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var TIME_PATTERN=/^(\d{2}):(\d{2})(?::(\d{2}))?$/;var CLOSED_REASON="\u30B5\u30FC\u30D0\u306F\u7DE0\u3081\u6E08\u307F\u306E\u6708\u3078\u306E\u4FEE\u6B63\u3092\u62D2\u5426\u305B\u305A\u7DE0\u3081\u306E\u96C6\u8A08\u3092\u6D17\u3044\u66FF\u3048\u308B\u306E\u3067\u3001CLI \u304C\u9001\u308B\u524D\u306B\u6B62\u3081\u3066\u3044\u307E\u3059\u3002";
6
6
  var FORBIDDEN="\u81EA\u5206\u306E\u6253\u523B\u306E\u4FEE\u6B63\u306B\u306F\u6253\u523B\u4FEE\u6B63\u306E\u6A29\u9650\uFF08\u30E6\u30FC\u30B6\u30FC\u8A2D\u5B9A\u306E\u300C\u6253\u523B\u4FEE\u6B63\u300D\uFF09\u3068\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";var RECORD_COLUMNS=["id","type","type_label","recorded_at","year_month","project_id","t\
7
7
  ask_id","memo","is_manual","deleted_at"];var LABELS={clock_in:"\u51FA\u52E4",clock_out:"\u9000\u52E4",break_start:"\u4F11\u61A9\u958B\u59CB",break_end:"\u4F11\u61A9\u7D42\u4E86",switch:"\u5207\u66FF"};var TYPE_ORDER={break_start:1,break_end:2,switch:3,clock_out:4,clock_in:5};function zonedParts(epochMs,timeZone){const parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}).formatToParts(new Date(
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __twpCreateRequire } from 'node:module';
2
2
  const require = __twpCreateRequire(import.meta.url);
3
- import{hoursMinutes}from"./chunk-E3KMIBSP.js";import{monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-6LSQCOCJ.js";import"./chunk-MYWDL3WX.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";
4
- import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MONTH_FLAG={name:"--month",summary:"\u5BFE\u8C61\u306E\u5E74\u6708\uFF08YYYY-MM\uFF09",takesValue:true,placeholder:"<YYYY-MM>"};var ME_FLAG={name:"--me",summary:"\u81EA\u5206\u306E\u5206\u3060\u3051\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\u30FB\u7BA1\u7406\u8005\uFF09",takesValue:false};var FORBIDDEN_ADMIN="\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\u3002\u5168\u54E1\u5206\uFF08--me \u306A\u3057\uFF09\u306F\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\uFF08\u52E4\u6020: \u7BA1\u7406\u8005\uFF09\u3001\u81EA\u5206\u306E\u5206\uFF08--me\uFF09\u306F\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u6A29\u9650\u306E\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";
3
+ import{hoursMinutes}from"./chunk-ZJW3GBE5.js";import{monthFlag}from"./chunk-EXT4AIDF.js";import"./chunk-SCU74Z4U.js";import"./chunk-JJSBBWJ5.js";import"./chunk-MI6HVYR2.js";import"./chunk-RX5HWI4L.js";import"./chunk-6LSQCOCJ.js";import"./chunk-ZSPWHEBL.js";import"./chunk-HVZUXLQ4.js";import"./chunk-JA5A6UJ2.js";import"./chunk-H4CDX4TX.js";import"./chunk-PS5QFKHB.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-3ZRMMBP5.js";
4
+ import{ApiResponseError,UsageError}from"./chunk-VFPY2A23.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-RZVI6PMW.js";import"./chunk-QQRJLH6B.js";import"./chunk-NHYMHCAT.js";import"./chunk-VSJBJXZO.js";var MONTH_FLAG={name:"--month",summary:"\u5BFE\u8C61\u306E\u5E74\u6708\uFF08YYYY-MM\uFF09",takesValue:true,placeholder:"<YYYY-MM>"};var ME_FLAG={name:"--me",summary:"\u81EA\u5206\u306E\u5206\u3060\u3051\u3092\u8868\u793A\u3059\u308B\uFF08\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\u30FB\u7BA1\u7406\u8005\uFF09",takesValue:false};var FORBIDDEN_ADMIN="\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\u3002\u5168\u54E1\u5206\uFF08--me \u306A\u3057\uFF09\u306F\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\uFF08\u52E4\u6020: \u7BA1\u7406\u8005\uFF09\u3001\u81EA\u5206\u306E\u5206\uFF08--me\uFF09\u306F\u52E4\u6020\u306E\u5229\u7528\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u306E\u7BA1\u7406\u8005\u306B\u6A29\u9650\u306E\u4ED8\u4E0E\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044";
5
5
  function listBody(spec,body){if(!isRecord(body)||!Array.isArray(body[spec.key])){throw new ApiResponseError(`${spec.label}\u306E\u5FDC\u7B54\u306B ${spec.key} \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return body}function monthListOperation(spec){const usage=`twp ${spec.domain} list [--month <YYYY-MM>] [--me]`;return{name:"list",summary:`\u6708\u306E${spec.label}\u3092\u4E00\u89A7\u3059\u308B\uFF08--me \u3067\u81EA\u5206\u306E\u5206\u30FB\u7121\u3051\u308C\u3070\u5168\u54E1\u5206\uFF1D\u7BA1\u7406\u8005\uFF09`,
6
6
  usage,description:`GET ${spec.path} \u3092\u8868\u793A\u3057\u307E\u3059\uFF08\u5168\u54E1\u5206\u30FB\u52E4\u6020\u306E\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\uFF09\u3002--me \u3092\u4ED8\u3051\u308B\u3068 GET ${spec.path}/me\uFF08\u81EA\u5206\u306E\u5206\uFF09\u3067\u3059\u3002
7
7
  --month \u304C\u7121\u3051\u308C\u3070\u4ECA\u6708\u3067\u3059\uFF08\u30C6\u30CA\u30F3\u30C8\u306E\u696D\u52D9\u65E5\u306E\u533A\u5207\u308A\u3067\u30B5\u30FC\u30D0\u304C\u6C7A\u3081\u307E\u3059\uFF09\u3002