@tocca-systems/twp-cli 0.33.0 → 0.35.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 +12 -0
- package/README.md +90 -0
- package/dist/{agent-loop-ADP6AOWX.js → agent-loop-SP2UKXIG.js} +1 -1
- package/dist/{ai-dispatch-KXRNV4UZ.js → ai-dispatch-LY6OVZC3.js} +1 -1
- package/dist/{api-command-62Q7Y5C6.js → api-command-AHVUUK3I.js} +3 -3
- package/dist/{app-ZISAG2EN.js → app-JPJHLNTW.js} +4 -4
- package/dist/{auto-update-worker-Y44TD6FD.js → auto-update-worker-73HBKKVT.js} +1 -1
- package/dist/{backlog-7BCJWAE2.js → backlog-NS2V3WKG.js} +5 -6
- package/dist/chunk-523KROGI.js +3 -0
- package/dist/{chunk-5Q2CH4E7.js → chunk-6NEQ6PZZ.js} +1 -1
- package/dist/{chunk-PWXXCLVZ.js → chunk-77DFFCZF.js} +1 -1
- package/dist/chunk-7CQKNDAE.js +20 -0
- package/dist/chunk-A2MX47LP.js +85 -0
- package/dist/{chunk-YVAN3H5W.js → chunk-BUZKNZ45.js} +3 -3
- package/dist/{chunk-REPGG75N.js → chunk-DU42VCON.js} +1 -1
- package/dist/{chunk-FJESEWMF.js → chunk-EVR3OFVS.js} +1 -1
- package/dist/{chunk-V4UGLDEH.js → chunk-FII7YYYZ.js} +1 -1
- package/dist/chunk-I6DWJXPC.js +4 -0
- package/dist/chunk-IWIGE7U4.js +6 -0
- package/dist/{chunk-ONTK2FR4.js → chunk-L52XJFJR.js} +1 -1
- package/dist/{chunk-OK4ITT5Y.js → chunk-N4ZW4IVU.js} +2 -2
- package/dist/chunk-R53CMVWR.js +21 -0
- package/dist/{chunk-AX5GOOZP.js → chunk-U6RXDDAB.js} +11 -11
- package/dist/{chunk-AGEDFRUQ.js → chunk-VQMR5UTD.js} +1 -1
- package/dist/chunk-WQRWQ7IM.js +94 -0
- package/dist/chunk-Z7GNYWCU.js +40 -0
- package/dist/cli.js +73 -9
- package/dist/{commands-MW7XRREL.js → commands-M4B3MDUA.js} +4 -4
- package/dist/{commands-4DNJTCOG.js → commands-RQQN7TXW.js} +2 -2
- package/dist/company-4O3HA6A2.js +26 -0
- package/dist/{completion-RGC3UZFI.js → completion-DGJH42YO.js} +1 -1
- package/dist/{department-XVOQ254P.js → department-XRIBRAQE.js} +1 -1
- package/dist/{inquiry-EY5XY4UP.js → inquiry-LOH3OKG3.js} +1 -1
- package/dist/{job-title-QHIKTYLH.js → job-title-EMRVK4RO.js} +1 -1
- package/dist/{leave-C6K724AF.js → leave-BGDVEHQ7.js} +1 -1
- package/dist/{media-BFCZJMEU.js → media-OQRJYMJT.js} +1 -1
- package/dist/{notification-6T22IDIZ.js → notification-4DFO464P.js} +1 -1
- package/dist/{oneshot-IZCRIJJJ.js → oneshot-QLTXLUSM.js} +1 -1
- package/dist/{position-SBZD7AFE.js → position-3NRFWS3E.js} +1 -1
- package/dist/{project-RAYRR6JS.js → project-ROLQ535L.js} +1 -1
- package/dist/prospect-7L2UUNY3.js +107 -0
- package/dist/{registry-AZJFULY5.js → registry-XL6Z2QCB.js} +1 -1
- package/dist/{render-K45EOLHX.js → render-W523YEYF.js} +1 -1
- package/dist/report-YIOEMKUU.js +73 -0
- package/dist/{run-YKAUZRCI.js → run-N5EIN5WQ.js} +2 -2
- package/dist/sales-7DTKXDMD.js +4 -0
- package/dist/{server-skills-MW6YNLNT.js → server-skills-NXSUDHBD.js} +1 -1
- package/dist/{task-GKHDJZLP.js → task-CBJOR2GF.js} +2 -2
- package/dist/{update-MAQJ6VWV.js → update-3D2CMAIV.js} +1 -1
- package/dist/{user-GPAPJUHB.js → user-TNGMHVOJ.js} +8 -9
- package/dist/{workflow-EOEEPABZ.js → workflow-XDGT7L6G.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-EIA24ITC.js +0 -5
- package/dist/chunk-FTYJZFEK.js +0 -10
- package/dist/chunk-G4OO4M44.js +0 -16
- package/dist/chunk-LON7FN5A.js +0 -66
- package/dist/chunk-WBAEUHJB.js +0 -3
package/CHANGELOG.public.md
CHANGED
|
@@ -11,6 +11,18 @@
|
|
|
11
11
|
`CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
|
|
12
12
|
-->
|
|
13
13
|
|
|
14
|
+
## 0.35.0
|
|
15
|
+
|
|
16
|
+
レポート(日報)を CLI から書けるようになりました(`twp report`)。フォーマットの入力項目から雛形を作り、下書きの作成・更新・提出ができます。
|
|
17
|
+
|
|
18
|
+
アプローチ先(見込客)を CLI から扱えるようになりました(`twp prospect`)。一覧・登録・更新・削除、CSV での一括登録と書き出し、重複の確認、顧客への昇格と対応履歴の記録ができます。
|
|
19
|
+
|
|
20
|
+
## 0.34.0
|
|
21
|
+
|
|
22
|
+
販売管理の見積・請求(`twp estimate` / `twp invoice`)と、取引先企業・顧客(`twp company` / `twp customer`)の一覧と詳細を CLI から参照できるようになりました。取引先・顧客は企業名でも ID でも指定できます。
|
|
23
|
+
|
|
24
|
+
顧客の登録・更新・削除と、顧客の担当者・対応履歴の一覧・登録・更新・削除を CLI から行えるようになりました(`twp customer create` / `update` / `delete`、`twp customer contact`、`twp customer interaction`)。`twp customer delete --file` で、ID を並べたファイルから顧客を担当者・対応履歴ごと一括で削除できます(`--dry-run` で件数を確認できます)。見積・請求書などから参照されている顧客は削除されず、理由が表示されます。
|
|
25
|
+
|
|
14
26
|
## 0.33.0
|
|
15
27
|
|
|
16
28
|
ワークフロー(申請)の起票・提出と、承認・却下・差し戻し・取下げを CLI から行えるようになりました(`twp workflow instance create` / `apply`、`twp workflow approval approve` 等)。申請書の入力項目から申請内容の雛形を出すこともできます。
|
package/README.md
CHANGED
|
@@ -24,10 +24,12 @@ 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 を並べたファイルでの一括削除を含む)と担当者・対応履歴の一覧・登録・更新・削除、`twp prospect` によるアプローチ先(見込客)の一覧・登録・更新・削除・CSV での一括登録と書き出し・重複確認・顧客への昇格と対応履歴の記録。販売管理・顧客管理の権限が要ります |
|
|
27
28
|
| **できる** | `twp media` によるメディアライブラリのファイルのアップロード・一覧・ダウンロード・削除(ゴミ箱へ移す)・一括操作(公開・非公開・アーカイブ・移動・削除・復元・ZIP ダウンロード)、`twp storage get` によるストレージ使用量の確認(管理者) |
|
|
28
29
|
| **できる** | `twp attendance` による自分の勤怠の参照(いまの打刻状態・打刻の履歴・月の勤怠表)と打刻、管理者向けの残業サマリ(36協定を含む)・締め状況の参照 |
|
|
29
30
|
| **できる** | `twp leave` による有給の残日数・取得履歴・付与履歴の参照、`twp workchange list` / `twp shift list` による月の勤務変更・シフトの参照(`--me` で自分の分・無ければ全員分=勤怠の管理者) |
|
|
30
31
|
| **できる** | `twp workflow` による、自分が申請できる申請書・申請書の定義(管理者)・自分の申請・承認履歴・自分の承認待ちの参照(申請書は名前でも指定できます)と、申請の起票・提出・更新・削除、承認・却下・差し戻し・取下げ |
|
|
32
|
+
| **できる** | `twp report` による自分のレポート(日報)の一覧(フォーマット・状態・語で絞り込み)・詳細と、下書きの作成(フォーマットの入力項目から雛形を出せます)・更新・提出、使えるレポートフォーマットの一覧 |
|
|
31
33
|
| **できる** | `twp task-loop` による、TWP のタスクキューを手元の AI CLI に実行させる常駐ループ |
|
|
32
34
|
| **できる** | `twp agent-loop` による、エージェントループのキューの一覧・投入・更新・先頭への移動・削除と、期間を指定した実行履歴の参照。更新・移動・削除はテナントの管理者の権限が要ります |
|
|
33
35
|
| **できる** | `twp completion bash` / `zsh` / `fish` / `powershell` によるシェル補完(コマンド名・操作名・フラグ名。プロジェクトやステータスの値は補完しません)と、`twp configure` による既定のプロジェクト・出力形式・既定プロファイルの対話設定 |
|
|
@@ -344,6 +346,72 @@ twp notification read-all [--category <カテゴリ>] --yes
|
|
|
344
346
|
- 通知設定・宛先ルールはまだありません(`twp api /api/v2/notifications/settings` で到達できます)
|
|
345
347
|
- ヘルプは `twp notification help`
|
|
346
348
|
|
|
349
|
+
### 見積・請求・取引先・顧客を見る
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
twp estimate list [--keyword <語>] [--status <ステータス>]... [--customer <取引先>] [--project <コード|ID>] [--assignee <ユーザー>] [--from <日付>] [--to <日付>] [--all]
|
|
353
|
+
twp estimate get <見積ID>
|
|
354
|
+
twp invoice list [同じ絞り込み] [--allocation unallocated|allocated] [--all]
|
|
355
|
+
twp invoice get <請求ID>
|
|
356
|
+
twp company list [--keyword <語>] [--all]
|
|
357
|
+
twp company get <取引先>
|
|
358
|
+
twp customer list [--keyword <語>] [--all]
|
|
359
|
+
twp customer get <顧客>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
- 見積・請求は販売管理、顧客は顧客管理、取引先は販売管理か顧客管理の権限が要ります。権限が「なし」(テナントが契約していない場合を含む)ならその旨を案内して終了コード 3 で止まります
|
|
363
|
+
- 見えるのは画面と同じ範囲です(管理者以外は、メンバーのプロジェクトの見積・請求と、プロジェクト未設定で自分が作成者・担当者のもの)
|
|
364
|
+
- **`--status` はコード(`approved`)でも画面の表示名(承認済)でも指定でき、複数回書けます。** 打ち間違いは「0件」ではなくエラーになります。渡せる値は `twp estimate list help` に並びます
|
|
365
|
+
- **`--customer` と `get <取引先>` / `get <顧客>` は、企業名・略称・カナの完全一致か ID(数字)で指定します。** 部分一致では自動で選ばず、候補を出して止まります。数字だけの値は ID として扱います
|
|
366
|
+
- `get <見積ID>` / `get <請求ID>` は一覧の `id` 列の数字です。見積番号・請求番号で探すなら `list --keyword <番号>` を使ってください
|
|
367
|
+
- 請求の一覧は画面と同じく、統合請求書を本体1行で出し、統合元の請求はその `children` に入ります
|
|
368
|
+
- 一覧は **ページ番号で辿ります**(`--cursor` はページ番号・`--limit` は1ページの件数でサーバの上限は100)。並びは登録の新しい順(ID の降順)に固定しています。絞り込み全体の件数と合計金額は stderr に出ます
|
|
369
|
+
- 画面にあるそれ以外の絞り込み(確度・見積区分・部署など)と、見積・請求・取引先の作成・更新・削除はまだありません(顧客は次の節。`twp api /api/v2/sales/estimates --query-param reliability_list=A` のように到達できます。ただし `twp api` はこの一覧の続きを自動では辿らず1ページだけを返すので、`--query-param page_no=2` のようにページを送ってください)
|
|
370
|
+
- ヘルプは `twp estimate help` / `twp invoice help` / `twp company help` / `twp customer help`
|
|
371
|
+
|
|
372
|
+
### 顧客を登録・更新・削除する
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
twp customer create --name <企業名> [--kana <フリガナ>] [--tel <電話番号>] [--supplier true] [項目…]
|
|
376
|
+
twp customer update <顧客> [項目…]
|
|
377
|
+
twp customer delete <顧客> --yes
|
|
378
|
+
twp customer delete --file <ファイル> [--dry-run] --yes
|
|
379
|
+
twp customer contact list|create|update|delete [<担当者ID>] --customer <顧客> [項目…]
|
|
380
|
+
twp customer interaction list|create|update|delete [<対応履歴ID>] --customer <顧客> [項目…]
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
- **`delete` は顧客(取引先企業)と、それに紐づく担当者・対応履歴をまとめて消します。** 送る前に件数(企業N社・担当者M件・対応履歴K件)を stderr に出すので、`--dry-run` で下見してから `--yes` を付けて打ってください
|
|
384
|
+
- 順序は企業ごとに「企業の削除 → 担当者の削除 → 対応履歴が残っていないかの確認」です。**見積・請求書・案件書類・プロジェクト等から参照されている企業はサーバが削除を断り、その理由(「見積2件・案件書類1件…」)をそのまま出して止まります。** その企業では担当者も消しません
|
|
385
|
+
- **一括(`--file`)は1行に1つ顧客の ID を書きます**(名前は受けません。空行と `#` の行は読み飛ばします)。仕入先だけの取引先・ID の形の誤り・重複が1行でもあれば、1件も消さずに行番号と理由を全部出します
|
|
386
|
+
- 途中で止まったら、完了した企業・どこまで消えたか・未着手の ID を出します(終了コード 3)。原因を取り除いて**同じコマンドを打ち直すと、削除済みの企業は残りの担当者・対応履歴だけを消して進みます**
|
|
387
|
+
- 顧客かつ仕入先の企業も削除します(企業は1件なので仕入先としても消えます。下見で知らせます)。仕入先だけの取引先は `twp customer` では扱いません
|
|
388
|
+
- 権限: 登録・更新は顧客管理の「編集者」以上か販売管理の「メンバー」以上。削除は、企業が顧客管理の「管理者」か販売管理の「メンバー」以上、担当者・対応履歴が顧客管理の「管理者」。**担当者・対応履歴が残る顧客を顧客管理の「管理者」でない権限で消そうとすると、企業だけ消えて担当者が残るのを避けるため1件も送らずに止めます**
|
|
389
|
+
- 名刺画像・タグ・施策の紐づけはまだありません(`twp api /api/v2/customers/<顧客ID>/contacts/<担当者ID>/business-cards` のように到達できます)
|
|
390
|
+
- ヘルプは `twp customer delete help` / `twp customer contact help` / `twp customer interaction help`
|
|
391
|
+
|
|
392
|
+
### アプローチ先(見込客)を扱う
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
twp prospect list [--keyword <語>] [--status <ステータス>] [--assignee <ユーザー>] [--tag <タグ>] [--unapproached] [--all]
|
|
396
|
+
twp prospect get <アプローチ先>
|
|
397
|
+
twp prospect create --name <企業名> [--contact-name <担当者名>] [--status <ステータス>] [項目…]
|
|
398
|
+
twp prospect update <アプローチ先> [項目…]
|
|
399
|
+
twp prospect delete <アプローチ先> --yes
|
|
400
|
+
twp prospect import --file <CSV> [--check]
|
|
401
|
+
twp prospect export --out <パス.csv> [--force] [絞り込み…]
|
|
402
|
+
twp prospect check-duplicates --name <企業名> [--website <URL>]
|
|
403
|
+
twp prospect promote <アプローチ先> [--link <取引先>] [--dry-run] --yes
|
|
404
|
+
twp prospect interaction list|create|update|delete [<対応履歴ID>] --prospect <アプローチ先> [項目…]
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
- `<アプローチ先>` は ID か企業名の完全一致です。**同じ企業名の行が複数あるとき(名刺ごとに1行など)は候補を出して止まる**ので ID で指定してください
|
|
408
|
+
- **`import` は送る前にサーバに全行を判定させ、エラー行が1つでもあれば1件も登録せずに行番号と理由を全部出します。** `--check` で判定だけを見られます。同じ企業かつ連絡先がすべて一致する行は重複としてスキップされます(登録は止まりません)。1回に取り込める行数の上限はサーバが決めます
|
|
409
|
+
- CSV は `export`(画面の CSV 出力と同じ形)の出力をそのまま `import` できます。文字コードは UTF-8 か Shift_JIS です
|
|
410
|
+
- **`promote` は取り消せません。** 送る前に名前が似た既存の顧客・昇格済みかを stderr に出すので、`--dry-run` で下見してから `--yes` を付けて打ってください。同じ企業が既に取引先にあるなら `--link <取引先>` で紐づけだけにします(仕入先だけの企業なら顧客にもなります)
|
|
411
|
+
- アプローチ先の記録は `twp prospect interaction` で行います。登録するとサーバがアプローチ先のステータス・最終接触日を更新します。「アプローチ履歴」のコマンドはありません(対応履歴に集約されました)
|
|
412
|
+
- 権限(顧客管理): 閲覧は「閲覧者」以上、登録・更新・`import` は「編集者」以上、削除・`export`・`promote`・対応履歴の削除は「管理者」
|
|
413
|
+
- ヘルプは `twp prospect help` / `twp prospect import help` / `twp prospect promote help` / `twp prospect interaction help`
|
|
414
|
+
|
|
347
415
|
### メディアライブラリのファイルを扱う
|
|
348
416
|
|
|
349
417
|
```bash
|
|
@@ -446,6 +514,28 @@ twp workflow approval cancel <申請ID> [--comment-file <パス>] --yes
|
|
|
446
514
|
- `reject` / `send-back` はコメント(理由)が必須です。`cancel` は申請者本人が承認待ちの申請を取り下げる操作です
|
|
447
515
|
- 削除・却下・差し戻し・取下げは `--yes` が無いと実行しません(`--dry-run` なら送信先だけを確認できます)
|
|
448
516
|
|
|
517
|
+
### レポート(日報)を書く
|
|
518
|
+
|
|
519
|
+
```bash
|
|
520
|
+
twp report format list [--include-unavailable]
|
|
521
|
+
twp report list [--format <フォーマット>] [--status <new|completed|reviewed|rejected>[,…]] [--keyword <語>] [--all]
|
|
522
|
+
twp report get <レポートID>
|
|
523
|
+
twp report create --format <フォーマット> --generate-cli-skeleton --output json > report.json
|
|
524
|
+
twp report create --format <フォーマット> --content-file report.json # 下書き
|
|
525
|
+
twp report update <レポートID> --content-file report.json
|
|
526
|
+
twp report submit <レポートID> # 提出
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
- `<フォーマット>` はレポートフォーマットの名前・コード(`RF-000001`)・ID です。同じ名前のフォーマットがあるときはコードか ID で指定してください
|
|
530
|
+
- `list` は自分が書いたレポートだけです。日付では絞り込めません(直近のものは `--limit` で足ります)
|
|
531
|
+
- レポートは「下書きを作る(`create`)→ 提出する(`submit`)」の2段です。`create` だけでは確認者へ届きません
|
|
532
|
+
- `--content-file` は `title` / `content` を持つ JSON で、`content` はフォーマットの入力項目名 → 値です。`--generate-cli-skeleton` が入力項目から雛形を出し、項目の表示名・型・必須・選択肢は stderr に出ます。フォーマットに無い項目名は送る前にエラーになります
|
|
533
|
+
- `update` の `content` は丸ごと置き換わります(今の値は `report get <レポートID> --output json` で取れます)。書き換えられるのは下書きと差し戻されたレポートです
|
|
534
|
+
- `submit` は送る前に、画面と同じく必須の項目とタイトルが埋まっているかを確かめます
|
|
535
|
+
- タイトルを省くと、画面と同じくフォーマットの既定のタイトル(`{date}` は今日の日付)かフォーマット名で作ります
|
|
536
|
+
- 添付ファイル・動画・タスク参照・申請参照の項目の値はこの CLI では作れません(画面で入力してください)。確認・差し戻し・コメントは `twp api /api/v2/reports/...` で到達できます
|
|
537
|
+
- ヘルプは `twp report help`
|
|
538
|
+
|
|
449
539
|
### Backlog の課題を読む・書く
|
|
450
540
|
|
|
451
541
|
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-R53CMVWR.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{detectAiClis}from"./chunk-T4QZO6RQ.js";import{expandServerSkills,prepareSkillOverlay}from"./chunk-L52XJFJR.js";import"./chunk-QWSXHHFT.js";import"./chunk-VK2Z4QGC.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,8 +1,8 @@
|
|
|
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-
|
|
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-U6RXDDAB.js";import{renderOutput}from"./chunk-6NEQ6PZZ.js";import{redactSecretValues,withDebug}from"./chunk-BUZKNZ45.js";import"./chunk-IWIGE7U4.js";import{evaluateQuery}from"./chunk-GDM2QUBL.js";import{readBody}from"./chunk-HGTG5XQ7.js";
|
|
4
|
+
import{parseOperationArgs,repeatedValues}from"./chunk-IOGVQVGD.js";import"./chunk-WQRWQ7IM.js";import{ApiError,TwpApiClient,appendQuery}from"./chunk-7CQKNDAE.js";import"./chunk-GMBJTG6A.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.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-523KROGI.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,positiveInteger,readEnvelopeCursor,shellQuote}from"./chunk-R53CMVWR.js";import"./chunk-II5RVJQN.js";import{EXIT_OK,NetworkError,UsageError}from"./chunk-7WSNIXTQ.js";import"./chunk-RZVI6PMW.js";
|
|
6
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=>/^\{[^/{}]+\}$/.
|
|
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;
|
|
@@ -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-
|
|
4
|
-
import"./chunk-
|
|
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-N4ZW4IVU.js";import"./chunk-NZ7WI4RZ.js";import"./chunk-BUZKNZ45.js";
|
|
4
|
+
import{buildDiffLines,diffStat}from"./chunk-VRBI2NPI.js";import{require_fuzzysort}from"./chunk-DIMZRTLE.js";import"./chunk-WQRWQ7IM.js";import"./chunk-7CQKNDAE.js";import"./chunk-GMBJTG6A.js";import{RelayError,builtinCatalog,createRuntime,loadCachedCatalog,modelLabel,pickModel,toModelInfos}from"./chunk-77DFFCZF.js";import"./chunk-XNLIEUAW.js";import"./chunk-D233KKXW.js";import{proxyDiagnostics}from"./chunk-J7QYPKVK.js";import{checkMinSupportedVersion,
|
|
5
|
+
isBelowMinSupported,minSupportedBlockMessage}from"./chunk-DXXFUNYN.js";import"./chunk-4VZKNEVN.js";import{parseArgv}from"./chunk-VQMR5UTD.js";import{applyPermissionMode,checkPermission,describePermissionMode,getMode,isModeId,modeSource,nextMode}from"./chunk-NAUH75MM.js";import"./chunk-523KROGI.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-N5EIN5WQ.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,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-
|
|
3
|
+
import{fetchLatestVersion,isBehindLatest,resolveNpmCommand}from"./chunk-DU42VCON.js";import"./chunk-77DFFCZF.js";import"./chunk-XNLIEUAW.js";import"./chunk-D233KKXW.js";import"./chunk-J7QYPKVK.js";import{PARENT_PID_ENV,WORKER_ENV,autoUpdateDisabledReason,classifyInstall,isCheckDue,listRegisteredPids,lockFilePath,readUpdateState,resolveCliPath,runDirPath,writeUpdateState}from"./chunk-2NKVGAAE.js";import{PACKAGE_NAME,parseVersionCore}from"./chunk-DXXFUNYN.js";
|
|
4
4
|
import"./chunk-4VZKNEVN.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import"./chunk-PMOUHEJQ.js";import"./chunk-5WGOHFAS.js";import"./chunk-RZVI6PMW.js";import"./chunk-VSJBJXZO.js";import{execFile}from"child_process";import fs from"fs";import path from"path";var PARENT_WAIT_MAX_MS=12*60*60*1e3;var PARENT_POLL_MS=1e3;var LOCK_STALE_MS=PARENT_WAIT_MAX_MS+60*60*1e3;var INSTALL_TIMEOUT_MS=0;function childEnv(env){const next={...env};delete next[WORKER_ENV];delete next[PARENT_PID_ENV];return next}function createNpmRunner(env=process.env){const cmd=resolveNpmCommand({env});if(cmd===null)return null;return(args,timeoutMs)=>new Promise(resolve=>{execFile(cmd.file,[...cmd.prefix,...args],{timeout:timeoutMs,windowsHide:true,maxBuffer:8*1024*1024,cwd:path.dirname(lockFilePath(env)),env:childEnv(env)},(error,stdout,stderr)=>{if(error===null){resolve({ok:true,stdout:String(stdout),stderr:String(
|
|
5
5
|
stderr)});return}const e=error;resolve({ok:false,stdout:String(stdout??""),stderr:String(stderr??""),...e.killed?{error:"\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F"}:typeof e.code==="string"?{error:e.code}:{}})})})}function summarizeNpmFailure(result){const text=`${result.stderr}
|
|
6
6
|
${result.stdout}`;const code=/npm (?:ERR!|error) code (\S+)/.exec(text)?.[1]??result.error;let reason;if(code==="EACCES"||code==="EPERM"){reason=`\u30B0\u30ED\u30FC\u30D0\u30EB\u306E\u5C0E\u5165\u5148\u306B\u66F8\u304D\u8FBC\u3080\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\uFF08${code}\uFF09`}else if(code!==void 0&&/^(ENOTFOUND|ETIMEDOUT|ECONNREFUSED|ECONNRESET|EAI_AGAIN|ENETUNREACH)$/.test(code)){reason=`npm registry \u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${code}\
|
|
@@ -1,11 +1,10 @@
|
|
|
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,resolveNamed}from"./chunk-
|
|
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]+$/;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
\u5217>"}];function bodyHelp(fileFlag,inlineFlag){return`\u672C\u6587\u306F ${fileFlag} \u3092\u4E3B\u7D4C\u8DEF\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B7\u30A7\u30EB\u306E\u5F15\u6570\u306B\u8F09\u305B\u308B\u3068\u6539\u884C\u30FBMarkdown \u306E\u898B\u51FA\u3057\uFF08#\uFF09\u30FB
|
|
3
|
+
import{readBody}from"./chunk-HGTG5XQ7.js";import{BACKLOG_BASE_PATH,BACKLOG_PROJECT_SCOPE_LABEL,BACKLOG_SCOPE_LABEL,backlogSpacePath,isExactNumericId,resolveNamed}from"./chunk-WQRWQ7IM.js";import"./chunk-7CQKNDAE.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
|
+
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
|
+
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
|
+
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\
|
|
7
|
+
\u3092\u58CA\u3055\u306A\u3044\u4E3B\u7D4C\u8DEF",takesValue:true,placeholder:"<\u30D1\u30B9|->"},{name:"--body",summary:"\u672C\u6587\u3092\u76F4\u63A5\u6307\u5B9A\u3059\u308B\uFF08\u4E00\u884C\u5411\u3051\u3002--body-file \u3068\u306E\u4F75\u7528\u306F\u30A8\u30E9\u30FC\uFF09",takesValue:true,placeholder:"<\u6587\u5B57\u5217>"}];function bodyHelp(fileFlag,inlineFlag){return`\u672C\u6587\u306F ${fileFlag} \u3092\u4E3B\u7D4C\u8DEF\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B7\u30A7\u30EB\u306E\u5F15\u6570\u306B\u8F09\u305B\u308B\u3068\u6539\u884C\u30FBMarkdown \u306E\u898B\u51FA\u3057\uFF08#\uFF09\u30FB
|
|
9
8
|
\u5F15\u7528\u7B26\u3067\u58CA\u308C\u307E\u3059\u3002${fileFlag} - \u3067\u6A19\u6E96\u5165\u529B\u304B\u3089\u8AAD\u3081\u307E\u3059\uFF08${inlineFlag} \u306F\u4E00\u884C\u5411\u3051\u3067\u3001\u4F75\u7528\u306F\u30A8\u30E9\u30FC\u3067\u3059\uFF09\u3002
|
|
10
9
|
|
|
11
10
|
\u672C\u6587\u306F\u52A0\u5DE5\u3057\u307E\u305B\u3093\uFF08\u6539\u884C\u30FB\u672B\u5C3E\u306E\u6539\u884C\u30FBCRLF \u306F\u305D\u306E\u307E\u307E\u9001\u308A\u307E\u3059\uFF09\u3002\u843D\u3068\u3059\u306E\u306F\u5148\u982D\u306E UTF-8 BOM \u3060\u3051\u3067\u3059\u3002
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
var DOMAIN_NAMES=["agent-loop","attendance","backlog","company","customer","department","estimate","inquiry","invoice","job-title","leave","media","notification","position","project","prospect","report","shift","storage","task","user","workchange","workflow"];function isDomainName(value){return value!==void 0&&DOMAIN_NAMES.includes(value)}var HELP_TOKEN="help";var API_TOKEN="api";export{DOMAIN_NAMES,isDomainName,HELP_TOKEN,API_TOKEN};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{redactSecretValues,redactSecrets}from"./chunk-
|
|
3
|
+
import{redactSecretValues,redactSecrets}from"./chunk-BUZKNZ45.js";import{formatOutput}from"./chunk-K2ONOH3L.js";function renderOutput(value,format,noRedact=false){if(noRedact)return formatOutput(value,format);return redactSecrets(formatOutput(redactSecretValues(value),format))}export{renderOutput};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{AuthSession,loadCredentials,withFileLock}from"./chunk-XNLIEUAW.js";import{isTrustworthyCacheFile,writePrivateFileAtomic}from"./chunk-D233KKXW.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{parseVersionCore}from"./chunk-DXXFUNYN.js";import{effectiveApiUrl,effectiveRelayUrl,resolveConfiguredModel,resolveProfile}from"./chunk-4VZKNEVN.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{ensureTwpHome,twpHomeDir}from"./chunk-RZVI6PMW.js";var MAX_EVENT_BYTES=8*1024*1024;var SseBufferOverflowError=class extends Error{constructor(limit){super(`SSE \u306E\u30A4\u30D9\u30F3\u30C8\u5883\u754C\uFF08\u7A7A\u884C\uFF09\u304C ${limit} \u30D0\u30A4\u30C8\u4EE5\u5185\u306B\u73FE\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4E0A\u6D41\u306E\u5FDC\u7B54\u304C\u58CA\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002`)}};var SseParser=class{constructor(maxEventBytes=MAX_EVENT_BYTES){this.maxEventBytes=maxEventBytes}maxEventBytes;buffer="";pendingCr=false;push(chunk){
|
|
4
4
|
let pending=this.pendingCr?`\r${chunk}`:chunk;this.pendingCr=pending.endsWith("\r");if(this.pendingCr)pending=pending.slice(0,-1);this.buffer+=pending.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(this.buffer.length>this.maxEventBytes){this.buffer="";this.pendingCr=false;throw new SseBufferOverflowError(this.maxEventBytes)}const events=[];for(;;){const boundary=this.buffer.indexOf("\n\n");if(boundary===-1)break;const block=this.buffer.slice(0,boundary);this.buffer=this.buffer.slice(boundary+2);const parsed=parseBlock(
|
|
5
5
|
block);if(parsed)events.push(parsed)}return events}flush(){const rest=(this.pendingCr?`${this.buffer}
|
|
6
6
|
`:this.buffer).trim();this.buffer="";this.pendingCr=false;if(rest==="")return[];const parsed=parseBlock(rest);return parsed?[parsed]:[]}};function parseBlock(block){let event="message";const data=[];for(const line of block.split("\n")){if(line.startsWith(":"))continue;const colon=line.indexOf(":");const field=colon===-1?line:line.slice(0,colon);let value=colon===-1?"":line.slice(colon+1);if(value.startsWith(" "))value=value.slice(1);if(field==="event")event=value;else if(field==="data")data.push(
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{httpFetch}from"./chunk-J7QYPKVK.js";import{randomBytes}from"crypto";var MultipartBody=class{constructor(fields,files){this.fields=fields;this.files=files}fields;files;encode(){const boundary=`----twp-cli-${randomBytes(16).toString("hex")}`;const encoder=new TextEncoder;const parts=[];for(const[name,value]of Object.entries(this.fields)){parts.push(encoder.encode(`--${boundary}\r
|
|
4
|
+
Content-Disposition: form-data; name="${quoted(name)}"\r
|
|
5
|
+
\r
|
|
6
|
+
${value}\r
|
|
7
|
+
`))}for(const file of this.files){parts.push(encoder.encode(`--${boundary}\r
|
|
8
|
+
Content-Disposition: form-data; name="${quoted(file.field)}"; filename="${quoted(file.filename)}"\r
|
|
9
|
+
Content-Type: ${file.contentType}\r
|
|
10
|
+
\r
|
|
11
|
+
`),file.bytes,encoder.encode("\r\n"))}parts.push(encoder.encode(`--${boundary}--\r
|
|
12
|
+
`));return{bytes:concat(parts),contentType:`multipart/form-data; boundary=${boundary}`}}toJSON(){return{multipart:{...this.fields,...Object.fromEntries(this.files.map(file=>[file.field,{filename:file.filename,bytes:file.bytes.byteLength}]))}}}};function quoted(value){return value.replace(/"/g,"%22").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function concat(parts){const out=new Uint8Array(parts.reduce((n,p)=>n+p.byteLength,0));let offset=0;for(const part of parts){out.set(part,offset);offset+=part.
|
|
13
|
+
byteLength}return out}function encodeScalar(key,value,inArray){if(typeof value==="boolean")return value?"true":"false";if(typeof value==="number"){if(!Number.isFinite(value)){throw new TypeError(`\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF ${key} \u306B\u6709\u9650\u3067\u306A\u3044\u6570\u5024\u306F\u6E21\u305B\u307E\u305B\u3093: ${String(value)}`)}return String(value)}if(inArray&&value.includes(",")){throw new TypeError(`\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF ${key} \u306E\u914D\u5217\u8981\u7D20\u306B\u30AB\u30F3\u30DE\u306F\u542B\u3081\u3089\u308C\u307E\u305B\u3093: ${value}`)}
|
|
14
|
+
return value}function buildQuery(params){if(!params)return"";const search=new URLSearchParams;for(const[key,value]of Object.entries(params)){if(value===null||value===void 0)continue;if(Array.isArray(value)){if(value.length===0)continue;search.append(key,value.map(v=>encodeScalar(key,v,true)).join(","));continue}search.append(key,encodeScalar(key,value,false))}return search.toString()}function appendQuery(path,params){const qs=buildQuery(params);if(qs==="")return path;if(path.endsWith("?")||path.
|
|
15
|
+
endsWith("&"))return`${path}${qs}`;return`${path}${path.includes("?")?"&":"?"}${qs}`}var ApiError=class extends Error{constructor(status,body,method,path){super(`${method} ${path} -> ${status}${reasonOf(body)}`);this.status=status;this.body=body}status;body};function reasonOf(body){const head=body?.error_description||body?.message||"";const detail=errorListMessages(body?.error_list).filter(text=>!text.endsWith(`: ${head}`)&&text!==head).join(" / ");if(head!==""&&detail!=="")return` (${head} ${detail})`;if(head!=="")return` (${head})`;return detail!==""?` (${detail})`:""}var TwpApiClient=class{constructor(apiUrl,session,fetchImpl=httpFetch,cliVersion="\
|
|
16
|
+
0.0.0-dev"){this.apiUrl=apiUrl;this.session=session;this.fetchImpl=fetchImpl;this.cliVersion=cliVersion}apiUrl;session;fetchImpl;cliVersion;async get(path,query){return this.request("GET",appendQuery(path,query))}async post(path,body,query){return this.request("POST",appendQuery(path,query),body)}async put(path,body,query){return this.request("PUT",appendQuery(path,query),body)}async patch(path,body,query){return this.request("PATCH",appendQuery(path,query),body)}async delete(path,query){return this.
|
|
17
|
+
request("DELETE",appendQuery(path,query))}async requestBinary(method,path){let token=await this.session.getAccessToken();let res=await this.send(method,path,token);if(res.status===401){token=await this.session.refresh(token);res=await this.send(method,path,token)}if(!res.ok){const errBody=await res.json().then(parsed=>parsed,()=>null);throw new ApiError(res.status,errBody,method,path)}return{bytes:new Uint8Array(await res.arrayBuffer()),contentType:res.headers.get("content-type")}}async request(method,path,body){
|
|
18
|
+
let token=await this.session.getAccessToken();let res=await this.send(method,path,token,body);if(res.status===401){token=await this.session.refresh(token);res=await this.send(method,path,token,body)}if(!res.ok){const errBody=await res.json().then(parsed=>parsed,()=>null);throw new ApiError(res.status,errBody,method,path)}if(res.status===204||res.headers.get("content-length")==="0"){return null}const raw=await res.text();if(raw.trim()==="")return null;try{return JSON.parse(raw)}catch{throw new ApiError(
|
|
19
|
+
res.status,null,method,path)}}send(method,path,token,body){const multipart=body instanceof MultipartBody?body.encode():null;return this.fetchImpl(`${this.apiUrl}${path}`,{method,headers:{Accept:"application/json",Authorization:`Bearer ${token}`,"User-Agent":`twp-cli/${this.cliVersion}`,...multipart!==null?{"Content-Type":multipart.contentType}:body!==void 0?{"Content-Type":"application/json"}:{}},...multipart!==null?{body:multipart.bytes}:body!==void 0?{body:JSON.stringify(body)}:{}})}};function errorListMessages(list){
|
|
20
|
+
if(Array.isArray(list)){return list.flatMap(item=>{if(typeof item!=="object"||item===null)return[];const{name,message}=item;if(typeof message!=="string"||message==="")return[];return[typeof name==="string"&&name!==""?`${name}: ${message}`:message]})}if(typeof list==="object"&&list!==null){return Object.entries(list).flatMap(([name,messages])=>(Array.isArray(messages)?messages:[messages]).filter(message=>typeof message==="string"&&message!=="").map(message=>`${name}: ${message}`))}return[]}export{MultipartBody,appendQuery,ApiError,TwpApiClient,errorListMessages};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{readCsvFileText}from"./chunk-I6DWJXPC.js";import{featureLicenseGuidance}from"./chunk-Z7GNYWCU.js";import{createFlags,fieldBody,hasAnyField,updateFlags}from"./chunk-FII7YYYZ.js";import{CUSTOMERS_PATH,SALES_COMPANIES_PATH,isExactNumericId}from"./chunk-WQRWQ7IM.js";import{ApiError,errorListMessages}from"./chunk-7CQKNDAE.js";import{isSafePathSegment}from"./chunk-GMBJTG6A.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,nonEmpty,positiveInteger}from"./chunk-R53CMVWR.js";
|
|
4
|
+
import{requireResolved,singleRef,withResolved}from"./chunk-ZN5EFDH7.js";import{acknowledgement,isRecord,pick}from"./chunk-ZWVYVS2A.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.js";function levelForbidden(licenseGuidance,levelGuidance){return body=>body?.error==="permission_denied"?licenseGuidance:levelGuidance}var COMPANY_LICENSE="\u53D6\u5F15\u5148\u3092\u6271\u3046\u306B\u306F\u8CA9\u58F2\u7BA1\u7406\u304B\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u304C\u3001\u3069\u3061\u3089\u3082\u3042\u308A\u307E\u305B\u3093\u3002\u30C6\u30CA\u30F3\u30C8\u304C\u3069\u3061\u3089\u3082\u5951\u7D04\u3057\u3066\u3044\u306A\u3044\u304B\u3001\u3042\u306A\u305F\u306E\u6A29\u9650\u304C\u3069\u3061\u3089\u3082\u300C\u306A\u3057\u300D\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
|
|
5
|
+
var CUSTOMER_LICENSE=featureLicenseGuidance("\u9867\u5BA2\u7BA1\u7406");var COMPANY_WRITE_FORBIDDEN=levelForbidden(COMPANY_LICENSE,"\u9867\u5BA2\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u306B\u306F\u3001\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u7DE8\u96C6\u8005\u300D\u4EE5\u4E0A\u304B\u3001\u8CA9\u58F2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u30E1\u30F3\u30D0\u30FC\u300D\u4EE5\u4E0A\u306E\u3069\u3061\u3089\u304B\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
|
|
6
|
+
var LEVEL_LABELS={admin:"\u7BA1\u7406\u8005",editor:"\u7DE8\u96C6\u8005",viewer:"\u95B2\u89A7\u8005",none:"\u306A\u3057"};var CHILD_DELETE_NEEDS="\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u306E\u524A\u9664\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u7BA1\u7406\u8005\u300D\u3067\u3042\u308B\u3053\u3068\u304C\u8981\u308A\u307E\u3059";var CUSTOMER_DELETE_FORBIDDEN=levelForbidden(COMPANY_LICENSE,"\u9867\u5BA2\u306E\u524A\u9664\u306B\u306F\u3001\u4F01\u696D\u306E\u524A\u9664\u306B\u9867\u5BA2\u7BA1\u7406\u306E\u300C\u7BA1\u7406\u8005\u300D\u304B\u8CA9\u58F2\u7BA1\u7406\u306E\u300C\u30E1\u30F3\u30D0\u30FC\u300D\u4EE5\u4E0A\u3001\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u306E\u524A\u9664\u306B\u9867\u5BA2\u7BA1\u7406\u306E\u300C\u7BA1\u7406\u8005\u300D\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\
|
|
7
|
+
\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");var CUSTOMER_UPDATE_FORBIDDEN=levelForbidden(CUSTOMER_LICENSE,"\u9867\u5BA2\u306E\u66F4\u65B0\u306B\u306F\u3001\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u7DE8\u96C6\u8005\u300D\u4EE5\u4E0A\u304B\u3001\u8CA9\u58F2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u30E1\u30F3\u30D0\u30FC\u300D\u4EE5\u4E0A\u306E\u3069\u3061\u3089\u304B\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
|
|
8
|
+
function childForbidden(label,write){return levelForbidden(CUSTOMER_LICENSE,write==="edit"?`${label}\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u7DE8\u96C6\u8005\u300D\u4EE5\u4E0A\u3067\u3042\u308B\u3053\u3068\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`:`${label}\u306E\u524A\u9664\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u300C\u7BA1\u7406\u8005\u300D\u3067\u3042\u308B\u3053\u3068\u304C\u8981\u308A\u307E\u3059\uFF08\u300C\u7DE8\u96C6\u8005\u300D\u3067\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\uFF09\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
|
|
9
|
+
var NO_LIMIT=Number.POSITIVE_INFINITY;var COMPANY_FIELDS=[{kind:"text",flag:"--name",key:"company_name",label:"\u4F01\u696D\u540D",maxChars:255,summary:"\u4F01\u696D\u540D\uFF08create \u3067\u306F\u5FC5\u9808\uFF09"},{kind:"text",flag:"--kana",key:"company_name_kana",label:"\u30D5\u30EA\u30AC\u30CA",maxChars:255,summary:"\u4F01\u696D\u540D\u306E\u30D5\u30EA\u30AC\u30CA"},{kind:"text",flag:"--short-name",key:"company_short_name",label:"\u7565\u79F0",maxChars:100,summary:"\u7565\u79F0"},{kind:"tex\
|
|
10
|
+
t",flag:"--company-no",key:"company_no",label:"\u6CD5\u4EBA\u756A\u53F7",maxChars:20,summary:"\u6CD5\u4EBA\u756A\u53F7"},{kind:"text",flag:"--post-code",key:"post_code",label:"\u90F5\u4FBF\u756A\u53F7",maxChars:10,summary:"\u90F5\u4FBF\u756A\u53F7"},{kind:"text",flag:"--address1",key:"address1",label:"\u4F4F\u62401",maxChars:255,summary:"\u4F4F\u62401\uFF08\u90FD\u9053\u5E9C\u770C\u30FB\u5E02\u533A\u753A\u6751\uFF09"},{kind:"text",flag:"--address2",key:"address2",label:"\u4F4F\u62402",maxChars:255,
|
|
11
|
+
summary:"\u4F4F\u62402\uFF08\u756A\u5730\uFF09"},{kind:"text",flag:"--address3",key:"address3",label:"\u4F4F\u62403",maxChars:255,summary:"\u4F4F\u62403\uFF08\u5EFA\u7269\u540D\uFF09"},{kind:"text",flag:"--tel",key:"tel",label:"\u96FB\u8A71\u756A\u53F7",maxChars:20,summary:"\u96FB\u8A71\u756A\u53F7"},{kind:"text",flag:"--fax",key:"fax",label:"FAX",maxChars:20,summary:"FAX \u756A\u53F7"},{kind:"text",flag:"--industry",key:"industry",label:"\u696D\u7A2E",maxChars:100,summary:"\u696D\u7A2E"},{kind:"\
|
|
12
|
+
text",flag:"--website",key:"website",label:"Web \u30B5\u30A4\u30C8",maxChars:255,summary:"Web \u30B5\u30A4\u30C8\u306E URL"},{kind:"text",flag:"--memo",key:"memo",label:"\u30E1\u30E2",maxChars:NO_LIMIT,summary:"\u30E1\u30E2"},{kind:"boolean",flag:"--supplier",key:"supplier_flg",summary:"\u4ED5\u5165\u5148\uFF08\u8ABF\u9054\u5148\uFF09\u3068\u3057\u3066\u3082\u767B\u9332\u3059\u308B\u304B\uFF08true / false\uFF09"}];var CONTACT_FIELDS=[{kind:"text",flag:"--name",key:"name",label:"\u6C0F\u540D",maxChars:255,
|
|
13
|
+
summary:"\u6C0F\u540D\uFF08create \u3067\u306F\u5FC5\u9808\uFF09"},{kind:"text",flag:"--kana",key:"name_kana",label:"\u30D5\u30EA\u30AC\u30CA",maxChars:255,summary:"\u6C0F\u540D\u306E\u30D5\u30EA\u30AC\u30CA"},{kind:"text",flag:"--department",key:"department",label:"\u90E8\u7F72",maxChars:255,summary:"\u90E8\u7F72"},{kind:"text",flag:"--position",key:"position",label:"\u5F79\u8077",maxChars:255,summary:"\u5F79\u8077"},{kind:"text",flag:"--role",key:"role_label",label:"\u5F79\u5272",maxChars:255,
|
|
14
|
+
summary:"\u5F79\u5272\uFF08\u6C7A\u88C1\u8005\u30FB\u7A93\u53E3 \u306A\u3069\uFF09"},{kind:"text",flag:"--email",key:"email",label:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",maxChars:255,summary:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9"},{kind:"text",flag:"--phone",key:"phone",label:"\u96FB\u8A71\u756A\u53F7",maxChars:50,summary:"\u96FB\u8A71\u756A\u53F7"},{kind:"text",flag:"--mobile",key:"mobile",label:"\u643A\u5E2F\u96FB\u8A71",maxChars:50,summary:"\u643A\u5E2F\u96FB\u8A71\u306E\u756A\u53F7"},
|
|
15
|
+
{kind:"boolean",flag:"--primary",key:"is_primary",summary:"\u4E3B\u62C5\u5F53\u306B\u3059\u308B\u304B\uFF08true / false\uFF09"},{kind:"text",flag:"--notes",key:"notes",label:"\u30E1\u30E2",maxChars:1e4,summary:"\u30E1\u30E2"}];var INTERACTION_TYPES=["call","email","visit","web_meeting","other"];var INTERACTION_STATUSES=["appointment","meeting","meeting_completed","proposing","proposal_accepted","communication","thanks_mail_sent"];var INTERACTION_FIELDS=[{kind:"enum",flag:"--type",key:"interactio\
|
|
16
|
+
n_type",values:INTERACTION_TYPES,summary:`\u5BFE\u5FDC\u306E\u7A2E\u5225\uFF08${INTERACTION_TYPES.join(" / ")}\u30FBcreate \u3067\u306F\u5FC5\u9808\uFF09`},{kind:"text",flag:"--date",key:"interaction_date",label:"\u5BFE\u5FDC\u65E5",maxChars:NO_LIMIT,summary:"\u5BFE\u5FDC\u65E5\uFF08\u4F8B 2026-09-29\u30FBcreate \u3067\u306F\u5FC5\u9808\uFF09"},{kind:"enum",flag:"--status",key:"status",values:INTERACTION_STATUSES,summary:`\u72B6\u6CC1\uFF08${INTERACTION_STATUSES.join(" / ")}\uFF09`},{kind:"text",
|
|
17
|
+
flag:"--subject",key:"subject",label:"\u4EF6\u540D",maxChars:255,summary:"\u4EF6\u540D"},{kind:"text",flag:"--content",key:"content",label:"\u5185\u5BB9",maxChars:5e4,summary:"\u5185\u5BB9"},{kind:"text",flag:"--contact",key:"contact_id",label:"\u62C5\u5F53\u8005 ID",maxChars:255,summary:"\u5BFE\u5FDC\u3057\u305F\u76F8\u624B\u306E\u62C5\u5F53\u8005 ID\uFF08twp customer contact list \u306E id \u5217\uFF09"},{kind:"text",flag:"--next-action",key:"next_action",label:"\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3",
|
|
18
|
+
maxChars:1e3,summary:"\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3"},{kind:"text",flag:"--next-action-date",key:"next_action_date",label:"\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u65E5\u4ED8",maxChars:NO_LIMIT,summary:"\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u65E5\u4ED8"}];function dataOf(body,what){const data=isRecord(body)?body["data"]:void 0;if(!isRecord(body)||body["result"]!==true||!isRecord(data)||typeof data["id"]!=="string"&&typeof data["id"]!=="number"){throw new ApiResponseError(
|
|
19
|
+
`${what}\u306E\u5FDC\u7B54\u306B data.id \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return data}var COMPANY_COLUMNS=["id","company_name","company_name_kana","company_short_name","customer_flg","supplier_flg","tel","address1"];var CONTACT_COLUMNS=["id","company_id","name","department","position","email","phone","is_primary"];var INTERACTION_COLUMNS=["id","company_id","interaction_type","interaction_date","status","sub\
|
|
20
|
+
ject","contact_id"];async function resolveCustomer(ctx,raw,flag){return(await ctx.resolver.company(raw,{flag,source:"customer",mustExist:true})).id}function companyPath(input){const id=requireResolved(input,"companyId");if(!isExactNumericId(id))throw new ApiResponseError(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u53D6\u5F15\u5148 ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${id}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return`${SALES_COMPANIES_PATH}\
|
|
21
|
+
/${id}`}function childBase(companyId,kind){if(!isExactNumericId(companyId))throw new ApiResponseError(`\u53D6\u5F15\u5148 ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${companyId}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return`${CUSTOMERS_PATH}/${companyId}/${kind}`}var REF_HELP="<\u9867\u5BA2> \u306F\u4F01\u696D\u540D\u30FB\u7565\u79F0\u30FB\u30AB\u30CA\u306E\u5B8C\u5168\u4E00\u81F4\u304B ID\uFF08twp customer list \u306E id \u5217\u306E\u6570\u5B57\uFF09\u3067\u6307\u5B9A\u3057\u307E\u3059\u3002\n\u4ED5\u5165\u5148\u3060\u3051\u306E\u53D6\u5F15\u5148\u306F\u9867\u5BA2\u3068\u3057\u3066\u6271\u308F\u306A\u3044\u306E\u3067\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08twp company list \u3067\u898B\u3048\u307E\u3059\uFF09\u3002";
|
|
22
|
+
var createOperation={name:"create",summary:"\u9867\u5BA2\uFF08\u53D6\u5F15\u5148\u4F01\u696D\uFF09\u3092\u767B\u9332\u3059\u308B",usage:"twp customer create --name <\u4F01\u696D\u540D> [\u9805\u76EE\u2026]",description:"\u53D6\u5F15\u5148\u4F01\u696D\u3092\u300C\u9867\u5BA2\u300D\u3068\u3057\u3066\u767B\u9332\u3057\u307E\u3059\uFF08customer_flg \u3092\u7ACB\u3066\u3066\u4F5C\u6210\u3057\u307E\u3059\uFF09\u3002--name \u304C\u5FC5\u9808\u3067\u3059\u3002\n--supplier true \u3092\u4ED8\u3051\u308B\u3068\u4ED5\u5165\u5148\uFF08\u8ABF\u9054\u5148\uFF09\u3068\u3057\u3066\u3082\u767B\u9332\u3057\u307E\u3059\u3002\n\n\u4F5C\u6210\u3057\u305F\u9867\u5BA2\u306E ID \u304C\u8FD4\u308A\u307E\u3059\u3002\u62C5\u5F53\u8005\u306F twp customer contact create \u3067\u8DB3\u3057\u307E\u3059\u3002",
|
|
23
|
+
forbidden:COMPANY_WRITE_FORBIDDEN,flags:createFlags(COMPANY_FIELDS),plan(input){if(input.args.length>0)throw new UsageError(`create \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp customer create help");const body=fieldBody(input,COMPANY_FIELDS);if(body["company_name"]===void 0)throw new UsageError("--name \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp customer create help");return{method:"POST",path:SALES_COMPANIES_PATH,body:{...body,
|
|
24
|
+
customer_flg:true}}},summarize:body=>pick(dataOf(body,"\u9867\u5BA2\u306E\u767B\u9332"),COMPANY_COLUMNS),raw:body=>dataOf(body,"\u9867\u5BA2\u306E\u767B\u9332")};var updateOperation={name:"update",summary:"\u9867\u5BA2\uFF08\u53D6\u5F15\u5148\u4F01\u696D\uFF09\u306E\u9805\u76EE\u3092\u66F4\u65B0\u3059\u308B",usage:"twp customer update <\u9867\u5BA2> [\u9805\u76EE\u2026]",description:`\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3092\u5909\u66F4\u3057\u307E\u3059\uFF08\u6307\u5B9A\u3057\u306A\u304B\u3063\u305F\u9805\u76EE\u306F\u5909\u308F\u308A\u307E\u305B\u3093\uFF09\u3002\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u3082\u6307\u5B9A\u3057\u306A\u3044\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
|
|
25
|
+
|
|
26
|
+
${REF_HELP}`,forbidden:CUSTOMER_UPDATE_FORBIDDEN,flags:updateFlags(COMPANY_FIELDS),async prepare(input,ctx){if(!hasAnyField(input,COMPANY_FIELDS))throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp customer update help");fieldBody(input,COMPANY_FIELDS);const raw=singleRef(input,{flag:"<\u9867\u5BA2>",label:"\u9867\u5BA2",usage:"twp customer update help"});return withResolved(input,{companyId:await resolveCustomer(
|
|
27
|
+
ctx,raw,"<\u9867\u5BA2>")})},plan:input=>({method:"PUT",path:companyPath(input),body:fieldBody(input,COMPANY_FIELDS)}),summarize:body=>pick(dataOf(body,"\u9867\u5BA2\u306E\u66F4\u65B0"),COMPANY_COLUMNS),raw:body=>dataOf(body,"\u9867\u5BA2\u306E\u66F4\u65B0")};var DELETE_FILE_MAX_BYTES=1024*1024;var CHILD_PAGE_LIMIT=100;var FILE_FLAG={name:"--file",summary:"\u524A\u9664\u3059\u308B\u9867\u5BA2\u306E ID \u30921\u884C\u306B1\u3064\u66F8\u3044\u305F\u30D5\u30A1\u30A4\u30EB",takesValue:true,placeholder:"\
|
|
28
|
+
<\u30D5\u30A1\u30A4\u30EB>"};function parseDeleteIds(text){const ids=[];const errors=[];const seen=new Map;text.split(/\r?\n/).forEach((raw,index)=>{const line=index+1;const value=raw.trim();if(value===""||value.startsWith("#"))return;if(!isExactNumericId(value)){errors.push(`${line} \u884C\u76EE: \u9867\u5BA2\u306E ID\uFF08\u5148\u982D\u306B 0 \u3092\u4ED8\u3051\u306A\u3044\u6570\u5B57\uFF09\u3067\u306F\u3042\u308A\u307E\u305B\u3093: ${value}`);return}const first=seen.get(value);if(first!==void 0){
|
|
29
|
+
errors.push(`${line} \u884C\u76EE: ID ${value} \u306F ${first} \u884C\u76EE\u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059`);return}seen.set(value,line);ids.push({line,id:value})});return{ids,errors}}function flagIsCustomer(value){return value===true||value===1}async function inspectTarget(ctx,id,line){const record=await ctx.resolver.companyRecord(id);if(record!==null&&!flagIsCustomer(record["customer_flg"])){throw new UsageError(`ID ${id}\uFF08${String(record["company_name"]??"")}\uFF09\u306F\u9867\u5BA2\u3067\u306F\u306A\u3044\uFF08\u4ED5\u5165\u5148\u3060\
|
|
30
|
+
\u3051\u306E\uFF09\u53D6\u5F15\u5148\u3067\u3059\u3002twp customer delete \u3067\u306F\u524A\u9664\u3057\u307E\u305B\u3093`)}const contacts=await ctx.resolver.customerChildren(id,"contacts");const interactions=await ctx.resolver.customerChildren(id,"interactions");return{line,id,exists:record!==null,name:record===null?null:String(record["company_name"]??""),supplier:record!==null&&flagIsCustomer(record["supplier_flg"]),contactIds:contacts.map(row=>String(row["id"])),interactionCount:interactions.
|
|
31
|
+
length}}async function prepareDelete(input,ctx){const usage="twp customer delete help";const file=input.flags.get(FILE_FLAG.name);if(file===void 0){const raw=singleRef(input,{flag:"<\u9867\u5BA2>",label:"\u9867\u5BA2",usage});const id=isExactNumericId(raw.trim())?raw.trim():await resolveCustomer(ctx,raw,"<\u9867\u5BA2>");const target=await inspectTarget(ctx,id,null);if(!target.exists&&target.contactIds.length===0&&target.interactionCount===0){throw new UsageError(`ID ${id} \u306E\u9867\u5BA2\u306F\u3042\u308A\u307E\u305B\u3093\uFF08\u524A\u9664\u6E08\u307F\u3067\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\
|
|
32
|
+
\u6B74\u3082\u6B8B\u3063\u3066\u3044\u306A\u3044\u304B\u3001\u5B58\u5728\u3057\u306A\u3044 ID \u3067\u3059\uFF09`,"twp customer list \u3067 ID \u3092\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\u3002")}return withTargets(input,ctx,[target])}if(input.args.length>0)throw new UsageError(`--file \u306E\u3068\u304D\u306F\u9867\u5BA2\u3092\u4F4D\u7F6E\u5F15\u6570\u3067\u53D7\u3051\u307E\u305B\u3093: ${input.args.join(" ")}`,usage);if(file.trim()==="")throw new UsageError("--file <\u30D5\u30A1\u30A4\u30EB> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
33
|
+
usage);const text=readCsvFileText(file,usage,DELETE_FILE_MAX_BYTES,size=>new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${size} \u30D0\u30A4\u30C8\u30FB\u4E0A\u9650 ${DELETE_FILE_MAX_BYTES} \u30D0\u30A4\u30C8\uFF09: ${file}`,"\u30D5\u30A1\u30A4\u30EB\u3092\u5206\u3051\u3066\u6253\u3063\u3066\u304F\u3060\u3055\u3044\u3002"));const parsed=parseDeleteIds(text);const errors=parsed.errors.map(text2=>({line:Number(text2.split(" ")[0]),text:text2}));
|
|
34
|
+
const targets=[];for(const{line,id}of parsed.ids){try{targets.push(await inspectTarget(ctx,id,line))}catch(err){if(!(err instanceof UsageError))throw err;errors.push({line,text:`${line} \u884C\u76EE: ${err.message}`})}}if(errors.length>0){errors.sort((a,b)=>a.line-b.line);throw new UsageError(`\u30D5\u30A1\u30A4\u30EB\u306B\u524A\u9664\u3067\u304D\u306A\u3044\u884C\u304C ${errors.length} \u884C\u3042\u308B\u305F\u3081\u30011\u4EF6\u3082\u524A\u9664\u3057\u3066\u3044\u307E\u305B\u3093:
|
|
35
|
+
${errors.map(e=>e.text).join("\n ")}`,`\u6B63\u3057\u3044\u884C\u306F ${targets.length} \u884C\u3067\u3059\u3002\u305D\u306E\u884C\u3092\u76F4\u3059\u304B\u524A\u9664\u3057\u3066\u304B\u3089\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}if(targets.length===0)throw new UsageError(`\u30D5\u30A1\u30A4\u30EB\u306B\u9867\u5BA2\u306E ID \u304C\u3042\u308A\u307E\u305B\u3093: ${file}`,usage);return withTargets(input,ctx,targets)}async function withTargets(input,ctx,targets){const children=targets.
|
|
36
|
+
reduce((n,t)=>n+t.contactIds.length+(t.exists?0:t.interactionCount),0);let blocked="";if(children>0){const{isAdmin,level}=await ctx.resolver.featureLevel("customer");if(!isAdmin&&level!=="admin"){blocked=`${CHILD_DELETE_NEEDS}\uFF08\u3042\u306A\u305F\u306E\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650: ${LEVEL_LABELS[level??""]??level??"\u4E0D\u660E"}\uFF09\u3002\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u304C ${children} \u4EF6\u3042\u308B\u305F\u3081\u3001\u59CB\u3081\u308B\u3068\u4F01\u696D\u3060\u3051\u304C\u6D88\u3048\u3066\u62C5\u5F53\u8005\u304C\u6B8B\u308A\u307E\u3059\u30021\u4EF6\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093\u3002`}}
|
|
37
|
+
return withResolved(input,{targets:JSON.stringify(targets),childDeleteBlocked:blocked})}function deleteTargets(input){return JSON.parse(requireResolved(input,"targets"))}function contactPath(companyId,contactId){if(!isSafePathSegment(contactId))throw new ApiResponseError(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u62C5\u5F53\u8005 ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${contactId}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return`${childBase(
|
|
38
|
+
companyId,"contacts")}/${encodeURIComponent(contactId)}`}function firstDeletePlan(targets){for(const target of targets){if(target.exists)return{method:"DELETE",path:`${SALES_COMPANIES_PATH}/${target.id}`};const[contactId]=target.contactIds;if(contactId!==void 0)return{method:"DELETE",path:contactPath(target.id,contactId)}}return{method:"GET",path:`${SALES_COMPANIES_PATH}/${targets[0].id}`}}function targetLabel(target){const where=target.line===null?"":`${target.line} \u884C\u76EE `;return`${where}\
|
|
39
|
+
ID ${target.id}${target.name===null?"\uFF08\u4F01\u696D\u306F\u524A\u9664\u6E08\u307F\u30FB\u307E\u305F\u306F\u5B58\u5728\u3057\u306A\u3044 ID\uFF09":` ${target.name}`}`}function deletePlannedNotes(input){const targets=deleteTargets(input);const companies=targets.filter(t=>t.exists).length;const contacts=targets.reduce((n,t)=>n+t.contactIds.length,0);const interactions=targets.reduce((n,t)=>n+t.interactionCount,0);const lines=[`\u524A\u9664\u306E\u4E0B\u898B: \u4F01\u696D ${companies} \u793E\u30FB\u62C5\u5F53\u8005 ${contacts}\
|
|
40
|
+
\u4EF6\u30FB\u5BFE\u5FDC\u5C65\u6B74 ${interactions} \u4EF6\uFF08${targets.length} \u4EF6\u306E\u6307\u5B9A\uFF09`];for(const target of targets){const supplier=target.supplier?"\u30FB\u4ED5\u5165\u5148\u3068\u3057\u3066\u3082\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u524A\u9664\u3059\u308B\u3068\u4ED5\u5165\u5148\u3068\u3057\u3066\u3082\u6D88\u3048\u307E\u3059\uFF09":"";lines.push(` ${targetLabel(target)}: \u62C5\u5F53\u8005 ${target.contactIds.length} \u4EF6\u30FB\u5BFE\u5FDC\u5C65\u6B74 ${target.
|
|
41
|
+
interactionCount} \u4EF6${supplier}`)}const blocked=input.resolved?.["childDeleteBlocked"];if(blocked!==void 0&&blocked!=="")lines.push(`\u3053\u306E\u6A29\u9650\u3067\u306F\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093: ${blocked}`);if(companies+contacts+interactions===0){lines.push("\u524A\u9664\u3059\u308B\u3082\u306E\u306F\u6B8B\u3063\u3066\u3044\u307E\u305B\u3093\uFF08\u9001\u308B\u306E\u306F\u78BA\u8A8D\u306E GET \u3060\u3051\u3067\u3059\uFF09\u3002");return lines}lines.push("\u4F01\u696D\u3054\u3068\u306B\u300C\u4F01\u696D\u306E\u8AAD\u307F\u76F4\u3057\uFF08\u9867\u5BA2\u306E\
|
|
42
|
+
\u307E\u307E\u304B\uFF09\u2192 \u4F01\u696D\u306E\u524A\u9664 \u2192 \u62C5\u5F53\u8005\u306E\u524A\u9664 \u2192 \u5BFE\u5FDC\u5C65\u6B74\u304C\u6B8B\u3063\u3066\u3044\u306A\u3044\u304B\u306E\u78BA\u8A8D\u300D\u306E\u9806\u3067\u9001\u308A\u307E\u3059\uFF08\u5BFE\u5FDC\u5C65\u6B74\u306F\u4F01\u696D\u306E\u524A\u9664\u3067\u30B5\u30FC\u30D0\u304C\u9023\u9396\u3057\u3066\u6D88\u3057\u307E\u3059\uFF09\u3002","\u898B\u7A4D\u30FB\u8ACB\u6C42\u66F8\u30FB\u6848\u4EF6\u66F8\u985E\u30FB\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u7B49\u304B\u3089\u53C2\u7167\u3055\u308C\u3066\u3044\u308B\u4F01\u696D\u306F\u30B5\u30FC\u30D0\u304C\u524A\u9664\u3092\u65AD\u308A\u307E\u3059\u3002\u305D\u306E\u3068\u304D\u306F\u305D\u306E\u4F01\u696D\u3067\u306F\u4F55\u3082\u524A\u9664\u305B\u305A\u3001\u305D\u3053\u3067\u6B62\u3081\u307E\u3059\uFF08\u4F7F\u7528\u4E2D\u304B\u3069\u3046\u304B\u306F\u30B5\u30FC\u30D0\u304C\u5224\u5B9A\u3059\u308B\u306E\u3067\u3001\u3053\u306E\
|
|
43
|
+
\u4E0B\u898B\u306B\u306F\u51FA\u307E\u305B\u3093\uFF09\u3002","\u9014\u4E2D\u3067\u6B62\u307E\u3063\u305F\u3089\u3001\u6D88\u3048\u305F\u3082\u306E\u30FB\u6B8B\u3063\u305F\u3082\u306E\u3092\u51FA\u3057\u307E\u3059\u3002\u539F\u56E0\u3092\u53D6\u308A\u9664\u3044\u3066\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3059\u3068\u3001\u524A\u9664\u6E08\u307F\u306E\u4F01\u696D\u306F\u6B8B\u308A\u3060\u3051\u3092\u6D88\u3057\u307E\u3059\u3002");lines.push("--dry-run \u304C\u8868\u793A\u3059\u308B\u8981\u6C42\u306F\u3001\u6700\u521D\u306B\u72B6\u614B\u3092\u5909\u3048\u308B1\u4EF6\u3067\u3059\
|
|
44
|
+
\uFF08\u305D\u306E\u524D\u306B\u4F01\u696D\u3092\u8AAD\u307F\u76F4\u3059 GET \u3092\u9001\u308A\u307E\u3059\uFF09\u3002");return lines}function isDeleteBody(body){return isRecord(body)&&body["customerDelete"]===true&&Array.isArray(body["done"])}function rejectionReason(err){if(!(err instanceof ApiError))return err.message;const list=err.body?.error_list;const first=Array.isArray(list)?list[0]:void 0;const message=isRecord(first)?first["message"]:void 0;if(typeof message==="string"&&message!=="")
|
|
45
|
+
return message;return errorListMessages(list)[0]??err.body?.error_description??err.body?.message??err.message}var DeleteStopped=class extends Error{constructor(reason,companyDeleted,contactsDeleted,interactionsDeleted){super("stopped");this.reason=reason;this.companyDeleted=companyDeleted;this.contactsDeleted=contactsDeleted;this.interactionsDeleted=interactionsDeleted}reason;companyDeleted;contactsDeleted;interactionsDeleted};async function listAllChildren(ctx,companyId,kind){const label=kind===
|
|
46
|
+
"contacts"?"\u62C5\u5F53\u8005":"\u5BFE\u5FDC\u5C65\u6B74";const ids=[];const seenCursors=new Set;let cursor;for(;;){const body=await ctx.send({method:"GET",path:childBase(companyId,kind),query:{limit:CHILD_PAGE_LIMIT,cursor}});const items=isRecord(body)?body["items"]:void 0;if(!Array.isArray(items))throw new ApiResponseError(`${label}\u4E00\u89A7\u306E\u5FDC\u7B54\u306B items \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);
|
|
47
|
+
for(const row of items){const id=isRecord(row)?row["id"]:void 0;if(typeof id!=="string"||!isSafePathSegment(id)){throw new ApiResponseError(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F${label} ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${String(id)}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}ids.push(id)}const hasMore=isRecord(body)?body["has_more"]:void 0;const next=isRecord(body)?body["next_cursor"]:void 0;if(hasMore===false)return ids;
|
|
48
|
+
if(hasMore!==true||typeof next!=="string"||next===""||seenCursors.has(next)){throw new ApiResponseError(`${label}\u4E00\u89A7\u306E\u5FDC\u7B54\u306E has_more / next_cursor \u304C\u8AAD\u3081\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}seenCursors.add(next);cursor=next}}async function drain(ctx,companyId,kind,onDeleted){const label=kind==="contacts"?"\u62C5\u5F53\u8005":"\u5BFE\u5FDC\u5C65\u6B74";const gone=new Set;for(;;){const listed=await listAllChildren(
|
|
49
|
+
ctx,companyId,kind);const fresh=listed.filter(id=>!gone.has(id));if(fresh.length===0){for(const id of listed){try{await ctx.send({method:"GET",path:`${childBase(companyId,kind)}/${encodeURIComponent(id)}`})}catch(err){if(err instanceof ApiError&&err.status===404)continue;throw err}throw new ApiResponseError(`\u524A\u9664\u3092\u53D7\u3051\u4ED8\u3051\u305F${label}\uFF08ID ${id}\uFF09\u304C\u307E\u3060\u6B8B\u3063\u3066\u3044\u307E\u3059\u3002\u6642\u9593\u3092\u7F6E\u3044\u3066\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
|
|
50
|
+
return}for(const id of fresh){try{await ctx.send({method:"DELETE",path:`${childBase(companyId,kind)}/${encodeURIComponent(id)}`});onDeleted()}catch(err){if(!(err instanceof ApiError)||err.status!==404)throw err}gone.add(id)}}}function rejectedBeforeWrite(err){return err instanceof ApiError&&[401,403,422].includes(err.status)}async function companyNow(ctx,id){try{const body=await ctx.send({method:"GET",path:`${SALES_COMPANIES_PATH}/${id}`});return dataOf(body,"\u53D6\u5F15\u5148")}catch(err){if(err instanceof
|
|
51
|
+
ApiError&&err.status===404)return null;throw err}}async function deleteOne(ctx,target){let company="already";let current;try{current=await companyNow(ctx,target.id)}catch(err){throw new DeleteStopped(err,"no",0,0)}if(current!==null&&!flagIsCustomer(current["customer_flg"])){throw new DeleteStopped(new UsageError(`\u4E0B\u898B\u306E\u5F8C\u306B\u9867\u5BA2\u3067\u306F\u306A\u3044\uFF08\u4ED5\u5165\u5148\u3060\u3051\u306E\uFF09\u53D6\u5F15\u5148\u306B\u5909\u308F\u3063\u305F\u305F\u3081\u3001\u524A\u9664\u3057\u307E\u305B\u3093`),
|
|
52
|
+
"no",0,0)}if(current!==null){try{await ctx.send({method:"DELETE",path:`${SALES_COMPANIES_PATH}/${target.id}`});company="deleted"}catch(err){if(rejectedBeforeWrite(err))throw new DeleteStopped(err,"no",0,0);if(!(err instanceof ApiError&&err.status===404)){let after;try{after=await companyNow(ctx,target.id)}catch{throw new DeleteStopped(err,"uncertain",0,0)}if(after!==null)throw new DeleteStopped(err,"no",0,0);company="deleted"}}}let contacts=0;let interactions=0;try{await drain(ctx,target.id,"con\
|
|
53
|
+
tacts",()=>contacts+=1);await drain(ctx,target.id,"interactions",()=>interactions+=1)}catch(err){throw new DeleteStopped(err,company,contacts,interactions)}if(contacts>target.contactIds.length){ctx.warn(`ID ${target.id}: \u4E0B\u898B\u306E\u5F8C\u306B\u5897\u3048\u305F\u62C5\u5F53\u8005 ${contacts-target.contactIds.length} \u4EF6\u3082\u524A\u9664\u3057\u307E\u3057\u305F\uFF08\u4F01\u696D\u306B\u7D10\u3065\u304F\u62C5\u5F53\u8005\u3092\u6B8B\u3055\u306A\u3044\u305F\u3081\uFF09\u3002`)}return{id:target.
|
|
54
|
+
id,line:target.line,company_name:target.name,company,contacts_deleted:contacts,interactions_deleted:interactions}}function doneLine(item){const where=item.line===null?"":`${item.line} \u884C\u76EE `;const company=item.company==="deleted"?"\u4F01\u696D\u3092\u524A\u9664":"\u4F01\u696D\u306F\u524A\u9664\u6E08\u307F";return`${where}ID ${item.id}${item.company_name===null?"":` ${item.company_name}`}\uFF08${company}\u30FB\u62C5\u5F53\u8005 ${item.contacts_deleted} \u4EF6\u30FB\u9023\u9396\u3067\u6D88\u3048\u306A\u304B\u3063\u305F\u5BFE\u5FDC\u5C65\u6B74 ${item.
|
|
55
|
+
interactions_deleted} \u4EF6\uFF09`}function stopReason(err){if(err instanceof ApiError&&err.status===422)return rejectionReason(err);if(err instanceof ApiError&&err.status===403)return`\u6A29\u9650\u304C\u8DB3\u308A\u307E\u305B\u3093\uFF08${CHILD_DELETE_NEEDS}\uFF09`;return err.message}async function runDelete(input,ctx){const targets=deleteTargets(input);const blocked=input.resolved?.["childDeleteBlocked"];if(blocked!==void 0&&blocked!=="")throw new ApiRejectedError(blocked);const done=[];for(const[
|
|
56
|
+
index,target]of targets.entries()){try{done.push(await deleteOne(ctx,target))}catch(caught){if(!(caught instanceof DeleteStopped))throw caught;const err=caught.reason;const unsent=targets.slice(index+1);const touched=caught.companyDeleted!=="no"||caught.contactsDeleted+caught.interactionsDeleted>0;if(targets.length===1&&!touched)throw err;const lines=[`\u9867\u5BA2\u306E\u524A\u9664\u306F ${targetLabel(target)} \u3067\u6B62\u307E\u308A\u307E\u3057\u305F\uFF08${targets.length} \u4EF6\u4E2D \u5B8C\u4E86 ${done.
|
|
57
|
+
length} \u4EF6\u30FB\u5931\u6557 1 \u4EF6\u30FB\u672A\u7740\u624B ${unsent.length} \u4EF6\uFF09\u3002`];if(caught.companyDeleted==="no"){lines.push(` \u5931\u6557: \u4F01\u696D\u3092\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: ${stopReason(err)}`);lines.push(" \u3053\u306E\u4F01\u696D\u3067\u306F\u4F55\u3082\u524A\u9664\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u3082\u305D\u306E\u307E\u307E\u3067\u3059\uFF09\u3002")}else if(caught.
|
|
58
|
+
companyDeleted==="uncertain"){lines.push(` \u5931\u6557: \u4F01\u696D\u306E\u524A\u9664\u306E\u7D50\u679C\u304C\u5206\u304B\u308A\u307E\u305B\u3093\uFF08${err.message}\uFF09\u3002\u8AAD\u307F\u76F4\u3057\u3082\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002`);lines.push(" \u4F01\u696D\u304C\u6D88\u3048\u305F\u304B\u3069\u3046\u304B\u306F\u672A\u78BA\u8A8D\u3067\u3059\u3002\u62C5\u5F53\u8005\u306F\u307E\u3060\u6D88\u3057\u3066\u3044\u307E\u305B\u3093\u3002")}else{lines.push(` \u5931\u6557: ${caught.
|
|
59
|
+
companyDeleted==="deleted"?"\u4F01\u696D\u306F\u524A\u9664\u3057\u307E\u3057\u305F\u304C\u3001":"\u4F01\u696D\u306F\u524A\u9664\u6E08\u307F\u3067\u3059\u304C\u3001"}\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u306E\u524A\u9664\u3067\u6B62\u307E\u308A\u307E\u3057\u305F\uFF08${stopReason(err)}\uFF09\u3002`);lines.push(` \u6D88\u3057\u305F\u62C5\u5F53\u8005 ${caught.contactsDeleted} \u4EF6\u30FB\u5BFE\u5FDC\u5C65\u6B74 ${caught.interactionsDeleted} \u4EF6\u3002\u6B8B\u308A\u306F\u3053\u306E\u4F01\u696D ID \u306B\u6B8B\u3063\u3066\u3044\u307E\u3059\u3002`)}
|
|
60
|
+
lines.push(done.length===0?" \u5B8C\u4E86: \u306A\u3057":` \u5B8C\u4E86:
|
|
61
|
+
${done.map(item=>` ${doneLine(item)}`).join("\n")}`);lines.push(unsent.length===0?" \u672A\u7740\u624B: \u306A\u3057":` \u672A\u7740\u624B: ${unsent.map(t=>`ID ${t.id}`).join(" / ")}`);if(err instanceof ApiError&&err.status===422){lines.push("\u53C2\u7167\u3057\u3066\u3044\u308B\u30C7\u30FC\u30BF\u3092\u524A\u9664\u30FB\u4ED8\u3051\u66FF\u3048\u308B\u304B\u3001\u305D\u306E ID \u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u9664\u3044\u3066\u304B\u3089\u3001\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u5B8C\u4E86\u3057\u305F\u4F01\u696D\u306F\u524A\u9664\u6E08\u307F\u3068\u3057\u3066\u98DB\u3070\u3057\u307E\u3059\uFF09\u3002")}else if(err instanceof
|
|
62
|
+
ApiError&&err.status===403){lines.push(`\u3053\u306E\u6A29\u9650\u3067\u306F\u6253\u3061\u76F4\u3057\u3066\u3082\u9032\u307F\u307E\u305B\u3093\u3002${CHILD_DELETE_NEEDS}\u3002\u6A29\u9650\u3092\u6301\u3064\u4EBA\u306B\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u524A\u9664\u6E08\u307F\u306E\u4F01\u696D\u306F\u6B8B\u308A\u3060\u3051\u3092\u6D88\u3057\u307E\u3059\uFF09\u3002`)}else{lines.push("\u539F\u56E0\u3092\u53D6\u308A\u9664\u3044\u3066\u304B\u3089\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3059\u3068\u3001\u524A\u9664\u6E08\u307F\u306E\u4F01\u696D\u306F\u6B8B\u308A\u306E\u62C5\
|
|
63
|
+
\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u3060\u3051\u3092\u6D88\u3057\u307E\u3059\u3002")}ctx.warn(lines.join("\n"));if(done.length===0&&!touched)throw err;throw new ApiRejectedError(`\u9867\u5BA2\u306E\u524A\u9664\u306F\u5B8C\u4E86\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u5B8C\u4E86 ${done.length} \u4EF6\u30FB\u5931\u6557 1 \u4EF6\u30FB\u672A\u7740\u624B ${unsent.length} \u4EF6\uFF09\u3002`)}}return{customerDelete:true,done}}var deleteOperation={name:"delete",summary:"\u9867\u5BA2\u3092\u524A\u9664\u3059\u308B\uFF08\u4F01\u696D\u3068\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u3092\u307E\
|
|
64
|
+
\u3068\u3081\u3066\u3002--file \u3067\u4E00\u62EC\u30FB--yes \u304C\u8981\u308B\uFF09",usage:"twp customer delete <\u9867\u5BA2> --yes | twp customer delete --file <\u30D5\u30A1\u30A4\u30EB> --yes",description:"\u9867\u5BA2\uFF08\u53D6\u5F15\u5148\u4F01\u696D\uFF09\u3068\u3001\u305D\u308C\u306B\u7D10\u3065\u304F\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u3092\u307E\u3068\u3081\u3066\u524A\u9664\u3057\u307E\u3059\u3002\n\u9001\u308B\u524D\u306B\u4F01\u696D\u30FB\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u306E\u4EF6\u6570\u3092\u6570\u3048\u3066 stderr \u306B\u51FA\u3057\u307E\u3059\u3002--dry-run \u3067\u9001\u3089\u305A\u306B\u4E0B\u898B\u3060\u3051\u3067\u304D\u307E\u3059\u3002\n\n\u9806\u5E8F\u306F\u4F01\u696D\u3054\u3068\u306B\u300C\u4F01\u696D\u306E\u8AAD\u307F\u76F4\u3057\uFF08\u9867\u5BA2\u306E\u307E\u307E\u304B\uFF09\u2192 \u4F01\u696D\u306E\u524A\u9664 \u2192 \u62C5\u5F53\u8005\u306E\u524A\u9664 \u2192 \u5BFE\u5FDC\u5C65\u6B74\u304C\u6B8B\u3063\u3066\u3044\u306A\u3044\u304B\u306E\u78BA\u8A8D\u300D\u3067\u3059\u3002\n\u4F01\u696D\u304C\u898B\u7A4D\u30FB\u8ACB\u6C42\u66F8\u30FB\u6848\u4EF6\u66F8\u985E\u30FB\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u7B49\u304B\u3089\u53C2\u7167\u3055\u308C\u3066\u3044\u308B\u3068\u3001\u30B5\u30FC\u30D0\u304C\u524A\u9664\u3092\u65AD\u308A\u307E\u3059\uFF08\u7406\u7531\u306E\u6587\u9762\u3092\u305D\u306E\u307E\u307E\u51FA\u3057\u307E\u3059\uFF09\u3002\n\u305D\u306E\u3068\u304D\u306F\u305D\u306E\u4F01\u696D\u3067\u306F\u4F55\u3082\u524A\u9664\u305B\u305A\u306B\u6B62\u307E\u308A\u307E\u3059\uFF08\u62C5\u5F53\u8005\u3092\u5148\u306B\u6D88\u3057\u3066\u4F01\u696D\u3060\u3051\u6B8B\u308B\u3001\u306F\u8D77\u304D\u307E\u305B\u3093\uFF09\u3002\n\n\u4E00\u62EC\uFF08--file\uFF09: 1\u884C\u306B\
|
|
65
|
+
1\u3064\u9867\u5BA2\u306E ID \u3092\u66F8\u304D\u307E\u3059\uFF08\u540D\u524D\u306F\u53D7\u3051\u307E\u305B\u3093\uFF09\u3002\u7A7A\u884C\u3068 # \u3067\u59CB\u307E\u308B\u884C\u306F\u8AAD\u307F\u98DB\u3070\u3057\u307E\u3059\u3002\n\u9001\u308B\u524D\u306B\u5168\u884C\u3092\u691C\u67FB\u3057\u3001\u9867\u5BA2\u3067\u306F\u306A\u3044\uFF08\u4ED5\u5165\u5148\u3060\u3051\u306E\uFF09\u53D6\u5F15\u5148\u30FBID \u306E\u5F62\u306E\u8AA4\u308A\u30FB\u91CD\u8907\u304C1\u3064\u3067\u3082\u3042\u308C\u3070\n1\u4EF6\u3082\u9001\u3089\u305A\u306B\u884C\u756A\u53F7\u3068\u7406\u7531\u3092\u3059\u3079\u3066\u51FA\u3057\u3066\u7D42\u4E86\u30B3\u30FC\u30C9 2 \u3067\u7D42\u308F\u308A\u307E\u3059\u3002\n\u9001\u4FE1\u4E2D\u306B\u5931\u6557\u3057\u305F\u3089\u305D\u3053\u3067\u6B62\u3081\u3001\u5B8C\u4E86\u3057\u305F\u4F01\u696D\u30FB\u5931\u6557\u3057\u305F\u4F01\u696D\uFF08\u3069\u3053\u307E\u3067\u6D88\u3048\u305F\u304B\uFF09\u30FB\u672A\u7740\u624B\u306E ID \u3092\u51FA\u3057\u307E\u3059\n\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 3\u3002\u4F55\u3082\u6D88\u3057\u3066\u3044\u306A\u3051\u308C\u3070\u5931\u6557\u3057\u305F\u8981\u6C42\u306E\u7D42\u4E86\u30B3\u30FC\u30C9\uFF09\u3002\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u6253\u3061\u76F4\u3059\u3068\u3001\n\u524A\u9664\u6E08\u307F\u306E\u4F01\u696D\u306F\u6B8B\u308A\u306E\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u3060\u3051\u3092\u6D88\u3057\u3066\u9032\u307F\u307E\u3059\u3002\n\n\u9867\u5BA2\u304B\u3064\u4ED5\u5165\u5148\u306E\u4F01\u696D\u3082\u524A\u9664\u3057\u307E\u3059\uFF08\u4F01\u696D\u306F1\u4EF6\u306A\u306E\u3067\u3001\u4ED5\u5165\u5148\u3068\u3057\u3066\u3082\u6D88\u3048\u307E\u3059\u3002\u4E0B\u898B\u3067\u77E5\u3089\u305B\u307E\u3059\uFF09\u3002\n\u4F01\u696D\u306E\u524A\u9664\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u300C\u7BA1\u7406\u8005\u300D\u304B\u8CA9\u58F2\u7BA1\u7406\u306E\u300C\u30E1\u30F3\u30D0\u30FC\u300D\u4EE5\u4E0A\u3001\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u306E\u524A\u9664\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u300C\u7BA1\u7406\u8005\u300D\u304C\u8981\u308A\u307E\u3059\u3002\n\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u304C\u6B8B\u308B\u9867\u5BA2\u3092\u3001\u9867\u5BA2\u7BA1\u7406\u306E\u300C\u7BA1\u7406\u8005\u300D\u3067\u306A\u3044\u6A29\u9650\u3067\u6D88\u305D\u3046\u3068\u3059\u308B\u3068\u3001\u4F01\u696D\u3060\u3051\u6D88\u3048\u3066\u62C5\u5F53\u8005\u304C\u6B8B\u308B\u306E\u3092\u907F\u3051\u308B\u305F\u3081\n1\u4EF6\u3082\u9001\u3089\u305A\u306B\u6B62\u3081\u307E\u3059\uFF08--dry-run \u3067\u306F\u4E0B\u898B\u3068\u7406\u7531\u3092\u51FA\u3057\u307E\u3059\uFF09\u3002\n\n"+
|
|
66
|
+
REF_HELP,destructive:true,forbidden:CUSTOMER_DELETE_FORBIDDEN,flags:[FILE_FLAG],prepare:prepareDelete,plan:input=>firstDeletePlan(deleteTargets(input)),plannedNotes:deletePlannedNotes,execute:runDelete,summarize:body=>isDeleteBody(body)?body.done:body,raw:body=>isDeleteBody(body)?body.done:body,notes(body){if(!isDeleteBody(body))return[];const companies=body.done.filter(d=>d.company==="deleted").length;const contacts=body.done.reduce((n,d)=>n+d.contacts_deleted,0);const interactions=body.done.reduce(
|
|
67
|
+
(n,d)=>n+d.interactions_deleted,0);return[`\u524A\u9664\u3057\u307E\u3057\u305F: \u4F01\u696D ${companies} \u793E\u30FB\u62C5\u5F53\u8005 ${contacts} \u4EF6\uFF08\u5BFE\u5FDC\u5C65\u6B74\u306F\u4F01\u696D\u306E\u524A\u9664\u3067\u9023\u9396\u3002\u9023\u9396\u3067\u6D88\u3048\u305A\u306B\u500B\u5225\u306B\u6D88\u3057\u305F\u3082\u306E ${interactions} \u4EF6\uFF09\u3002`,"\u62C5\u5F53\u8005\u30FB\u5BFE\u5FDC\u5C65\u6B74\u304C\u4E00\u89A7\u304B\u3089\u6D88\u3048\u305F\u3053\u3068\u3092\u78BA\u304B\u3081\u3066\u304B\u3089\u7D42\u3048\u3066\u3044\u307E\u3059\u3002"]}};
|
|
68
|
+
var CUSTOMER_FLAG={name:"--customer",summary:"\u5BFE\u8C61\u306E\u9867\u5BA2\uFF08\u4F01\u696D\u540D\u30FB\u7565\u79F0\u30FB\u30AB\u30CA\u306E\u5B8C\u5168\u4E00\u81F4\u304B ID\uFF09",takesValue:true,placeholder:"<\u9867\u5BA2>"};async function prepareCustomerFlag(input,ctx,usage){const raw=nonEmpty(input.flags,CUSTOMER_FLAG.name);if(raw===void 0)throw new UsageError("--customer <\u9867\u5BA2> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usage);return withResolved(input,{companyId:await resolveCustomer(
|
|
69
|
+
ctx,raw,CUSTOMER_FLAG.name)})}function childId(input,spec,usage){const[raw,...rest]=input.args;if(raw===void 0||raw.trim()==="")throw new UsageError(`${spec.label}\u306E ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,usage);if(rest.length>0)throw new UsageError(`\u53D7\u3051\u53D6\u308C\u308B${spec.label}\u306E ID \u306F1\u3064\u3060\u3051\u3067\u3059: ${rest.join(" ")}`,usage);const id=raw.trim();if(!isSafePathSegment(id))throw new UsageError(`${spec.label}\u306E ID \u3068\u3057\u3066\u4F7F\u3048\u306A\u3044\u6587\u5B57\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059: ${id}`,
|
|
70
|
+
`twp customer ${spec.name} list \u306E id \u5217\u306E\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`);return id}function childResource(spec){const base=input=>childBase(requireResolved(input,"companyId"),spec.kind);const item=(input,usage2)=>`${base(input)}/${encodeURIComponent(childId(input,spec,usage2))}`;const one=(body,what)=>dataOf(body,what);const paging=envelopePaging({label:`${spec.label}\u4E00\u89A7`});const usage=op=>`twp customer ${spec.name} ${op} help`;return{name:spec.
|
|
71
|
+
name,summary:`\u9867\u5BA2\u306E${spec.label}\u306E\u4E00\u89A7\u30FB\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u524A\u9664`,operations:[{name:"list",summary:`\u9867\u5BA2\u306E${spec.label}\u3092\u4E00\u89A7\u3059\u308B`,usage:`twp customer ${spec.name} list --customer <\u9867\u5BA2> [--all] [--limit <\u4EF6\u6570>]`,description:`--customer \u304C\u5FC5\u9808\u3067\u3059\u3002
|
|
72
|
+
|
|
73
|
+
--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002
|
|
74
|
+
--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08${spec.columns.join(" / ")}\uFF09\u3067\u3059\u3002
|
|
75
|
+
|
|
76
|
+
${LIST_PAGING_HELP}`,flags:[...LIST_FLAGS,CUSTOMER_FLAG],paging,forbidden:levelForbidden(CUSTOMER_LICENSE,`${spec.label}\u3092\u898B\u308B\u306B\u306F\u9867\u5BA2\u7BA1\u7406\u306E\u6A29\u9650\u304C\u8981\u308A\u307E\u3059\u3002\u30C6\u30CA\u30F3\u30C8\u7BA1\u7406\u8005\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`),async prepare(input,ctx){if(input.args.length>0)throw new UsageError(`list \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,
|
|
77
|
+
usage("list"));return prepareCustomerFlag(input,ctx,usage("list"))},plan:input=>({method:"GET",path:base(input),query:{limit:positiveInteger(input.flags,"--limit"),cursor:nonEmpty(input.flags,"--cursor")}}),summarize:body=>paging.items(body).map(row=>pick(row,spec.columns)),raw:body=>paging.items(body)},{name:"create",summary:`\u9867\u5BA2\u306B${spec.label}\u3092\u767B\u9332\u3059\u308B`,usage:`twp customer ${spec.name} create --customer <\u9867\u5BA2> ${spec.required.map(f=>`${f} <\u5024>`).join(
|
|
78
|
+
" ")} [\u9805\u76EE\u2026]`,description:spec.createHelp,forbidden:childForbidden(spec.label,"edit"),flags:[...createFlags(spec.fields),CUSTOMER_FLAG],async prepare(input,ctx){if(input.args.length>0)throw new UsageError(`create \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,usage("create"));fieldBody(input,spec.fields);for(const flag of spec.required){if(!input.flags.has(flag))throw new UsageError(`${flag} \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,
|
|
79
|
+
usage("create"))}return prepareCustomerFlag(input,ctx,usage("create"))},plan:input=>({method:"POST",path:base(input),body:fieldBody(input,spec.fields)}),summarize:body=>pick(one(body,`${spec.label}\u306E\u767B\u9332`),spec.columns),raw:body=>one(body,`${spec.label}\u306E\u767B\u9332`)},{name:"update",summary:`\u9867\u5BA2\u306E${spec.label}\u3092\u66F4\u65B0\u3059\u308B`,usage:`twp customer ${spec.name} update <${spec.label}ID> --customer <\u9867\u5BA2> [\u9805\u76EE\u2026]`,description:"\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\
|
|
80
|
+
\u3051\u3092\u5909\u66F4\u3057\u307E\u3059\uFF08\u6307\u5B9A\u3057\u306A\u304B\u3063\u305F\u9805\u76EE\u306F\u5909\u308F\u308A\u307E\u305B\u3093\uFF09\u3002\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u3082\u6307\u5B9A\u3057\u306A\u3044\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002",forbidden:childForbidden(spec.label,"edit"),flags:[...updateFlags(spec.fields),CUSTOMER_FLAG],async prepare(input,ctx){if(!hasAnyField(input,spec.fields))throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
81
|
+
usage("update"));fieldBody(input,spec.fields);childId(input,spec,usage("update"));return prepareCustomerFlag(input,ctx,usage("update"))},plan:input=>({method:"PUT",path:item(input,usage("update")),body:fieldBody(input,spec.fields)}),summarize:body=>pick(one(body,`${spec.label}\u306E\u66F4\u65B0`),spec.columns),raw:body=>one(body,`${spec.label}\u306E\u66F4\u65B0`)},{name:"delete",summary:`\u9867\u5BA2\u306E${spec.label}\u3092\u524A\u9664\u3059\u308B\uFF08\u9867\u5BA2\u7BA1\u7406\u306E\u7BA1\u7406\u8005\u306E\u307F\u30FB--yes \u304C\u8981\u308B\uFF09`,
|
|
82
|
+
usage:`twp customer ${spec.name} delete <${spec.label}ID> --customer <\u9867\u5BA2> --yes`,description:`${spec.label}1\u4EF6\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u9867\u5BA2\u3054\u3068\u307E\u3068\u3081\u3066\u6D88\u3059\u306A\u3089 twp customer delete \u3092\u4F7F\u3044\u307E\u3059\u3002`,destructive:true,forbidden:childForbidden(spec.label,"delete"),flags:[CUSTOMER_FLAG],async prepare(input,ctx){childId(input,spec,usage("delete"));return prepareCustomerFlag(input,ctx,usage("delete"))},plan:input=>({
|
|
83
|
+
method:"DELETE",path:item(input,usage("delete"))}),summarize:body=>acknowledgement(body,`${spec.label}\u524A\u9664`),raw:body=>acknowledgement(body,`${spec.label}\u524A\u9664`)}]}}var contactResource=childResource({name:"contact",kind:"contacts",label:"\u62C5\u5F53\u8005",fields:CONTACT_FIELDS,required:["--name"],columns:CONTACT_COLUMNS,createHelp:"--customer \u3068 --name \u304C\u5FC5\u9808\u3067\u3059\u3002\u4F5C\u6210\u3057\u305F\u62C5\u5F53\u8005\u306E ID \u304C\u8FD4\u308A\u307E\u3059\u3002"});
|
|
84
|
+
var interactionResource=childResource({name:"interaction",kind:"interactions",label:"\u5BFE\u5FDC\u5C65\u6B74",fields:INTERACTION_FIELDS,required:["--type","--date"],columns:INTERACTION_COLUMNS,createHelp:`--customer\u30FB--type\uFF08${INTERACTION_TYPES.join(" / ")}\uFF09\u30FB--date \u304C\u5FC5\u9808\u3067\u3059\u3002\u4F5C\u6210\u3057\u305F\u5BFE\u5FDC\u5C65\u6B74\u306E ID \u304C\u8FD4\u308A\u307E\u3059\u3002`});var customerWriteOperations=[createOperation,updateOperation,deleteOperation];var customerSubresources=[
|
|
85
|
+
contactResource,interactionResource];export{levelForbidden,CUSTOMER_LICENSE,INTERACTION_TYPES,INTERACTION_FIELDS,dataOf,customerWriteOperations,customerSubresources};
|
|
@@ -5,8 +5,8 @@ import{stripTerminalControls}from"./chunk-NHYMHCAT.js";var SENSITIVE_HEADERS=new
|
|
|
5
5
|
item=>redactSecretValues(item));if(value!==null&&typeof value==="object"){const out={};for(const[key,item]of Object.entries(value)){out[key]=SECRET_KEY_NAME.test(key)?REDACTED:redactSecretValues(item)}return out}return value}function formatHeaders(headers){if(!headers)return[];const entries=headers instanceof Headers?[...headers.entries()]:Array.isArray(headers)?headers:Object.entries(headers);return entries.map(([name,value])=>{const shown=SENSITIVE_HEADERS.has(name.toLowerCase())?REDACTED:redactSecrets(
|
|
6
6
|
String(value));return` ${name.toLowerCase()}: ${shown}`})}var BODY_LIMIT=4e3;function formatBody(raw){const safe=redactSecrets(stripTerminalControls(raw));return safe.length>BODY_LIMIT?`${safe.slice(0,BODY_LIMIT)}
|
|
7
7
|
\u2026\uFF08\u4EE5\u964D ${safe.length-BODY_LIMIT} \u6587\u5B57\u3092\u7701\u7565\uFF09`:safe}function isTextualContentType(contentType){if(contentType===null)return false;return/^\s*(text\/|application\/(json|xml|javascript|x-www-form-urlencoded)|application\/[\w.+-]*\+(json|xml))/i.test(contentType)}function withDebug(inner,options={}){const write=options.write??(text=>void process.stderr.write(text));const now=options.now??(()=>Date.now());return async(input,init)=>{const method=init?.method??
|
|
8
|
-
"GET";const lines=[`[debug] \u2192 ${method} ${redactSecrets(input)}`,...formatHeaders(init?.headers)];if(typeof init?.body==="string")lines.push(` ${formatBody(init.body)}`);write(`${lines.join("\n")}
|
|
8
|
+
"GET";const lines=[`[debug] \u2192 ${method} ${redactSecrets(input)}`,...formatHeaders(init?.headers)];if(typeof init?.body==="string")lines.push(` ${formatBody(init.body)}`);else if(init?.body instanceof Uint8Array)lines.push(` \uFF08\u672C\u6587\u306F ${init.body.byteLength} \u30D0\u30A4\u30C8\u306E\u30D0\u30A4\u30C8\u5217\u3002\u51FA\u529B\u3057\u306A\u3044\uFF09`);write(`${lines.join("\n")}
|
|
9
9
|
`);const started=now();let res;try{res=await inner(input,init)}catch(err){write(`[debug] \u2717 \u901A\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F (${now()-started}ms): ${redactSecrets(err.message)}
|
|
10
|
-
`);throw err}const out=[`[debug] \u2190 ${res.status} ${res.statusText} (${now()-started}ms)`,...formatHeaders(res.headers)];const contentType=res.headers.get("content-type");if(isTextualContentType(contentType)){const raw=await res.clone().text().catch(()=>"\uFF08\u672C\u6587\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF09");if(raw!=="")out.push(` ${formatBody(raw)}`)}else{const length=res.
|
|
11
|
-
|
|
10
|
+
`);throw err}const out=[`[debug] \u2190 ${res.status} ${res.statusText} (${now()-started}ms)`,...formatHeaders(res.headers)];const contentType=res.headers.get("content-type");const attachment=/^\s*attachment\b/i.test(res.headers.get("content-disposition")??"");if(isTextualContentType(contentType)&&!attachment){const raw=await res.clone().text().catch(()=>"\uFF08\u672C\u6587\u3092\u8AAD\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF09");if(raw!=="")out.push(` ${formatBody(raw)}`)}else{const length=res.
|
|
11
|
+
headers.get("content-length");out.push(` \uFF08\u672C\u6587\u306F ${contentType??"content-type \u4E0D\u660E"}\u30FB${length===null?"\u30B5\u30A4\u30BA\u4E0D\u660E":`${length} \u30D0\u30A4\u30C8`}\u3002${attachment?"\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306E\u672C\u4F53\u306E\u305F\u3081":"\u30C6\u30AD\u30B9\u30C8\u3067\u306A\u3044\u305F\u3081"}\u51FA\u529B\u3057\u306A\u3044\uFF09`)}write(`${out.join("\n")}
|
|
12
12
|
`);return res}}export{redactSecrets,redactSecretValues,withDebug};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{createRuntime}from"./chunk-
|
|
3
|
+
import{createRuntime}from"./chunk-77DFFCZF.js";import{httpFetch}from"./chunk-J7QYPKVK.js";import{describeAutoUpdate}from"./chunk-2NKVGAAE.js";import{PACKAGE_NAME,UPDATE_COMMAND,compareVersionCores,isBelowMinSupported,parseVersionCore}from"./chunk-DXXFUNYN.js";import{stripTerminalControls}from"./chunk-NHYMHCAT.js";import{findExecutable}from"./chunk-PMOUHEJQ.js";import{execFile}from"child_process";import fs from"fs";import path from"path";function resolveNpmCommand(deps={}){const platform=deps.platform??process.platform;const env=deps.env??process.env;const npmPath=(deps.find??(name=>findExecutable(name,{env,platform})))("npm");if(npmPath===null)return null;if(platform!=="win32")return{file:npmPath,prefix:[]};if(/\.exe$/i.test(npmPath))return{file:npmPath,prefix:[]};const cliJs=path.win32.join(path.win32.dirname(npmPath),"node_modules","npm","bin","npm-cli.js");return(deps.exists??fs.existsSync)(cliJs)?{file:deps.nodePath??process.
|
|
4
4
|
execPath,prefix:[cliJs]}:null}var DEFAULT_REGISTRY="https://registry.npmjs.org";function registryBase(env=process.env){const configured=env["npm_config_registry"]?.trim();if(configured===void 0||configured==="")return DEFAULT_REGISTRY;try{const url=new URL(configured);if(url.protocol!=="https:"&&url.protocol!=="http:")return DEFAULT_REGISTRY}catch{return DEFAULT_REGISTRY}return configured.replace(/\/+$/,"")}async function fetchFromRegistry(fetchImpl=httpFetch,env=process.env){const url=`${registryBase(env)}/${PACKAGE_NAME.replace(
|
|
5
5
|
"/","%2f")}`;const res=await fetchImpl(url,{headers:{Accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(5e3)});if(!res.ok){throw new Error(`registry \u304C ${res.status} \u3092\u8FD4\u3057\u307E\u3057\u305F`)}const body=await res.json();const latest=body["dist-tags"]?.latest;if(typeof latest!=="string"||parseVersionCore(latest)===null){throw new Error("registry \u306E\u5FDC\u7B54\u306B dist-tags.latest \u304C\u3042\u308A\u307E\u305B\u3093")}return{version:latest.trim(),source:"\
|
|
6
6
|
registry"}}async function fetchFromNpmCli(){const npm=resolveNpmCommand();if(npm===null){throw new Error("npm \u304C PATH \u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093")}const stdout=await new Promise((resolve,reject)=>{execFile(npm.file,[...npm.prefix,"view",PACKAGE_NAME,"version","--json"],{timeout:15e3,windowsHide:true},(error,out)=>error?reject(error):resolve(out))});const parsed=JSON.parse(stdout.trim());const latest=typeof parsed==="string"?parsed:null;if(latest===null||parseVersionCore(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{
|
|
3
|
+
import{checkUploadQuota}from"./chunk-DDKZ5IPT.js";import{isSafePathSegment,safeProjectIdPolicy}from"./chunk-GMBJTG6A.js";import{PRIVATE_PROJECT_REF,isPrivateProjectRef}from"./chunk-GY7KI5E5.js";import{PRIVATE_TASK_KEY_PREFIX,isPrivateTaskKey,isTaskKey}from"./chunk-II5RVJQN.js";import{requireResolved,singleRef,withResolved}from"./chunk-ZN5EFDH7.js";import{isRecord,pick}from"./chunk-ZWVYVS2A.js";import{ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.js";function classifyTaskRef(ref){const value=ref.trim();if(safeProjectIdPolicy.isDirectId(value))return{kind:"id",value};if(isTaskKey(value))return{kind:"key",value};return{kind:"unknown",value}}function wantsPrivateSurface(input){const project=input.flags.get("--project");return project!==void 0&&isPrivateProjectRef(project)}function taskSurface(input,ref){const project=input.flags.get("--project");const{kind,value}=classifyTaskRef(ref);if(project!==void 0&&isPrivateProjectRef(project)){if(kind===
|
|
4
4
|
"key"&&!isPrivateTaskKey(value)){throw new UsageError(`--project ${PRIVATE_PROJECT_REF}\uFF08\u500B\u4EBA\u30BF\u30B9\u30AF\uFF09\u306B ${value} \u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u306F ${PRIVATE_TASK_KEY_PREFIX}-<\u756A\u53F7> \u306E\u5F62\u3067\u3059\u3002ID\uFF08UUID / ULID\uFF09\u3067\u3082\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002
|
|
5
5
|
\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u3092\u6307\u3059\u306A\u3089 --project ${PRIVATE_PROJECT_REF} \u3092\u5916\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return"private"}if(kind==="key"&&isPrivateTaskKey(value)&&project===void 0){throw new UsageError(`${value} \u306F\u500B\u4EBA\u30BF\u30B9\u30AF\u306E\u30AD\u30FC\u306B\u3082\u3001\u30B3\u30FC\u30C9 ${PRIVATE_TASK_KEY_PREFIX} \u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30BF\u30B9\u30AF\u30AD\u30FC\u306B\u3082\u8AAD\u3081\u307E\u3059`,
|
|
6
6
|
`\u3069\u3061\u3089\u3092\u6307\u3059\u304B --project \u3067\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002
|