@tocca-systems/twp-cli 0.37.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.public.md +16 -0
- package/README.md +138 -3
- package/dist/{agent-loop-SP2UKXIG.js → agent-loop-4U5RLC4L.js} +1 -1
- package/dist/{ai-dispatch-LY6OVZC3.js → ai-dispatch-KRMDHQEF.js} +1 -1
- package/dist/{api-command-NLV55HVW.js → api-command-IO572BZ4.js} +27 -11
- package/dist/{app-MED2NINK.js → app-Y2RIXLS4.js} +4 -4
- package/dist/attendance-5KE2JPK4.js +3 -0
- package/dist/{attendance-lists-F2KTIJZA.js → attendance-lists-MXQNWUIH.js} +1 -1
- package/dist/{backlog-33ELMSV6.js → backlog-67JSQYOH.js} +1 -1
- package/dist/chunk-3RAGOW6X.js +5 -0
- package/dist/chunk-4ZT5LTRX.js +94 -0
- package/dist/{chunk-R53CMVWR.js → chunk-5R4SEO3I.js} +10 -10
- package/dist/{chunk-VQMR5UTD.js → chunk-BJLXXRSY.js} +1 -1
- package/dist/{chunk-KSWRKHKU.js → chunk-C7UDUHQZ.js} +26 -24
- package/dist/{chunk-ZST7XESB.js → chunk-ELXDRPDV.js} +39 -33
- package/dist/chunk-FEOST3GF.js +3 -0
- package/dist/{chunk-WYBJLRTG.js → chunk-GPIIXDEX.js} +2 -4
- package/dist/{chunk-TAN5I2DP.js → chunk-I4ARX6NM.js} +1 -1
- package/dist/{chunk-KA3EE4TJ.js → chunk-MHRGKUMK.js} +1 -1
- package/dist/chunk-QDTYD5PY.js +147 -0
- package/dist/{chunk-4CVLBR42.js → chunk-QQLWMHGR.js} +2 -2
- package/dist/{chunk-SN6YG4SF.js → chunk-RZ54TCQU.js} +15 -14
- package/dist/chunk-TLN3JSEC.js +7 -0
- package/dist/chunk-UVUVEL3B.js +3 -0
- package/dist/{chunk-U6GEC6KI.js → chunk-Y5YDL3MC.js} +1 -1
- package/dist/cli.js +116 -9
- package/dist/{commands-OABOHHNC.js → commands-K6DQ3O35.js} +1 -1
- package/dist/{commands-M4B3MDUA.js → commands-MLYGGSUE.js} +3 -3
- package/dist/company-3KUWW7QA.js +71 -0
- package/dist/{completion-DGJH42YO.js → completion-6R5D5TQQ.js} +1 -1
- package/dist/contract-FGRHTOGI.js +86 -0
- package/dist/{department-NEDSHJJK.js → department-PN5DCCRL.js} +1 -1
- package/dist/deposit-XQER6PMG.js +4 -0
- package/dist/estimate-IXBEQVGI.js +164 -0
- package/dist/{inquiry-CUK2LWQK.js → inquiry-3VOJASJH.js} +1 -1
- package/dist/invoice-KY3BYTHQ.js +209 -0
- package/dist/{job-title-USZK3QZS.js → job-title-EM6RKGQ6.js} +1 -1
- package/dist/knowledge-F4FZ4MLH.js +112 -0
- package/dist/{leave-6UB43UT5.js → leave-D2S7NMJC.js} +2 -2
- package/dist/{media-3L4JSXC6.js → media-SQVQVX2E.js} +1 -1
- package/dist/{notification-MCABOEFM.js → notification-NTFUPUMY.js} +1 -1
- package/dist/{oneshot-RYWJ6ECA.js → oneshot-TMGTEN3S.js} +1 -1
- package/dist/{position-D7BUAIH4.js → position-D52LXRDT.js} +1 -1
- package/dist/{project-ROLQ535L.js → project-ZGOB5W25.js} +1 -1
- package/dist/{prospect-MOBECADA.js → prospect-AQ7EUU4N.js} +2 -2
- package/dist/receivable-AE44YIJO.js +49 -0
- package/dist/{registry-XXUXBYEE.js → registry-3WV46K26.js} +1 -1
- package/dist/render-MTSSHDAZ.js +3 -0
- package/dist/{report-U2ZFPO33.js → report-TI2DOJGX.js} +1 -1
- package/dist/{run-65ZPZ5FD.js → run-KNZ43HFF.js} +2 -2
- package/dist/{task-KPRX3OQX.js → task-VKVZSF7J.js} +2 -2
- package/dist/{user-VY35MTY3.js → user-KEFI7XZI.js} +2 -2
- package/dist/{workflow-5DFICP3M.js → workflow-4FHTOQZZ.js} +1 -1
- package/package.json +1 -1
- package/dist/attendance-ZWVZGVBE.js +0 -3
- package/dist/chunk-523KROGI.js +0 -3
- package/dist/chunk-6NEQ6PZZ.js +0 -3
- package/dist/chunk-R64SA5WZ.js +0 -6
- package/dist/company-DH4H6HXD.js +0 -161
- package/dist/render-W523YEYF.js +0 -3
- package/dist/sales-2WX46SHN.js +0 -4
package/CHANGELOG.public.md
CHANGED
|
@@ -11,6 +11,22 @@
|
|
|
11
11
|
`CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
|
|
12
12
|
-->
|
|
13
13
|
|
|
14
|
+
## 0.39.0
|
|
15
|
+
|
|
16
|
+
見積を CLI から作成・更新・削除できるようになりました(`twp estimate create` / `update` / `delete`)。社内共有メモ・請求の紐づけ・関連入金・部署按分・案件書類(注文書・個別契約書など)の登録と差替え・ダウンロード、注文書からの注文書番号の読み取りにも対応しました。
|
|
17
|
+
|
|
18
|
+
請求を CLI から作成・更新・削除できるようになりました(`twp invoice create` / `update` / `delete`)。取消(無効)とその解除、統合請求書の作成、社内共有メモ、CSV と MF 会計仕訳の書き出し、請求書メールの送信、支払いリンクの作成にも対応しました。
|
|
19
|
+
|
|
20
|
+
取引契約を CLI から一覧・作成・更新・削除できるようになりました(`twp contract`)。自動請求テンプレートの管理と発行履歴の参照にも対応しました(`twp invoice auto-template`)。有効なテンプレートを作成・更新するときは、次に請求が発行される日を事前に表示します。
|
|
21
|
+
|
|
22
|
+
入金と売掛金を CLI から扱えるようになりました。入金の登録・更新・削除・CSV 出力、請求への引当(CSV での一括を含む)と手数料分の引き上げ、入金予定からの入金と引当のまとめ登録(`twp deposit`)、売掛金残高の表示と CSV 出力、月次の締めと締めの解除(`twp receivable`)に対応しました。
|
|
23
|
+
|
|
24
|
+
## 0.38.0
|
|
25
|
+
|
|
26
|
+
wiki・ノート・議事録を CLI から読めるようになりました(`twp wiki` / `twp note` / `twp meeting`)。`get --output text` で本文を文書として読めます。
|
|
27
|
+
|
|
28
|
+
`twp api` が見積・請求・取引先・顧客などページ番号で返る一覧も最後のページまで自動で辿るようになりました。1ページだけ取得したときは、続きを取るための `--query-param page_no=<N>` を案内します。ページ番号で送れない一覧では1ページ目を返し、全件ではないことをお知らせします。
|
|
29
|
+
|
|
14
30
|
## 0.37.0
|
|
15
31
|
|
|
16
32
|
有給休暇の申請を CLI から行えるようになりました(`twp leave request`)。日付か期間と取得種別を指定すると、有給休暇の申請書で申請を作って提出します。勤怠が締め済みの月には申請を送りません。
|
package/README.md
CHANGED
|
@@ -24,12 +24,13 @@ TWP(Tocca Working Platform)を、ターミナルから使うための CLI
|
|
|
24
24
|
| **できる** | `twp department` / `twp position` / `twp job-title` による組織マスタ(部署・役職・職位)の一覧・取得・作成・更新・削除と、部署ツリー・部署の所属者の表示。作成・更新・削除は管理者の権限が要ります |
|
|
25
25
|
| **できる** | `twp inquiry category` による問い合わせカテゴリの一覧・取得・作成・更新(通知先の設定・末尾への並べ替えを含む)。取得・作成・更新は問い合わせ機能の管理者の権限が要ります |
|
|
26
26
|
| **できる** | `twp notification` による自分宛ての通知の一覧(未読・カテゴリ・語で絞り込み)・詳細・未読件数・カテゴリ一覧と、1件ずつ・まとめての既読化 |
|
|
27
|
-
| **できる** | `twp estimate` / `twp invoice` による販売管理の見積・請求の一覧(語・ステータス・取引先・プロジェクト・担当者・日付・回収状況で絞り込み)と詳細、`twp company` / `twp customer` による取引先企業・顧客の一覧と詳細(名前でも指定できます)、`twp customer` による顧客の登録・更新・削除(担当者・対応履歴ごと。ID を並べたファイルでの一括削除を含む)と担当者・対応履歴の一覧・詳細・登録・更新・削除、全顧客の最近の対応、名刺画像の登録・裏面メモ・削除、企業をまたいだ人物の一覧・詳細・CSV 書き出し、登録前の類似企業検索、`twp company` による取引先企業(仕入先を含む)の登録・更新・削除、`twp prospect` によるアプローチ先(見込客)の一覧・登録・更新・削除・CSV での一括登録と書き出し・重複確認・顧客への昇格と対応履歴の記録。販売管理・顧客管理の権限が要ります |
|
|
27
|
+
| **できる** | `twp estimate` / `twp invoice` による販売管理の見積・請求の一覧(語・ステータス・取引先・プロジェクト・担当者・日付・回収状況で絞り込み)と詳細、`twp estimate` による見積の作成・更新・削除・社内共有メモ・既存の請求の紐づけ・関連入金・部署按分・案件書類(注文書・個別契約書など)の登録・版の差替え・ダウンロードと、注文書からの注文書番号の読み取り、`twp invoice` による請求の作成・更新・削除・取消と取消解除・統合請求書の作成・社内共有メモ・CSV/MF 会計仕訳の書き出し・請求書メールの送信・支払いリンクの作成、`twp contract` による取引契約(見積から作る販売管理の契約)の一覧・詳細・作成・更新・削除、`twp invoice auto-template` による自動請求テンプレートの一覧・詳細・作成・更新・削除と発行履歴の参照(販売管理の管理者)、`twp deposit` による入金の一覧・詳細・登録・更新・削除・CSV 書き出し、請求への引当(CSV での一括を含む)・解除・手数料分の引き上げ、入金予定からの入金と引当のまとめ登録、`twp receivable` による売掛金残高の表示と CSV 書き出し・月次の締めと締めの解除(どちらも販売管理の管理者)、`twp company` / `twp customer` による取引先企業・顧客の一覧と詳細(名前でも指定できます)、`twp customer` による顧客の登録・更新・削除(担当者・対応履歴ごと。ID を並べたファイルでの一括削除を含む)と担当者・対応履歴の一覧・詳細・登録・更新・削除、全顧客の最近の対応、名刺画像の登録・裏面メモ・削除、企業をまたいだ人物の一覧・詳細・CSV 書き出し、登録前の類似企業検索、`twp company` による取引先企業(仕入先を含む)の登録・更新・削除、`twp prospect` によるアプローチ先(見込客)の一覧・登録・更新・削除・CSV での一括登録と書き出し・重複確認・顧客への昇格と対応履歴の記録。販売管理・顧客管理の権限が要ります |
|
|
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
31
|
| **できる** | `twp workflow` による、自分が申請できる申請書・申請書の定義(管理者)・自分の申請・承認履歴・自分の承認待ちの参照(申請書は名前でも指定できます)と、申請の起票・提出・更新・削除、承認・却下・差し戻し・取下げ |
|
|
32
32
|
| **できる** | `twp report` による自分のレポート(日報)の一覧(フォーマット・状態・語で絞り込み)・詳細と、下書きの作成(フォーマットの入力項目から雛形を出せます)・更新・提出、使えるレポートフォーマットの一覧 |
|
|
33
|
+
| **できる** | `twp wiki` / `twp note` / `twp meeting` による、wiki ページ(親ページ直下の子の一覧を含む)・ノート・議事録(開催日の期間で絞り込み)の一覧と、本文を `--output text` で文書として読むこと |
|
|
33
34
|
| **できる** | `twp task-loop` による、TWP のタスクキューを手元の AI CLI に実行させる常駐ループ |
|
|
34
35
|
| **できる** | `twp agent-loop` による、エージェントループのキューの一覧・投入・更新・先頭への移動・削除と、期間を指定した実行履歴の参照。更新・移動・削除はテナントの管理者の権限が要ります |
|
|
35
36
|
| **できる** | `twp completion bash` / `zsh` / `fish` / `powershell` によるシェル補完(コマンド名・操作名・フラグ名。プロジェクトやステータスの値は補完しません)と、`twp configure` による既定のプロジェクト・出力形式・既定プロファイルの対話設定 |
|
|
@@ -366,9 +367,124 @@ twp customer get <顧客>
|
|
|
366
367
|
- `get <見積ID>` / `get <請求ID>` は一覧の `id` 列の数字です。見積番号・請求番号で探すなら `list --keyword <番号>` を使ってください
|
|
367
368
|
- 請求の一覧は画面と同じく、統合請求書を本体1行で出し、統合元の請求はその `children` に入ります
|
|
368
369
|
- 一覧は **ページ番号で辿ります**(`--cursor` はページ番号・`--limit` は1ページの件数でサーバの上限は100)。並びは登録の新しい順(ID の降順)に固定しています。絞り込み全体の件数と合計金額は stderr に出ます
|
|
369
|
-
-
|
|
370
|
+
- 画面にあるそれ以外の絞り込み(確度・見積区分・部署など)はまだありません(見積・請求の書き込みは次の2節、顧客・取引先はその次の節。`twp api /api/v2/sales/estimates --query-param reliability_list=A` のように到達できます。`twp api` はこの一覧も最後のページまで自動で辿ります。1ページだけなら `--no-paginate`、特定のページだけなら `--query-param page_no=2 --no-paginate` と指定します)
|
|
370
371
|
- ヘルプは `twp estimate help` / `twp invoice help` / `twp company help` / `twp customer help`
|
|
371
372
|
|
|
373
|
+
### 見積を書く
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
twp estimate create --generate-cli-skeleton --output json > estimate.json
|
|
377
|
+
twp estimate create --content-file estimate.json
|
|
378
|
+
twp estimate update <見積ID> --generate-cli-skeleton --output json > estimate.json
|
|
379
|
+
twp estimate update <見積ID> --content-file estimate.json
|
|
380
|
+
twp estimate delete <見積ID> --yes
|
|
381
|
+
twp estimate memo <見積ID> (--text <本文> | --text-file <パス> | --clear)
|
|
382
|
+
twp estimate link-invoice <見積ID> (--invoice <請求番号> | --invoice-id <請求ID>) --yes
|
|
383
|
+
twp estimate deposits <見積ID>
|
|
384
|
+
twp estimate allocation list <見積ID>
|
|
385
|
+
twp estimate allocation set <見積ID> --split <部署>=<金額> [--split <部署>=<金額>]... --yes
|
|
386
|
+
twp estimate allocation delete <見積ID> --yes
|
|
387
|
+
twp estimate case-document list|get [<書類ID>] --estimate <見積ID>
|
|
388
|
+
twp estimate case-document create --estimate <見積ID> --file <パス> --type order_form|individual_contract|other --name <書類名>
|
|
389
|
+
twp estimate case-document add-version <書類ID> --estimate <見積ID> --file <パス>
|
|
390
|
+
twp estimate case-document update <書類ID> --estimate <見積ID> [--name <書類名>] [--type <種別>]
|
|
391
|
+
twp estimate case-document delete <書類ID> --estimate <見積ID> --yes
|
|
392
|
+
twp estimate case-document download <書類ID> --estimate <見積ID> --out <パス> [--rev <版番号>] [--force]
|
|
393
|
+
twp estimate scan-order-form --file <パス> --yes
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
- **見積の内容は JSON ファイル(`--content-file`)で渡します。** キーは画面の入力項目と同じ名前(`title` / `estimate_date` / `details` など)で、`--generate-cli-skeleton` がひな形を出し、各キーに渡せる値を stderr に並べます。**サーバに無いキー(打ち間違いを含む。明細・送付先の中も)は、送る前にすべて挙げて止めます**(サーバは知らないキーを黙って捨てるため)。値の誤りはサーバが断り、その理由をそのまま出します
|
|
397
|
+
- `update --generate-cli-skeleton` は今の見積から書き込める項目だけを出します。**変えない項目は消してから送ってください**——`details`(明細)と `recipients`(送付先)は送ると丸ごと置き換わります。`status` を `in_progress` にすると承認申請になります
|
|
398
|
+
- **見積区分を `formal`(正式)にすると、保存したときにサーバが請求を自動で作ります。** 送る前に stderr で知らせます。削除は、契約か人が作った請求が紐づいているとサーバが断ります(自動作成の未確定の請求は見積と一緒に消えます)
|
|
399
|
+
- `memo` は見積一覧のメモ欄(社内共有メモ・5,000 文字まで)だけを書き換えます。見積本体の保存を伴わないので、確定済みの見積にも書けます
|
|
400
|
+
- `link-invoice` は既存の請求の「紐づく見積」を付け替えます。別の見積に紐づいていた請求は、前の見積からの自動反映が外れて戻らないため `--yes` が要ります。請求は `--invoice`(請求番号)か `--invoice-id`(ID)で指定し、送る前に対象の請求と今の紐づけ先を stderr に出します
|
|
401
|
+
- `deposits` は販売管理の「管理者」だけが見られます(金額はこの見積の請求へ引き当てた分だけです)
|
|
402
|
+
- **部署按分(`allocation set`)は全件の置き換えです。** 按分金額の合計は見積金額(税込)と一致させます(一致しなければ送る前に止めます)。割合は画面と同じ式で CLI が計算します。`--dry-run` で置換前と置換後が見られます
|
|
403
|
+
- **案件書類(`case-document`)は見積に紐づく注文書・個別契約書・その他の書類です。** PDF・画像(JPEG/PNG)・Office(Word/Excel)を登録でき、形式の合わないファイルは送る前に止めます。登録・差替え・更新は**顧客管理**の「編集者」以上、削除は「管理者」です(販売管理の権限ではありません)。容量検査・差替え・ダウンロードの扱いは顧客の契約書と同じです
|
|
404
|
+
- **`scan-order-form` はテナントの AI クレジットを消費するので `--yes` が要ります。** 読み取った注文書番号は候補で、見積は変わりません(見積へ入れるなら `update` で `order_no` を送ります)
|
|
405
|
+
- 見積の作成・更新・削除・メモ・紐づけ・按分・注文書の読み取りは販売管理の「メンバー」以上の権限が要ります
|
|
406
|
+
- ヘルプは `twp estimate help` / `twp estimate allocation help` / `twp estimate case-document help`
|
|
407
|
+
|
|
408
|
+
### 請求を書く・出力する・送る
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
twp invoice create --generate-cli-skeleton --output json > invoice.json
|
|
412
|
+
twp invoice create --content-file invoice.json
|
|
413
|
+
twp invoice update <請求ID> --generate-cli-skeleton --output json > invoice.json
|
|
414
|
+
twp invoice update <請求ID> --content-file invoice.json
|
|
415
|
+
twp invoice delete <請求ID> --yes
|
|
416
|
+
twp invoice cancel <請求ID> (--reason <理由> | --reason-file <パス>) --yes
|
|
417
|
+
twp invoice uncancel <請求ID> --yes
|
|
418
|
+
twp invoice consolidate --invoices <ID,ID,…> [--title <件名>] --yes
|
|
419
|
+
twp invoice memo <請求ID> (--text <本文> | --text-file <パス> | --clear)
|
|
420
|
+
twp invoice export --out <パス.csv> [--force] [--format csv|mf-journal] [--debit-account <科目>] [--credit-account <科目>] [一覧と同じ絞り込み]
|
|
421
|
+
twp invoice send <請求ID> --to <メール> [--to <メール>]... [--cc <メール>]... [--message <本文>] --yes
|
|
422
|
+
twp invoice payment-link <請求ID> --yes
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
- **請求の内容は見積と同じく JSON ファイル(`--content-file`)で渡します。** `--generate-cli-skeleton` がひな形と各キーに渡せる値を出し、サーバに無いキーは送る前にすべて挙げて止めます。`estimate_id`(見積から作る)・`invoice_no_rule_id`(採番)・`direct_create`(見積を自動作成)は作成のときだけ指定できます
|
|
426
|
+
- `update` の `details`(明細)と `recipients`(送付先)は送ると丸ごと置き換わります。`status` を `in_progress` にすると承認申請になります
|
|
427
|
+
- **`cancel` は請求を取消(無効)にします。** 発行した事実と内容は残したまま、売掛金・収支のどの集計にも数えられなくなります。理由は必須で、実行者・日時とともに記録されます。`uncancel`(`--yes` が要ります。取消の記録は消えます)で取消前のステータスへ戻せます。どちらも販売管理の「管理者」の権限が要ります。入金が引き当て済み・承認申請中・失注の請求はサーバが断ります
|
|
428
|
+
- **`consolidate` は同じ取引先の請求を1枚の統合請求書にまとめます。** 統合元の請求は消えずに残り、一覧では統合請求書の `children` に移ります。統合を取り消す API は無いので `--yes` が要ります。送る前に統合元の請求と合計を stderr に出します
|
|
429
|
+
- `export` は一覧と同じ絞り込みで CSV を書き出します(既定は画面の「CSV出力」と同じ請求一覧)。`--format mf-journal` は画面の「MF会計仕訳CSV出力」と同じで、絞り込みに当たる請求のうち**保管済だけ**を取引先ごとに合算した仕訳です。並びは一覧と同じ ID の降順です。既存のファイルは上書きしません(上書きするなら `--force`)
|
|
430
|
+
- **`send` は請求書 PDF を添付したメールを実際に送ります。** 取り消せないので `--yes` が要り、送る前に宛先・写し・件名・添付の名前を stderr に出します(`--dry-run` なら出すだけで送りません)。宛先は画面と同じく毎回指定します
|
|
431
|
+
- **`payment-link` は顧客が実際に支払える決済ページ(Stripe)を作り、URL を出します。** 金額は請求の残額です。作り直しても前のリンクは失効しません。`--yes` が要ります。送信・リンク作成の結果を受け取れなかったときは、実行された可能性を stderr に出します
|
|
432
|
+
- `delete` は入金が引き当てられている請求をサーバが断ります。統合請求書を消しても統合元の請求は残ります
|
|
433
|
+
- 取消・取消解除以外は販売管理の「メンバー」以上の権限が要ります。ヘルプは `twp invoice help`
|
|
434
|
+
|
|
435
|
+
### 取引契約と自動請求
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
twp contract list [--keyword <語>] [--status <ステータス>]... [--customer <取引先>] [--project <コード|ID>] [--estimate <見積ID>] [--from <日付>] [--to <日付>] [--all] [--limit <件数>]
|
|
439
|
+
twp contract get <契約ID>
|
|
440
|
+
twp contract create --generate-cli-skeleton --estimate <見積ID> --output json > contract.json
|
|
441
|
+
twp contract create --content-file contract.json
|
|
442
|
+
twp contract update <契約ID> (--generate-cli-skeleton | --content-file <パス>)
|
|
443
|
+
twp contract delete <契約ID> --yes
|
|
444
|
+
twp invoice auto-template list [--keyword <語>] [--active true|false] [--customer <取引先>] [--all] [--limit <件数>]
|
|
445
|
+
twp invoice auto-template get <テンプレートID>
|
|
446
|
+
twp invoice auto-template create (--generate-cli-skeleton | --content-file <パス>)
|
|
447
|
+
twp invoice auto-template update <テンプレートID> (--generate-cli-skeleton | --content-file <パス>)
|
|
448
|
+
twp invoice auto-template delete <テンプレートID> --yes
|
|
449
|
+
twp invoice auto-template history (<テンプレートID> | --all-templates) [--status success|error|skipped]... [--from <日付>] [--to <日付>] [--all] [--limit <件数>]
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
- **`twp contract` は見積から作る取引の契約です**(明細・金額を持ち、承認ワークフローに乗ります)。顧客に紐づけて保管する契約書の PDF は別物で、`twp customer contract` で扱います
|
|
453
|
+
- 契約の内容は見積・請求と同じく JSON ファイル(`--content-file`)で渡します。ひな形は元の見積の件名と明細を写します。元の見積(`estimate_id`)は作成のときだけ指定でき、取引先・プロジェクトは見積から決まります。請求が紐づいた契約の削除はサーバが断ります
|
|
454
|
+
- **有効な自動請求テンプレートは、毎日 4:00(日本時間)のバッチで本物の見積と請求を発行します。** `is_active` を省いて作ると有効になります。作成・更新の前に、いつ発行されるかを stderr に出します(`--dry-run` でも出ます)。ひな形は無効(`is_active: false`)で出ます
|
|
455
|
+
- 画面にある「期間の月・日」の項目(`period_*_months` / `period_*_day`)はサーバが保存しないので、CLI は送る前に止めます
|
|
456
|
+
- 自動請求テンプレートと発行履歴は販売管理の「管理者」、取引契約は「メンバー」以上の権限が要ります。ヘルプは `twp contract help` / `twp invoice auto-template help`
|
|
457
|
+
|
|
458
|
+
### 入金・売掛金を扱う(販売管理の管理者)
|
|
459
|
+
|
|
460
|
+
```
|
|
461
|
+
twp deposit list [--keyword <語>] [--customer <取引先>] [--allocation <引当状態>]... [--from <入金日>] [--to <入金日>] [--invoice-from <請求日>] [--invoice-to <請求日>] [--all]
|
|
462
|
+
twp deposit get <入金ID>
|
|
463
|
+
twp deposit create --payee <振込先ID> --date <入金日> --amount <円> [--customer <取引先>] [--memo <備考>] [--excess-reason <過不足理由>] [--excess-amount <円>]
|
|
464
|
+
twp deposit update <入金ID> [項目…] [--clear <項目>]...
|
|
465
|
+
twp deposit delete <入金ID> --yes
|
|
466
|
+
twp deposit export --out <パス.csv> [絞り込み…]
|
|
467
|
+
twp deposit allocation list <入金ID>
|
|
468
|
+
twp deposit allocation add <入金ID> (--invoice-id <請求ID> | --invoice <請求番号>) --amount <円>
|
|
469
|
+
twp deposit allocation add <入金ID> --file <「請求ID,金額」の CSV>
|
|
470
|
+
twp deposit allocation remove <入金ID> <引当ID> --yes
|
|
471
|
+
twp deposit allocation fill <入金ID> --yes
|
|
472
|
+
twp deposit plan list --from <支払期日> --to <支払期日> [--customer <取引先>] [--status <ステータス>]...
|
|
473
|
+
twp deposit plan register --generate-cli-skeleton --from <支払期日> --to <支払期日> --output json > plan.json
|
|
474
|
+
twp deposit plan register --content-file plan.json
|
|
475
|
+
twp receivable list [--month <YYYY-MM>] [--customer <取引先>] [--department <部署>] [--negative-only]
|
|
476
|
+
twp receivable export --out <パス.csv> [--type detail|summary] [--month <YYYY-MM>]
|
|
477
|
+
twp receivable closing list | get <YYYY-MM>
|
|
478
|
+
twp receivable closing close <YYYY-MM> --yes
|
|
479
|
+
twp receivable closing reopen <YYYY-MM> --yes
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
- **一括の引当(`--file`)と入金予定からの登録は、全件成功か全件失敗です。** 送る前に全行を検査し、誤りが1つでもあれば1件も送りません。断られたときは何も登録されていないので、直して同じコマンドを打ち直します。応答を受け取れなかったときは、打ち直す前に `twp deposit allocation list` / `twp deposit list` で登録されたかを確かめてください(打ち直すと二重に登録されます)
|
|
483
|
+
- 入金予定のひな形は画面の初期状態と同じ(取引先ごとの全請求を未入金残の全額で引き当て、振込先は前回のもの)です。着金額が違う取引先は `deposit_amount` と `excess_reason` を書き足してから渡します
|
|
484
|
+
- `allocation fill` は、過不足理由(振込手数料など)を後から登録したときに手数料の分を既存の引当へ足します(引当を消して入れ直さずに済みます)
|
|
485
|
+
- **締め(`closing close`)はテナント全体の月次の確定値です。** 締めた月の入金は、登録・入金日の変更・削除・引当の変更をサーバが断ります(請求は締めの対象外)。締める前に、締める月の現在値と前月の締めとの差異を表示します(`--dry-run` でも出ます)。解除(`closing reopen`)すると確定値は消えます
|
|
486
|
+
- 負の過不足金額は `--excess-amount=-500` のように `=` でつないで渡します。ヘルプは `twp deposit help` / `twp receivable help`
|
|
487
|
+
|
|
372
488
|
### 顧客を登録・更新・削除する
|
|
373
489
|
|
|
374
490
|
```
|
|
@@ -412,7 +528,7 @@ twp company delete <取引先> --yes
|
|
|
412
528
|
- **`twp company delete` は担当者を消しません**(対応履歴だけサーバが併せて消します)。担当者が残る取引先は送る前に止め、`twp customer delete` を案内します
|
|
413
529
|
- `twp customer search-similar` は顧客だけでなく仕入先だけの取引先も当てます
|
|
414
530
|
- **契約書(`contract create` / `add-version`)は PDF のアップロードと登録を1コマンドで行います。** 送る前にテナントの容量を検査し、超過なら何も送りません。PDF 以外(名前が `.pdf` で終わらない・中身の先頭が `%PDF-` でない)はサーバも受け付けないので、送る前に止めます。差替えは新しい版として足され、過去版は `contract get` の `versions` に残り `download --rev <版番号>` で取り出せます。登録・差替え・更新は顧客管理の「編集者」以上、削除は「管理者」です。**契約書が残っている顧客はサーバが削除を断る**ので、顧客を消す前に `contract delete` で消してください
|
|
415
|
-
- 案件書類(`case-document list
|
|
531
|
+
- 案件書類(`case-document list`)は見積をまたいだ一覧だけです(登録・差替え・削除・ダウンロードは見積ごとの操作で、`twp estimate case-document` で行います)。案件書類が残る顧客もサーバが削除を断るので、その顧客は `twp estimate case-document delete` で案件書類を片付けてから削除してください
|
|
416
532
|
- 施策(`campaign`)の作成・更新・削除は顧客管理の「管理者」だけです。**サーバは担当者・アプローチ先からの参照を検査せずに削除する**ので、参照を残したまま止めるなら `--active false` で無効にしてください
|
|
417
533
|
- タグ・施策の紐づけはまだありません(`twp api /api/v2/customers/<顧客ID>/contacts/<担当者ID>` に `tags` / `campaign_ids` を送って到達できます)
|
|
418
534
|
- ヘルプは `twp customer delete help` / `twp customer contact help` / `twp customer interaction help` / `twp customer business-card help` / `twp customer people help` / `twp customer contract help` / `twp customer case-document help` / `twp customer campaign help` / `twp company help`
|
|
@@ -567,6 +683,25 @@ twp report submit <レポートID> # 提
|
|
|
567
683
|
- 添付ファイル・動画・タスク参照・申請参照の項目の値はこの CLI では作れません(画面で入力してください)。確認・差し戻し・コメントは `twp api /api/v2/reports/...` で到達できます
|
|
568
684
|
- ヘルプは `twp report help`
|
|
569
685
|
|
|
686
|
+
### wiki・ノート・議事録を読む
|
|
687
|
+
|
|
688
|
+
```bash
|
|
689
|
+
twp wiki list [--project <コード|ID>] [--status <draft|published>] [--tag <タグ>] [--keyword <語>] [--all]
|
|
690
|
+
twp wiki list [--project <コード|ID>] --parent <ページID>|root # 親ページ直下の子(root で最上位)
|
|
691
|
+
twp wiki get <ページID> --output text
|
|
692
|
+
twp note list [--mine] [--favorite] [--status <draft|published>] [--visibility <private|tenant|external|public>] [--keyword <語>] [--all]
|
|
693
|
+
twp note get <ノートID> --output text
|
|
694
|
+
twp meeting list [--from <YYYY-MM-DD>] [--to <YYYY-MM-DD>] [--project <コード|ID>] [--keyword <語>] [--tag <タグ>]... [--all]
|
|
695
|
+
twp meeting get <議事録ID> --output text
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
- `get --output text` は本文を読むための文書(見出し・メタ情報・本文)を出します。HTML と議事録エディタの内容は平文にし、見出し・箇条書き・リンクは Markdown 風に残します。サーバの原文は `--output json` で取れます
|
|
699
|
+
- 議事録の文書にはアジェンダ・議事メモ・決定事項・アクションアイテム・AI 要約が入ります。文字起こしは長いので入れません(`--query transcript` で取れます)
|
|
700
|
+
- wiki はプロジェクトごとです(`--project` を省くと既定のプロジェクト)。`--parent` は他の絞り込み・ページングと併用できません
|
|
701
|
+
- `twp meeting list` の `--from` / `--to` は開催日(日本時間の日付)の期間で、両端の日を含み、片方だけでも指定できます。`--keyword` はタイトルの語です
|
|
702
|
+
- `twp note get` で開くと、画面で開いたときと同じくノートの閲覧数が1増えます
|
|
703
|
+
- 書き込み(作成・更新)はまだできません(`twp api /api/v2/wiki/...`・`/api/v2/notes/...`・`/api/v2/meetings/...` で到達できます)。ヘルプは `twp wiki help` / `twp note help` / `twp meeting help`
|
|
704
|
+
|
|
570
705
|
### Backlog の課題を読む・書く
|
|
571
706
|
|
|
572
707
|
TWP に登録した Backlog スペースを通して、課題とコメントを読み、課題へ書きます。
|
|
@@ -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-VCZVITWG.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-
|
|
3
|
+
import{stepToItem}from"./chunk-VCZVITWG.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-5R4SEO3I.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-ZN5EFDH7.js";import{acknowledgement,isRecord,pick}from"./chunk-ZWVYVS2A.js";
|
|
4
4
|
import{ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.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,6 +1,6 @@
|
|
|
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{
|
|
3
|
+
import{failureHint,isAuthError,isCliFatalText,isRateLimited,isServerAiType,isUntrusted,maxTurnsReached,rateLimitWaitSeconds,tailForScan}from"./chunk-ZOOEH7ZE.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-L52XJFJR.js";import"./chunk-QWSXHHFT.js";import"./chunk-VK2Z4QGC.js";import{detectAiClis}from"./chunk-T4QZO6RQ.js";import"./chunk-P4AEFKLM.js";import"./chunk-VRBI2NPI.js";import"./chunk-J7QYPKVK.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
|
|
4
4
|
import{isForceOnly,killProcessTree,system32}from"./chunk-N2UVRM3Z.js";import{DEFAULT_CLAUDE_LAUNCHER,activeSlotPath,detectClaudeAutoSwitch,isClaudeAi,isUsableModelId,modelFitsRoute,resolveSpawnTarget,usesBedrock,wrapWithAutoSwitch}from"./chunk-AEJHDFXB.js";import"./chunk-GY7KI5E5.js";import"./chunk-7WSNIXTQ.js";import{findExecutable,isWindowsDriveAbsolute}from"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.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\
|
|
@@ -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-
|
|
4
|
-
import{parseOperationArgs,repeatedValues}from"./chunk-IOGVQVGD.js";import"./chunk-
|
|
5
|
-
import{HELP_TOKEN}from"./chunk-
|
|
6
|
-
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-C7UDUHQZ.js";import"./chunk-TLN3JSEC.js";import{evaluateQuery}from"./chunk-GDM2QUBL.js";import{renderOutput}from"./chunk-FEOST3GF.js";import{redactSecretValues,withDebug}from"./chunk-BUZKNZ45.js";import{readBody}from"./chunk-HGTG5XQ7.js";
|
|
4
|
+
import{parseOperationArgs,repeatedValues}from"./chunk-IOGVQVGD.js";import"./chunk-ELXDRPDV.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-IF2K4PM5.js";import"./chunk-GMBJTG6A.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-I4ARX6NM.js";import{AuthSession,NotLoggedInError,SessionExpiredError,loadCredentials}from"./chunk-XNLIEUAW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{effectiveApiUrl,resolveConfiguredOutput,resolveProfile}from"./chunk-4VZKNEVN.js";
|
|
5
|
+
import{HELP_TOKEN}from"./chunk-UVUVEL3B.js";import"./chunk-QQRJLH6B.js";import{OUTPUT_FORMATS,resolveOutputFormat}from"./chunk-K2ONOH3L.js";import"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{DEFAULT_MAX_ITEMS,DEFAULT_MAX_PAGES,envelopePaging,isPageNumberEnvelope,pageRangeNotes,positiveInteger,readEnvelopeCursor,readPageNumberCursor,shellQuote}from"./chunk-5R4SEO3I.js";import"./chunk-II5RVJQN.js";import{ApiResponseError,
|
|
6
|
+
EXIT_OK,NetworkError,UsageError}from"./chunk-7WSNIXTQ.js";import"./chunk-RZVI6PMW.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.
|
|
@@ -58,6 +58,9 @@ map(result=>result.target)}}return[]}var API_COMMAND_HELP=`twp api \u2014 API \u
|
|
|
58
58
|
\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0:
|
|
59
59
|
\u4E00\u89A7\u306E GET \u306F\u3001\u65E2\u5B9A\u3067\u6700\u5F8C\u306E\u30DA\u30FC\u30B8\u307E\u3067\u8FBF\u3063\u30661\u3064\u306E\u5FDC\u7B54\u306B\u307E\u3068\u3081\u307E\u3059\uFF08\u5224\u5B9A\u306F has_more \u3068
|
|
60
60
|
next_cursor \u3060\u3051\u3067\u3001total \u306F\u8AAD\u307F\u307E\u305B\u3093\uFF09\u3002\u8FBF\u3063\u305F\u30DA\u30FC\u30B8\u6570\u3068\u4EF6\u6570\u306F stderr \u3078\u51FA\u307E\u3059\u3002
|
|
61
|
+
\u30DA\u30FC\u30B8\u756A\u53F7\u3067\u8FD4\u3059\u4E00\u89A7\uFF08{list, page_no, page_sum}\u30FB\u898B\u7A4D\u30FB\u8ACB\u6C42\u30FB\u53D6\u5F15\u5148\u30FB\u9867\u5BA2\u7B49\uFF09\u306F page_no \u3067\u8FBF\u308A\u3001
|
|
62
|
+
\u7D9A\u304D\u306F --query-param page_no=<N> \u3067\u6307\u5B9A\u3057\u307E\u3059\uFF08--starting-token \u306F\u52B9\u304D\u307E\u305B\u3093\uFF09\u3002
|
|
63
|
+
page_no \u3067\u30DA\u30FC\u30B8\u3092\u9001\u308C\u306A\u3044\u4E00\u89A7\u306F1\u30DA\u30FC\u30B8\u76EE\u3060\u3051\u3092\u8FD4\u3057\u3001\u5168\u4EF6\u3067\u306F\u306A\u3044\u3053\u3068\u3092 stderr \u3078\u51FA\u3057\u307E\u3059\u3002
|
|
61
64
|
--max-items <\u4EF6\u6570> \u8FBF\u308B\u4E0A\u9650\u4EF6\u6570\uFF08\u65E2\u5B9A ${DEFAULT_MAX_ITEMS}\uFF09\u3002\u4E0A\u9650\u306B\u9054\u3057\u305F\u3089\u3001\u5168\u4EF6\u3067\u306F\u306A\u3044\u3053\u3068\u3092
|
|
62
65
|
\u660E\u793A\u3057\u3066\u6B62\u307E\u308A\u3001\u90E8\u5206\u7684\u306A\u7D50\u679C\u306F\u51FA\u3057\u307E\u305B\u3093\uFF08\u518D\u958B\u7528\u306E\u30AB\u30FC\u30BD\u30EB\u306F stderr \u306B\u51FA\u307E\u3059\uFF09
|
|
63
66
|
--starting-token <\u30AB\u30FC\u30BD\u30EB> \u3053\u306E\u30AB\u30FC\u30BD\u30EB\uFF08\u524D\u56DE\u306E next_cursor\uFF09\u304B\u3089\u53D6\u5F97\u3092\u59CB\u3081\u307E\u3059
|
|
@@ -73,7 +76,8 @@ ${GLOBAL_OPTIONS_HELP}
|
|
|
73
76
|
\u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9>"},{name:"--generate-cli-skeleton",summary:"--cli-input-json \u3078\u6E21\u3059\u5165\u529B\u3072\u306A\u5F62\u3092\u51FA\u529B\u3057\u3066\u7D42\u4E86\u3059\u308B",takesValue:false},{name:"--query-param",summary:"\u30AF\u30A8\u30EA\u5F15\u6570\uFF08k=v\u30FB\u8907\u6570\u6307\u5B9A\u53EF\uFF09",takesValue:true,placeholder:"<k=v>",repeatable:true},NO_REDACT_FLAG,{name:"--max-items",summary:`\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0\u306E\u4E0A\u9650\u4EF6\u6570\uFF08\u65E2\u5B9A ${DEFAULT_MAX_ITEMS}\
|
|
74
77
|
\u30FB\u8D85\u3048\u305F\u3089\u5168\u4EF6\u3067\u306F\u306A\u3044\u3068\u660E\u793A\u3057\u3066\u6B62\u307E\u308B\uFF09`,takesValue:true,placeholder:"<\u4EF6\u6570>"},{name:"--starting-token",summary:"\u3053\u306E\u30AB\u30FC\u30BD\u30EB\uFF08\u524D\u56DE\u306E next_cursor\uFF09\u304B\u3089\u53D6\u5F97\u3092\u59CB\u3081\u308B",takesValue:true,placeholder:"<\u30AB\u30FC\u30BD\u30EB>"},{name:"--no-paginate",summary:"\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0\u3092\u305B\u305A1\u30DA\u30FC\u30B8\u3060\u3051\u53D6\u5F97\u3059\u308B",
|
|
75
78
|
takesValue:false},{name:"--no-validate",summary:"\u9001\u4FE1\u524D\u306E\u30B9\u30AD\u30FC\u30DE\u691C\u8A3C\u3092\u884C\u308F\u306A\u3044\uFF08\u691C\u8A3C\u304C\u8AA4\u3063\u3066\u62D2\u3080\u3068\u304D\u7528\uFF09",takesValue:false}];var API_PAGING_VOCABULARY={mode:"\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0",resumeFlag:"--starting-token",capAdvice:"--query-param limit=<\u4EF6\u6570> \u30671\u30DA\u30FC\u30B8\u306E\u4EF6\u6570\u3092\u5897\u3084\u3057\u3066\u5F80\u5FA9\u3092\u6E1B\u3089\u3059\u304B\u3001--max-items \u3092\u4E0A\u3052\u3066\u304F\u3060\u3055\u3044\u3002"};
|
|
76
|
-
var
|
|
79
|
+
var PAGE_NUMBER_API_PAGING_VOCABULARY={mode:"\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0",resumeFlag:"--query-param",capAdvice:"--query-param page_limit=100 \u30671\u30DA\u30FC\u30B8\u306E\u4EF6\u6570\u3092\u5897\u3084\u3057\u3066\u5F80\u5FA9\u3092\u6E1B\u3089\u3059\u304B\u3001--max-items \u3092\u4E0A\u3052\u3066\u304F\u3060\u3055\u3044\u3002",resume:page=>pageNumberResume(page)};function pageNumberResume(page){return`--query-param ${shellQuote(`${PAGE_NUMBER_PARAM}=${page}`)}`}var PAGE_NUMBER_ITEMS_KEY="\
|
|
80
|
+
list";var PAGE_NUMBER_PARAM="page_no";var ENVELOPE_ITEMS_KEY="items";var CURSOR_PARAM="cursor";var SUGGESTION_LIMIT=5;var MAX_BODY_CHARS=1e6;function normalizeApiPath(raw){const trimmed=raw.trim();if(trimmed==="")throw new UsageError("\u30D1\u30B9\u304C\u7A7A\u3067\u3059","\u4F8B: twp api /v2/projects");if(/^https?:\/\//i.test(trimmed)){throw new UsageError(`\u30D1\u30B9\u306B URL \u306F\u6E21\u305B\u307E\u305B\u3093: ${trimmed}`,"\u63A5\u7D9A\u5148\u306F\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u304C\u6C7A\u3081\u307E\u3059\u3002\u30D1\u30B9\u3060\u3051\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: /v2/projects\uFF09\u3002")}
|
|
77
81
|
const hashIndex=trimmed.indexOf("#");const withoutHash=hashIndex===-1?trimmed:trimmed.slice(0,hashIndex);const queryIndex=withoutHash.indexOf("?");const pathPart=queryIndex===-1?withoutHash:withoutHash.slice(0,queryIndex);const queryPart=queryIndex===-1?void 0:withoutHash.slice(queryIndex+1);const withSlash=pathPart.startsWith("/")?pathPart:`/${pathPart}`;const path=withSlash.toLowerCase().startsWith("/api/")?withSlash:`/api${withSlash}`;return{path,query:queryPart===void 0||queryPart===""?void 0:
|
|
78
82
|
queryPart}}function parseMethod(raw){if(raw===void 0)return"GET";const upper=raw.trim().toUpperCase();if(API_METHODS.includes(upper))return upper;throw new UsageError(`--method \u306B\u300C${raw}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${API_METHODS.join(" / ")} \u3067\u3059\u3002`)}function parseQueryParams(values){const out={};for(const raw of values){const index=raw.indexOf("=");if(index<=0){throw new UsageError(`--query-param \u306F k=v \u306E\
|
|
79
83
|
\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,"\u4F8B: --query-param limit=10 --query-param keyword=\u4F1A\u8B70")}const key=raw.slice(0,index);if(Object.prototype.hasOwnProperty.call(out,key)){throw new UsageError(`--query-param ${key} \u304C\u8907\u6570\u56DE\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059`)}out[key]=raw.slice(index+1)}return out}function parseQueryString(raw){if(raw===void 0)return{};const out={};for(const[key,value]of new URLSearchParams(raw))out[key]=
|
|
@@ -94,9 +98,13 @@ profile.name);const apiUrl=effectiveApiUrl(profile,stored?.api_url);writeErr(`\u
|
|
|
94
98
|
`);for(const note of model.notes)writeErr(`${stripTerminalControls(note)}
|
|
95
99
|
`);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}
|
|
96
100
|
`)}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);let responseBody;try{responseBody=await client.request(plan.method,appendQuery(plan.path,plan.query),plan.body)}catch(err){if(err instanceof ApiError||
|
|
97
|
-
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})}
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
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 pageNumbered=method==="GET"&&isPageNumberList(responseBody,paging.resultPath);const sentPage=pageNumberOf(paging.startingToken??plan.query[PAGE_NUMBER_PARAM]);const firstState=pageNumbered?readPageNumberState(responseBody,sentPage):null;if(paging.startingToken!==void 0&&firstState?.kind===
|
|
102
|
+
"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}=<\u30DA\u30FC\u30B8\u756A\u53F7> \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
|
|
103
|
+
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}),maxPages:DEFAULT_MAX_PAGES,maxItems:paging.maxItems,firstPage:responseBody,vocabulary:mode.kind===
|
|
104
|
+
"page"?PAGE_NUMBER_API_PAGING_VOCABULARY:API_PAGING_VOCABULARY});responseBody=paged.body}catch(err){if(!(err instanceof PageNoIgnoredError))throw err;pageNoIgnored=err}}const source=noRedact?responseBody:redactSecretValues(responseBody);const value=globals.query===void 0?source:await evaluateQuery(globals.query,source);writeOut(line(renderOutput(value,format,noRedact)));if(paged!==void 0&&paged.pages>1){writeErr(`\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0: ${paged.pages} \u30DA\u30FC\u30B8\u3092\u8FBF\u3063\u3066 ${paged.
|
|
105
|
+
count} \u4EF6\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002
|
|
106
|
+
`)}if(paged===void 0&&method==="GET"){const note=pageNoIgnored!==void 0?pageNumberNote(pageNoIgnored.state,null):firstState!==null?pageNumberNote(firstState,paging.notPagedReason):continuationNote(responseBody,paging);if(note!==null)writeErr(`${stripTerminalControls(note)}
|
|
107
|
+
`)}if(pageNumbered){for(const note of pageRangeNotes(responseBody,`--query-param ${PAGE_NUMBER_PARAM}`))writeErr(`\u6CE8\u8A18: ${stripTerminalControls(note)}
|
|
100
108
|
`)}return EXIT_OK}catch(err){const code=exitCodeFor(err);reportError(err,format,code);return code}}function dryRunValue(apiUrl,plan){const value={method:plan.method,url:`${apiUrl}${appendQuery(plan.path,plan.query)}`};if(plan.body!==void 0)value["body"]=plan.body;return value}var NOT_APPLIED="\u30B9\u30AD\u30FC\u30DE\u691C\u8A3C\u3068\u81EA\u52D5\u30DA\u30FC\u30B8\u30F3\u30B0\u306F\u884C\u3044\u307E\u305B\u3093\u3002";async function resolveModel(method,path){const modelPath=path.replace(/^\/api(?=\/)/i,
|
|
101
109
|
"");try{const routes=await loadCommandModelRoutes();const found=lookupRoute(routes,method,modelPath);if(found.kind==="matched"){const operation=pickOperation((await loadCommandModelDomain(found.domain)).operations,method,found.template);if(operation!==null)return{operation,unmatched:null,template:found.template,notes:[]};return{operation:null,unmatched:"\u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\u306E\u7D22\u5F15\u3068\u5B9A\u7FA9\u304C\u98DF\u3044\u9055\u3063\u3066\u3044\u308B\u305F\u3081",template:null,
|
|
102
110
|
notes:[`\u6CE8\u8A18: \u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\u306E\u7D22\u5F15\u3068\u5B9A\u7FA9\u304C\u98DF\u3044\u9055\u3063\u3066\u3044\u307E\u3059\uFF08${method} ${found.template}\uFF09\u3002${NOT_APPLIED}`]}}if(found.kind==="method-mismatch"){return{operation:null,unmatched:`\u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\u306B ${method} \u306E\u5B9A\u7FA9\u304C\u7121\u3044\u305F\u3081`,template:null,notes:[`\u6CE8\u8A18: \u30B3\u30DE\u30F3\u30C9\u30E2\u30C7\u30EB\u306E ${found.template} \u306B ${method}\
|
|
@@ -109,7 +117,15 @@ if(reason!==null){throw new UsageError(`--max-items \u306F\u81EA\u52D5\u30DA\u30
|
|
|
109
117
|
startingToken,notPagedReason:noPaginate?"--no-paginate \u306E\u305F\u3081":reason}}function assertValid(operation,query,body){const violations=[...validateQuery(operation.queryParams,query),...operation.body!==null&&operation.method!=="GET"?validateBody(operation.body.schema,body??{}):[]];if(violations.length===0)return;const shown=violations.slice(0,MAX_REPORTED_VIOLATIONS).map(violation=>` - ${violation}`);const rest=violations.length-shown.length;throw new UsageError(`\u9001\u4FE1\u524D\u306E\u691C\u8A3C\u3067 ${violations.
|
|
110
118
|
length} \u4EF6\u306E\u554F\u984C\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\uFF08${operation.method} ${operation.path}\uFF09:
|
|
111
119
|
${shown.join("\n")}${rest>0?`
|
|
112
|
-
\u2026\u307B\u304B ${rest} \u4EF6`:""}`,"\u30B9\u30AD\u30FC\u30DE\u306F\u30B5\u30FC\u30D0\u306E\u691C\u8A3C\u898F\u5247\u304B\u3089\u63A8\u5B9A\u3057\u305F\u3082\u306E\u3067\u3059\u3002\u30B5\u30FC\u30D0\u304C\u53D7\u3051\u308B\u306F\u305A\u306E\u5165\u529B\u304C\u62D2\u307E\u308C\u305F\u5834\u5408\u306F --no-validate \u3067\u691C\u8A3C\u3092\u5916\u3057\u3066\u9001\u308C\u307E\u3059\u3002")}function
|
|
113
|
-
const hasArray=Array.isArray(
|
|
114
|
-
|
|
120
|
+
\u2026\u307B\u304B ${rest} \u4EF6`:""}`,"\u30B9\u30AD\u30FC\u30DE\u306F\u30B5\u30FC\u30D0\u306E\u691C\u8A3C\u898F\u5247\u304B\u3089\u63A8\u5B9A\u3057\u305F\u3082\u306E\u3067\u3059\u3002\u30B5\u30FC\u30D0\u304C\u53D7\u3051\u308B\u306F\u305A\u306E\u5165\u529B\u304C\u62D2\u307E\u308C\u305F\u5834\u5408\u306F --no-validate \u3067\u691C\u8A3C\u3092\u5916\u3057\u3066\u9001\u308C\u307E\u3059\u3002")}function pagingMode(body,paging,pageState){if(typeof body!=="object"||body===null||Array.isArray(body))
|
|
121
|
+
return null;const record=body;if(pageState!==null){const itemsKey=paging.inferred?PAGE_NUMBER_ITEMS_KEY:paging.resultPath;return pageState.kind==="more"&&Array.isArray(record[itemsKey])?{kind:"page",itemsKey}:null}const hasArray=Array.isArray(record[paging.resultPath]);const{hasMore}=readEnvelopeCursor(body);const cursor={kind:"cursor",itemsKey:paging.resultPath};if(paging.inferred)return hasArray&&hasMore!==void 0?cursor:null;if(hasArray)return cursor;return hasMore!==void 0&&hasMore!==null&&hasMore!==
|
|
122
|
+
false?cursor:null}function isPageNumberList(body,resultPath){if(!isPageNumberEnvelope(body))return false;const record=body;return Array.isArray(record[PAGE_NUMBER_ITEMS_KEY])||resultPath!==null&&Array.isArray(record[resultPath])}function readPageNumberState(body,sent){const pageNo=body[PAGE_NUMBER_PARAM];const pageSum=body["page_sum"];if(!Number.isInteger(pageNo)||!Number.isInteger(pageSum)){return{kind:"unreadable",detail:`page_no=${describeServerValue(pageNo)} / page_sum=${describeServerValue(
|
|
123
|
+
pageSum)}`}}const no=pageNo;const total=pageSum;if(sent!==void 0&&no!==sent)return{kind:"ignored",sent,returned:no,pageSum:total};const list=[body[PAGE_NUMBER_ITEMS_KEY],...Object.values(body)].find(value=>Array.isArray(value));const limit=body["page_limit"];const sum=body["sum"];if(list!==void 0&&(Number.isInteger(limit)&&list.length>limit||no===1&&Number.isInteger(sum)&&list.length>=sum)){return{kind:"complete"}}return no<total?{kind:"more",next:String(no+1),pageSum:total}:{kind:"last"}}function describeServerValue(value){
|
|
124
|
+
if(value===void 0)return"undefined";if(typeof value==="number"||typeof value==="boolean"||value===null)return String(value);if(typeof value==="string")return JSON.stringify(value.length>20?`${value.slice(0,20)}\u2026`:value);return Array.isArray(value)?"(\u914D\u5217)":"(\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8)"}function pageNumberOf(value){const text=typeof value==="number"?String(value):typeof value==="string"?value.trim():"";if(!/^\d+$/.test(text))return void 0;const page=Number(text);return page>=
|
|
125
|
+
1?page:void 0}var PageNoIgnoredError=class extends Error{constructor(state){super("page_no ignored");this.state=state}state};function pageNumberApiPaging(label,itemsKey,firstPage){const base=envelopePaging({label,itemsKey,cursorParam:PAGE_NUMBER_PARAM,readCursor:readPageNumberCursor});let expected=firstPage;return{...base,nextCursor(body){const state=readPageNumberState(isRecordValue(body)?body:{},expected);if(state.kind==="ignored")throw new PageNoIgnoredError(state);if(state.kind==="unreadable"){
|
|
126
|
+
throw new ApiResponseError(`${label}\u306E\u5FDC\u7B54\u306E\u30DA\u30FC\u30B8\u756A\u53F7\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${state.detail}\uFF09\u3002\u7D9A\u304D\u306E\u6709\u7121\u3092\u5224\u5B9A\u3067\u304D\u306A\u3044\u305F\u3081\u4E2D\u65AD\u3057\u307E\u3057\u305F\u3002`)}const next=state.kind==="more"?state.next:null;expected=next===null?void 0:Number(next);return next}}}function isRecordValue(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}
|
|
127
|
+
function pageNumberNote(state,notPagedReason){const why=notPagedReason===null?"":`\uFF08${notPagedReason}1\u30DA\u30FC\u30B8\u3060\u3051\u53D6\u5F97\u3057\u307E\u3057\u305F\uFF09`;switch(state.kind){case"complete":case"last":return null;case"more":return`\u6CE8\u8A18: \u7D9A\u304D\u304C\u3042\u308A\u307E\u3059\uFF08\u5168 ${state.pageSum} \u30DA\u30FC\u30B8\uFF09${why}\u3002\u7D9A\u304D\u306F ${pageNumberResume(state.next)} \u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\u3002`;case"ignored":return`\u6CE8\
|
|
128
|
+
\u8A18: \u3053\u306E\u4E00\u89A7\u306F ${PAGE_NUMBER_PARAM} \u3067\u30DA\u30FC\u30B8\u3092\u9001\u308C\u307E\u305B\u3093\uFF08${PAGE_NUMBER_PARAM}=${state.sent} \u3092\u9001\u308A\u3001\u30DA\u30FC\u30B8 ${state.returned} \u304C\u8FD4\u308A\u307E\u3057\u305F\uFF09\u3002\u8FD4\u3057\u305F\u306E\u306F\u30DA\u30FC\u30B8 ${state.returned} \u3060\u3051\u3067\u3001\u5168\u4EF6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF08\u5168 ${state.pageSum} \u30DA\u30FC\u30B8\uFF09\u3002\u30DA\u30FC\u30B8\u306E\u9001\u308A\u65B9\u306F\u3053\u306E API \u306E\u4ED5\u69D8\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`;case"\
|
|
129
|
+
unreadable":return`\u6CE8\u8A18: \u5FDC\u7B54\u306E\u30DA\u30FC\u30B8\u756A\u53F7\u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08${state.detail}\uFF09${why}\u3002\u3053\u308C\u304C\u5168\u4EF6\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002`}}function continuationNote(body,paging){const{hasMore,cursor}=readEnvelopeCursor(body);const why=paging.notPagedReason===null?"":`\uFF08${paging.notPagedReason}1\u30DA\u30FC\u30B8\u3060\u3051\u53D6\u5F97\u3057\u307E\u3057\u305F\uFF09`;
|
|
130
|
+
if(hasMore===false||hasMore===null||hasMore===void 0)return null;if(hasMore!==true){return`\u6CE8\u8A18: \u5FDC\u7B54\u306E has_more \u3092\u89E3\u91C8\u3067\u304D\u307E\u305B\u3093\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${JSON.stringify(hasMore)??"undefined"}\uFF09${why}\u3002\u3053\u308C\u304C\u5168\u4EF6\u304B\u3069\u3046\u304B\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002`}if(typeof cursor!=="string"||cursor===""){return`\u6CE8\u8A18: \u7D9A\u304D\u304C\u3042\u308B\u3068\u793A\u3055\u308C\u3066\u3044\u307E\u3059\u304C next_cursor \u304C\u3042\u308A\u307E\u305B\u3093${why}\
|
|
115
131
|
\u3002\u3053\u308C\u306F\u5168\u4EF6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002`}return`\u6CE8\u8A18: \u7D9A\u304D\u304C\u3042\u308A\u307E\u3059${why}\u3002\u7D9A\u304D\u306F --starting-token ${shellQuote(cursor)} \u3067\u53D6\u5F97\u3067\u304D\u307E\u3059\u3002`}export{API_FLAGS,API_METHODS,buildSkeleton,normalizeApiPath,parseCliInput,parseMethod,parseQueryParams,parseQueryString,runApiCommand};
|
|
@@ -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-HAIZHSNZ.js";import"./chunk-
|
|
4
|
-
import
|
|
5
|
-
isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{parseArgv}from"./chunk-
|
|
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-HAIZHSNZ.js";import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";
|
|
4
|
+
import"./chunk-NZ7WI4RZ.js";import"./chunk-BUZKNZ45.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-ELXDRPDV.js";import"./chunk-IF2K4PM5.js";import"./chunk-GMBJTG6A.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-PWXXCLVZ.js";import"./chunk-D233KKXW.js";import"./chunk-XNLIEUAW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,
|
|
5
|
+
isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{parseArgv}from"./chunk-BJLXXRSY.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-NAUH75MM.js";import"./chunk-UVUVEL3B.js";import"./chunk-QQRJLH6B.js";import{isFullWidth,isWide,stringWidth,stripAnsi}from"./chunk-WVS4W5FY.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";
|
|
6
6
|
import"./chunk-N2UVRM3Z.js";import"./chunk-II5RVJQN.js";import"./chunk-7WSNIXTQ.js";import"./chunk-PMOUHEJQ.js";import{configReadDirs,twpHomeDir}from"./chunk-RZVI6PMW.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-
|
|
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-KNZ43HFF.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",
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{PUNCH_TYPES,assertCurrentMonthOpen,assertMonthsOpen,attendanceDomain,hoursMinutes}from"./chunk-GPIIXDEX.js";import"./chunk-3RAGOW6X.js";import"./chunk-ZN5EFDH7.js";import"./chunk-ZWVYVS2A.js";import"./chunk-7WSNIXTQ.js";import"./chunk-VSJBJXZO.js";export{PUNCH_TYPES,assertCurrentMonthOpen,assertMonthsOpen,attendanceDomain,hoursMinutes};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{hoursMinutes
|
|
3
|
+
import{hoursMinutes}from"./chunk-GPIIXDEX.js";import{monthFlag}from"./chunk-3RAGOW6X.js";import"./chunk-ZN5EFDH7.js";import{isRecord,pick}from"./chunk-ZWVYVS2A.js";import{ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.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";
|
|
4
4
|
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`,
|
|
5
5
|
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
|
|
6
6
|
--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
|
|
@@ -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-HGTG5XQ7.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-
|
|
3
|
+
import{readBody}from"./chunk-HGTG5XQ7.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-ELXDRPDV.js";import"./chunk-IF2K4PM5.js";import"./chunk-GMBJTG6A.js";import"./chunk-J7QYPKVK.js";import"./chunk-4VZKNEVN.js";import"./chunk-NHYMHCAT.js";import"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-ZN5EFDH7.js";import{isRecord,pick}from"./chunk-ZWVYVS2A.js";
|
|
4
4
|
import{ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.js";import"./chunk-RZVI6PMW.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\
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{UsageError}from"./chunk-7WSNIXTQ.js";var MONTH_PATTERN=/^(\d{4})-(\d{2})$/;var DATE_PATTERN=/^(\d{4})-(\d{2})-(\d{2})$/;function monthFlag(flags,name="--month"){const raw=flags.get(name);if(raw===void 0)return void 0;const value=raw.trim();const match=MONTH_PATTERN.exec(value);const month=match===null?0:Number(match[2]);if(match===null||month<1||month>12){throw new UsageError(`${name} \u306F YYYY-MM \u5F62\u5F0F\u306E\u5E74\u6708\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${raw}\
|
|
4
|
+
\uFF09`,`\u4F8B: ${name} 2026-08`)}return value}function dateFlag(flags,name="--date"){const raw=flags.get(name);if(raw===void 0)return void 0;const value=raw.trim();const match=DATE_PATTERN.exec(value);if(match===null||!isCalendarDate(Number(match[1]),Number(match[2]),Number(match[3]))){throw new UsageError(`${name} \u306F\u5B9F\u5728\u3059\u308B\u65E5\u4ED8\u3092 YYYY-MM-DD \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${raw}\uFF09`,
|
|
5
|
+
`\u4F8B: ${name} 2026-08-31`)}return value}function isCalendarDate(year,month,day){if(month<1||month>12||day<1)return false;const date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}export{monthFlag,dateFlag};
|