makea-cli 0.2.32__tar.gz → 0.2.34__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. {makea_cli-0.2.32 → makea_cli-0.2.34}/CHANGELOG.md +17 -0
  2. {makea_cli-0.2.32 → makea_cli-0.2.34}/PKG-INFO +5 -1
  3. {makea_cli-0.2.32 → makea_cli-0.2.34}/README.md +4 -0
  4. makea_cli-0.2.34/makea_cli/__init__.py +1 -0
  5. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/api_client.py +34 -0
  6. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/__init__.py +2 -0
  7. makea_cli-0.2.34/makea_cli/commands/shiplog/cmd.py +261 -0
  8. makea_cli-0.2.34/makea_cli/commands/tasks/__init__.py +0 -0
  9. {makea_cli-0.2.32 → makea_cli-0.2.34}/pyproject.toml +1 -1
  10. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/golden_manifest.json +370 -0
  11. makea_cli-0.2.32/makea_cli/__init__.py +0 -1
  12. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/create-supplier-profile/SKILL.md +0 -0
  13. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/lark-cli-setup/SKILL.md +0 -0
  14. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/link-supplier-user/SKILL.md +0 -0
  15. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/makea-cli-setup/SKILL.md +0 -0
  16. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/payment-revenue-report/SKILL.md +0 -0
  17. {makea_cli-0.2.32 → makea_cli-0.2.34}/.claude/skills/supplier-user-id-migration/SKILL.md +0 -0
  18. {makea_cli-0.2.32 → makea_cli-0.2.34}/.gitignore +0 -0
  19. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea-collection-upload/SKILL.md +0 -0
  20. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea-collection-upload/scripts/create_products.py +0 -0
  21. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/__main__.py +0 -0
  22. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/auth_pkce.py +0 -0
  23. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/broker.py +0 -0
  24. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/_util.py +0 -0
  25. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/about/__init__.py +0 -0
  26. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/about/cmd.py +0 -0
  27. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/analytics/__init__.py +0 -0
  28. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/analytics/cmd.py +0 -0
  29. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/auth/__init__.py +0 -0
  30. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/auth/cmd.py +0 -0
  31. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/brand/__init__.py +0 -0
  32. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/brand/cmd.py +0 -0
  33. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/designer/__init__.py +0 -0
  34. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/designer/cmd.py +0 -0
  35. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/directory/__init__.py +0 -0
  36. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/directory/cmd.py +0 -0
  37. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/document/__init__.py +0 -0
  38. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/document/cmd.py +0 -0
  39. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/email/__init__.py +0 -0
  40. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/email/cmd.py +0 -0
  41. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/factory/__init__.py +0 -0
  42. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/factory/cmd.py +0 -0
  43. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/files/__init__.py +0 -0
  44. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/files/cmd.py +0 -0
  45. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/flags/__init__.py +0 -0
  46. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/flags/cmd.py +0 -0
  47. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/library/__init__.py +0 -0
  48. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/library/cmd.py +0 -0
  49. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/metrics/__init__.py +0 -0
  50. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/metrics/cmd.py +0 -0
  51. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/orders/__init__.py +0 -0
  52. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/orders/cmd.py +0 -0
  53. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/playbook/__init__.py +0 -0
  54. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/playbook/cmd.py +0 -0
  55. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/product/__init__.py +0 -0
  56. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/product/cmd.py +0 -0
  57. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/production/__init__.py +0 -0
  58. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/production/cmd.py +0 -0
  59. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/production/pricing_spec.py +0 -0
  60. {makea_cli-0.2.32/makea_cli/commands/shipping → makea_cli-0.2.34/makea_cli/commands/shiplog}/__init__.py +0 -0
  61. {makea_cli-0.2.32/makea_cli/commands/tasks → makea_cli-0.2.34/makea_cli/commands/shipping}/__init__.py +0 -0
  62. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/shipping/cmd.py +0 -0
  63. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/supplier/__init__.py +0 -0
  64. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/supplier/cmd.py +0 -0
  65. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/commands/tasks/cmd.py +0 -0
  66. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/companion.py +0 -0
  67. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/config.py +0 -0
  68. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/errors.py +0 -0
  69. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/file_reader.py +0 -0
  70. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/identity.py +0 -0
  71. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/main.py +0 -0
  72. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/output.py +0 -0
  73. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/posthog_client.py +0 -0
  74. {makea_cli-0.2.32 → makea_cli-0.2.34}/makea_cli/registry.py +0 -0
  75. {makea_cli-0.2.32 → makea_cli-0.2.34}/npm/makea-cli/README.md +0 -0
  76. {makea_cli-0.2.32 → makea_cli-0.2.34}/npm/makea-cli/makea-cli.mjs +0 -0
  77. {makea_cli-0.2.32 → makea_cli-0.2.34}/npm/makea-cli/package.json +0 -0
  78. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_broker.py +0 -0
  79. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_companion.py +0 -0
  80. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_currency_conversion.py +0 -0
  81. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_file_reader.py +0 -0
  82. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_output_contract.py +0 -0
  83. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_persona_commands.py +0 -0
  84. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_pm_reads.py +0 -0
  85. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_registry.py +0 -0
  86. {makea_cli-0.2.32 → makea_cli-0.2.34}/tests/test_supplier_scorecard.py +0 -0
  87. {makea_cli-0.2.32 → makea_cli-0.2.34}/uv.lock +0 -0
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.34
4
+
5
+ - `admin create ship-log` takes `--kind feature|fix` (required), and
6
+ `--ticket no-jira` for a change without a Jira ticket.
7
+ - `admin update ship-log` can change `--kind` and `--ticket`.
8
+
9
+ ## 0.2.33
10
+
11
+ The admin Ship log (app.makea.co/admin/ship-log): what went live, for the team.
12
+
13
+ - `admin create ship-log` records a ticket going live after a deploy, with a
14
+ plain title and summary, its commits, the Amplify job or EB version, an
15
+ optional `--watch` note and `--media` recordings or screenshots. The same
16
+ ticket with the same commits on the same day returns the existing entry.
17
+ - `admin list ship-log`, `admin update ship-log` (also attaches more media)
18
+ and `admin delete ship-log`.
19
+
3
20
  ## 0.2.32
4
21
 
5
22
  Quote requests wait while the brand's files disagree (TECH-181).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: makea-cli
3
- Version: 0.2.32
3
+ Version: 0.2.34
4
4
  Summary: Makea admin CLI (browser login + Makea admin HTTP API)
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: click<9,>=8.1
@@ -99,6 +99,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
99
99
  | `makea-cli admin create product-note` | write(ask) | `POST /admin/products/{product_id}/notes` | write a note on a product. Without --internal it goes to the brand. | — |
100
100
  | `makea-cli admin create quote-request` | write(ask) | `POST /admin/supplier/create_quote_request` | create/send a quote request to a supplier for a product (admin). Held (409 FILES_DISAGREE) while the brand's files disagree; --release-anyway sends regardless. | `create-quote-request` |
101
101
  | `makea-cli admin create quote-request-note` | write(ask) | `POST /admin/quote_requests/{quote_request_id}/reply_status_note` | write to the factory on a quote request (e.g. answer its clarification). --requirements-updated words the email as a change to the product's requirements. | — |
102
+ | `makea-cli admin create ship-log` | write(ask) | `POST /admin/ship-log/deploys` | record a change going live on the admin Ship log, after the deploy succeeded: Jira key (or `no-jira`), `--kind feature\|fix`, plain title and summary for the team, commits, Amplify job or EB version, optional `--watch` note and `--media` recordings or screenshots. | — |
102
103
  | `makea-cli admin create rule` | write(ask) | `POST /admin/playbook/{target}/rules` | add a rule to a person's (`--user`, user_id or email), a factory's (`--supplier`) or the platform-wide (`--global`, max 30 live) AI playbook; admin-authored, active unless --status. Refuses a repeat or a conflict unless --force. --reason required; --why / --proof are what the brand reads under it, --title its card name. | — |
103
104
  | `makea-cli admin create shipping-fee` | write(ask) | `POST /admin/shipping_orders/{shipping_order_id}/fees/add` | add a fee (fixed amount or percentage) on top of the freight. | — |
104
105
  | `makea-cli admin create shipping-option` | write(ask) | `POST /admin/shipping_orders/{shipping_order_id}/shipping-options` | add one freight quote (provider, speed, price, currency). | — |
@@ -107,6 +108,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
107
108
  | `makea-cli admin create supplier-link` | write(ask) | `POST /admin/product/link_supplier` | assign a factory to a product, with no price. A bare assignment is not a quote: no quote email goes out and nothing is priced. To quote, use admin submit quote on the quote request. | — |
108
109
  | `makea-cli admin create user` | write(never) | `POST /admin/users/create` | register a user and confirm the Cognito account in one step (no verification email). Allowed --user-type values: "Fas… | `create-user` |
109
110
  | `makea-cli admin delete about` | write(ask) | `DELETE /admin/about/{target}/{key}` | remove one About you line (`--user` / `--supplier`); it is not guessed again. --reason required. | — |
111
+ | `makea-cli admin delete ship-log` | write(ask) | `DELETE /admin/ship-log/deploys/{deploy_id}` | remove a Ship log entry recorded by mistake, with its recordings. | — |
110
112
  | `makea-cli admin delete feature-flag` | write(ask) | `DELETE /admin/feature-flags/{key}` | remove a flag. Every check of it then reads false, so delete it only once the code that reads it is gone. | — |
111
113
  | `makea-cli admin delete library-element` | write(never) | `DELETE /admin/designer/{user_id}/library_components/{component_id}` | remove a component from the designer's org library. | `library-delete` |
112
114
  | `makea-cli admin delete rule` | write(ask) | `DELETE /admin/playbook/{target}/rules/{rule_id}` | remove a rule (`--user` / `--supplier` / `--global`): archived, with who and why kept on it (`update rule --status active` restores it). --reason required. | — |
@@ -158,6 +160,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
158
160
  | `makea-cli admin list supplier` | read | `GET /admin/supplier/get_all_suppliers` | list all suppliers (admin). | `list-suppliers` |
159
161
  | `makea-cli admin list supplier-link` | read | `GET /admin/product/linked_suppliers/by_supplier/{supplier_id}` | direct backend query. | `get-supplier-links-by-supplier-id` |
160
162
  | `makea-cli admin list task` | read | `GET /admin/tasks` | the Makea team's open tasks (Beeboo's notes, held lessons, sample price flags, PP samples, brand asks) by kind, with notes; `--user` adds that account's own `account.*` cards; `--wrong` lists the tasks marked wrong instead. | — |
163
+ | `makea-cli admin list ship-log` | read | `GET /admin/ship-log/deploys` | deploys recorded on the Ship log between two days (`--since`, `--until`), newest first. | — |
161
164
  | `makea-cli admin list user` | read | `GET /admin/users` | list registered users (admin, optional pagination). | `list-users` |
162
165
  | `makea-cli admin send email` | write(ask) | `POST /admin/email/send` | queue an HTML email (To required, Cc optional). From must be @makea.co; HTML from --html-file or stdin ('-'). Require… | `send-email` |
163
166
  | `makea-cli admin set pricing-groups` | write(ask) | `POST /admin/production_orders/{id}/details/update` | Set a production order's pricing groups from a JSON file, copy them from the order's quote, or clear them (--clear) t… | `production-groups-set` |
@@ -181,6 +184,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
181
184
  | `makea-cli admin update shipping-order` | write(ask) | `PUT /admin/shipping_orders/{shipping_order_id}/status` | Change a shipment: --status (PUT .../status), tracking flags (POST .../tracking), --address (PUT .../shipping-address… | — |
182
185
  | `makea-cli admin update supplier` | write(ask) | `PUT /admin/supplier/update_supplier` | update an existing supplier from a JSON file (admin). Run `makea-cli get-supplier-profile-schema` FIRST to get the fi… | `update-supplier` |
183
186
  | `makea-cli admin update task` | write(ask) | `POST /admin/tasks/{task_id}/{done\|dismiss\|note}` | close a Makea task with a note: `--done` once handled (a held lesson's `--reason` goes to Beeboo's next reading), `--dismiss`, or `--dismiss --wrong` when it should never have been raised; `--note` alone adds a note and leaves it open. | — |
187
+ | `makea-cli admin update ship-log` | write(ask) | `PATCH /admin/ship-log/deploys/{deploy_id}` | fix a Ship log entry's title, summary or watch note; `--media` attaches more recordings. | — |
184
188
  | `makea-cli admin update tech-spec` | write(ask) | `POST /admin/products/{id}/technical-specifications` | persist specs from a JSON file. | `save-product-tech-spec` |
185
189
  | `makea-cli admin update tracking-status` | write(ask) | `POST /admin/tracking/carrier_status` | apply a carrier status looked up by hand (tracking-sweep skill) to one order: status, fan-out, delivered emails (--silent: state only). | — |
186
190
  | `makea-cli admin update user` | write(ask) | `PUT /admin/user-profiles/{user_id}/update` | admin updates DynamoDB user profile fields and/or Cognito custom:userType. Allowed --user-type values: "Fashion brand… | `update-user-profile` |
@@ -83,6 +83,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
83
83
  | `makea-cli admin create product-note` | write(ask) | `POST /admin/products/{product_id}/notes` | write a note on a product. Without --internal it goes to the brand. | — |
84
84
  | `makea-cli admin create quote-request` | write(ask) | `POST /admin/supplier/create_quote_request` | create/send a quote request to a supplier for a product (admin). Held (409 FILES_DISAGREE) while the brand's files disagree; --release-anyway sends regardless. | `create-quote-request` |
85
85
  | `makea-cli admin create quote-request-note` | write(ask) | `POST /admin/quote_requests/{quote_request_id}/reply_status_note` | write to the factory on a quote request (e.g. answer its clarification). --requirements-updated words the email as a change to the product's requirements. | — |
86
+ | `makea-cli admin create ship-log` | write(ask) | `POST /admin/ship-log/deploys` | record a change going live on the admin Ship log, after the deploy succeeded: Jira key (or `no-jira`), `--kind feature\|fix`, plain title and summary for the team, commits, Amplify job or EB version, optional `--watch` note and `--media` recordings or screenshots. | — |
86
87
  | `makea-cli admin create rule` | write(ask) | `POST /admin/playbook/{target}/rules` | add a rule to a person's (`--user`, user_id or email), a factory's (`--supplier`) or the platform-wide (`--global`, max 30 live) AI playbook; admin-authored, active unless --status. Refuses a repeat or a conflict unless --force. --reason required; --why / --proof are what the brand reads under it, --title its card name. | — |
87
88
  | `makea-cli admin create shipping-fee` | write(ask) | `POST /admin/shipping_orders/{shipping_order_id}/fees/add` | add a fee (fixed amount or percentage) on top of the freight. | — |
88
89
  | `makea-cli admin create shipping-option` | write(ask) | `POST /admin/shipping_orders/{shipping_order_id}/shipping-options` | add one freight quote (provider, speed, price, currency). | — |
@@ -91,6 +92,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
91
92
  | `makea-cli admin create supplier-link` | write(ask) | `POST /admin/product/link_supplier` | assign a factory to a product, with no price. A bare assignment is not a quote: no quote email goes out and nothing is priced. To quote, use admin submit quote on the quote request. | — |
92
93
  | `makea-cli admin create user` | write(never) | `POST /admin/users/create` | register a user and confirm the Cognito account in one step (no verification email). Allowed --user-type values: "Fas… | `create-user` |
93
94
  | `makea-cli admin delete about` | write(ask) | `DELETE /admin/about/{target}/{key}` | remove one About you line (`--user` / `--supplier`); it is not guessed again. --reason required. | — |
95
+ | `makea-cli admin delete ship-log` | write(ask) | `DELETE /admin/ship-log/deploys/{deploy_id}` | remove a Ship log entry recorded by mistake, with its recordings. | — |
94
96
  | `makea-cli admin delete feature-flag` | write(ask) | `DELETE /admin/feature-flags/{key}` | remove a flag. Every check of it then reads false, so delete it only once the code that reads it is gone. | — |
95
97
  | `makea-cli admin delete library-element` | write(never) | `DELETE /admin/designer/{user_id}/library_components/{component_id}` | remove a component from the designer's org library. | `library-delete` |
96
98
  | `makea-cli admin delete rule` | write(ask) | `DELETE /admin/playbook/{target}/rules/{rule_id}` | remove a rule (`--user` / `--supplier` / `--global`): archived, with who and why kept on it (`update rule --status active` restores it). --reason required. | — |
@@ -142,6 +144,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
142
144
  | `makea-cli admin list supplier` | read | `GET /admin/supplier/get_all_suppliers` | list all suppliers (admin). | `list-suppliers` |
143
145
  | `makea-cli admin list supplier-link` | read | `GET /admin/product/linked_suppliers/by_supplier/{supplier_id}` | direct backend query. | `get-supplier-links-by-supplier-id` |
144
146
  | `makea-cli admin list task` | read | `GET /admin/tasks` | the Makea team's open tasks (Beeboo's notes, held lessons, sample price flags, PP samples, brand asks) by kind, with notes; `--user` adds that account's own `account.*` cards; `--wrong` lists the tasks marked wrong instead. | — |
147
+ | `makea-cli admin list ship-log` | read | `GET /admin/ship-log/deploys` | deploys recorded on the Ship log between two days (`--since`, `--until`), newest first. | — |
145
148
  | `makea-cli admin list user` | read | `GET /admin/users` | list registered users (admin, optional pagination). | `list-users` |
146
149
  | `makea-cli admin send email` | write(ask) | `POST /admin/email/send` | queue an HTML email (To required, Cc optional). From must be @makea.co; HTML from --html-file or stdin ('-'). Require… | `send-email` |
147
150
  | `makea-cli admin set pricing-groups` | write(ask) | `POST /admin/production_orders/{id}/details/update` | Set a production order's pricing groups from a JSON file, copy them from the order's quote, or clear them (--clear) t… | `production-groups-set` |
@@ -165,6 +168,7 @@ exit code:`0` 成功 · `2` 用法错 · `3` 未登录或身份与 persona 不
165
168
  | `makea-cli admin update shipping-order` | write(ask) | `PUT /admin/shipping_orders/{shipping_order_id}/status` | Change a shipment: --status (PUT .../status), tracking flags (POST .../tracking), --address (PUT .../shipping-address… | — |
166
169
  | `makea-cli admin update supplier` | write(ask) | `PUT /admin/supplier/update_supplier` | update an existing supplier from a JSON file (admin). Run `makea-cli get-supplier-profile-schema` FIRST to get the fi… | `update-supplier` |
167
170
  | `makea-cli admin update task` | write(ask) | `POST /admin/tasks/{task_id}/{done\|dismiss\|note}` | close a Makea task with a note: `--done` once handled (a held lesson's `--reason` goes to Beeboo's next reading), `--dismiss`, or `--dismiss --wrong` when it should never have been raised; `--note` alone adds a note and leaves it open. | — |
171
+ | `makea-cli admin update ship-log` | write(ask) | `PATCH /admin/ship-log/deploys/{deploy_id}` | fix a Ship log entry's title, summary or watch note; `--media` attaches more recordings. | — |
168
172
  | `makea-cli admin update tech-spec` | write(ask) | `POST /admin/products/{id}/technical-specifications` | persist specs from a JSON file. | `save-product-tech-spec` |
169
173
  | `makea-cli admin update tracking-status` | write(ask) | `POST /admin/tracking/carrier_status` | apply a carrier status looked up by hand (tracking-sweep skill) to one order: status, fan-out, delivered emails (--silent: state only). | — |
170
174
  | `makea-cli admin update user` | write(ask) | `PUT /admin/user-profiles/{user_id}/update` | admin updates DynamoDB user profile fields and/or Cognito custom:userType. Allowed --user-type values: "Fashion brand… | `update-user-profile` |
@@ -0,0 +1 @@
1
+ __version__ = "0.2.34"
@@ -1226,6 +1226,40 @@ def admin_close_task(task_id: str, verb: str, body: dict[str, Any]) -> Any:
1226
1226
  return post_json(f"/admin/tasks/{quote(task_id, safe='')}/{verb}", body)
1227
1227
 
1228
1228
 
1229
+ # --- admin: ship log (what went live, for /admin/ship-log) -------------------------
1230
+
1231
+
1232
+ def admin_create_ship_log(body: dict[str, Any]) -> Any:
1233
+ """POST /admin/ship-log/deploys — {ticket, title, summary?, commits{backend,frontend,
1234
+ cli,miniprogram}, amplify_job?, eb_version?, watch?, deployed_at?}."""
1235
+ return post_json("/admin/ship-log/deploys", body)
1236
+
1237
+
1238
+ def admin_list_ship_log(start: str, end: str) -> Any:
1239
+ """GET /admin/ship-log/deploys?start=&end= — naive-UTC ISO bounds, newest first."""
1240
+ return get_json("/admin/ship-log/deploys", params={"start": start, "end": end})
1241
+
1242
+
1243
+ def admin_update_ship_log(deploy_id: str, body: dict[str, Any]) -> Any:
1244
+ """PATCH /admin/ship-log/deploys/{deploy_id} — {title?, summary?, watch?}."""
1245
+ return patch_json(f"/admin/ship-log/deploys/{quote(deploy_id, safe='')}", body)
1246
+
1247
+
1248
+ def admin_delete_ship_log(deploy_id: str) -> Any:
1249
+ """DELETE /admin/ship-log/deploys/{deploy_id} — the entry and its recordings."""
1250
+ return delete_json(f"/admin/ship-log/deploys/{quote(deploy_id, safe='')}")
1251
+
1252
+
1253
+ def admin_add_ship_log_media(deploy_id: str, file_path: Path, title: str = "") -> Any:
1254
+ """POST /admin/ship-log/deploys/{deploy_id}/media — one recording or screenshot."""
1255
+ return post_multipart_with_file(
1256
+ f"/admin/ship-log/deploys/{quote(deploy_id, safe='')}/media",
1257
+ file_path=file_path,
1258
+ form_fields={"title": title} if title else None,
1259
+ timeout=600.0,
1260
+ )
1261
+
1262
+
1229
1263
  # --- admin: one account's Knowledge > About you -----------------------------------
1230
1264
  # A person (user_id or email; a supplier account's person is their factory's page)
1231
1265
  # or one factory by supplier id. Every write but refresh carries a reason.
@@ -19,6 +19,7 @@ from makea_cli.commands.orders.cmd import register as register_orders
19
19
  from makea_cli.commands.playbook.cmd import register as register_playbook
20
20
  from makea_cli.commands.product.cmd import register as register_product
21
21
  from makea_cli.commands.production.cmd import register as register_production
22
+ from makea_cli.commands.shiplog.cmd import register as register_shiplog
22
23
  from makea_cli.commands.shipping.cmd import register as register_shipping
23
24
  from makea_cli.commands.supplier.cmd import register as register_supplier
24
25
  from makea_cli.commands.tasks.cmd import register as register_tasks
@@ -45,3 +46,4 @@ def register_all(app: typer.Typer) -> None:
45
46
  register_about(app)
46
47
  register_tasks(app)
47
48
  register_flags(app)
49
+ register_shiplog(app)
@@ -0,0 +1,261 @@
1
+ """Admin commands for the ship log (app.makea.co/admin/ship-log).
2
+
3
+ A ship log entry is one ticket going live: the ticket, a plain title and
4
+ one-line summary written for the team (not for engineers), the commits behind
5
+ it, the Amplify job or EB version, an optional watch note (something to do
6
+ after it is live), and recordings that show it working. Record one at the end
7
+ of every deploy; the page writes the team's standup from these entries.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from datetime import date, timedelta
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+ import typer
17
+ from rich.console import Console
18
+
19
+ from makea_cli import api_client
20
+ from makea_cli.commands._util import print_json_or_exit
21
+ from makea_cli.registry import command
22
+
23
+ console = Console()
24
+
25
+ _EPILOG = """
26
+ Examples
27
+ makea-cli admin create ship-log --ticket TECH-218 --kind fix \\
28
+ --title "Notifications open the thing they are about" \\
29
+ --summary "658 of 1,413 notifications used to land on Styles." \\
30
+ --backend 86905496 --frontend bb550dd1 --amplify-job 1714 \\
31
+ --watch "Run the prod backfill" \\
32
+ --media ~/Desktop/tech218.mp4::"Quote notification lands on the quote"
33
+ makea-cli admin create ship-log --ticket no-jira --kind feature \\
34
+ --title "Confetti when the bulk deposit lands" --frontend 5da4001c
35
+ makea-cli admin list ship-log --since 2026-11-09
36
+ makea-cli admin update ship-log 20261111T134000-ab12cd --media shot.png
37
+ makea-cli admin delete ship-log 20261111T134000-ab12cd
38
+ """.strip()
39
+
40
+
41
+ def _media_option() -> Any:
42
+ return typer.Option(
43
+ None,
44
+ "--media",
45
+ "-m",
46
+ help="Recording or screenshot to attach, PATH or PATH::Title. Repeatable.",
47
+ )
48
+
49
+
50
+ def _shas(values: list[str] | None) -> list[str]:
51
+ return [s.strip() for v in values or [] for s in v.split(",") if s.strip()]
52
+
53
+
54
+ def _parse_media(values: list[str] | None) -> list[tuple[Path, str]]:
55
+ out = []
56
+ for raw in values or []:
57
+ path_s, _, title = raw.partition("::")
58
+ path = Path(path_s).expanduser()
59
+ if not path.is_file():
60
+ raise typer.BadParameter(f"--media: no file at {path}")
61
+ out.append((path, title.strip()))
62
+ return out
63
+
64
+
65
+ def _upload(deploy_id: str, media: list[tuple[Path, str]]) -> list[Any]:
66
+ return [api_client.admin_add_ship_log_media(deploy_id, path, title) for path, title in media]
67
+
68
+
69
+ def register(app: typer.Typer) -> None:
70
+ @command(
71
+ app,
72
+ "admin",
73
+ "create",
74
+ "ship-log",
75
+ api="POST /admin/ship-log/deploys",
76
+ side_effects=[
77
+ "the deploy appears on the admin Ship log for the whole Makea team",
78
+ "the next person to open that day's standup gets it rewritten to include it",
79
+ "with --media, each file is uploaded to S3 and shown on the entry",
80
+ ],
81
+ approval="ask",
82
+ reversible=True,
83
+ idempotent=True,
84
+ help=(
85
+ "POST /admin/ship-log/deploys — record one change going live, after the deploy "
86
+ "succeeded. --ticket is its Jira key, or no-jira when it has none (shown as "
87
+ "[no-jira]); --kind says whether it is a new feature or a bug fix. "
88
+ "Title and summary are for the team: what changed for brands, "
89
+ "factories or Makea, not how. The same ticket with the same commits on the "
90
+ "same day returns the existing entry. --media uploads recordings (mp4, webm, "
91
+ "mov) or screenshots (png, jpeg, webp, gif), up to 150 MB each."
92
+ ),
93
+ epilog=_EPILOG,
94
+ )
95
+ def create_ship_log(
96
+ ticket: str = typer.Option(
97
+ ..., "--ticket", "-t", help="Jira key, e.g. TECH-218; no-jira when there is none."
98
+ ),
99
+ kind: str = typer.Option(
100
+ ..., "--kind", "-k", help="feature (something new) or fix (a bug fixed)."
101
+ ),
102
+ title: str = typer.Option(..., "--title", help="What changed, in plain words."),
103
+ summary: str = typer.Option("", "--summary", "-s", help="One or two sentences more."),
104
+ backend: list[str] = typer.Option(None, "--backend", help="garmentby-service commit(s)."),
105
+ frontend: list[str] = typer.Option(None, "--frontend", help="Frontend commit(s)."),
106
+ cli: list[str] = typer.Option(None, "--cli", help="makea-cli commit(s)."),
107
+ miniprogram: list[str] = typer.Option(
108
+ None, "--miniprogram", help="Mini program commit(s)."
109
+ ),
110
+ amplify_job: str = typer.Option("", "--amplify-job", help="Amplify job number."),
111
+ eb_version: str = typer.Option("", "--eb-version", help="Elastic Beanstalk version label."),
112
+ watch: str = typer.Option("", "--watch", help="Something to do after it is live."),
113
+ deployed_at: str | None = typer.Option(
114
+ None, "--deployed-at", help="When it went live, ISO UTC. Default: now."
115
+ ),
116
+ media: list[str] = _media_option(),
117
+ ) -> None:
118
+ """Record a deploy on the admin Ship log."""
119
+ commits = {
120
+ side: shas
121
+ for side, shas in (
122
+ ("backend", _shas(backend)),
123
+ ("frontend", _shas(frontend)),
124
+ ("cli", _shas(cli)),
125
+ ("miniprogram", _shas(miniprogram)),
126
+ )
127
+ if shas
128
+ }
129
+ if not commits:
130
+ raise typer.BadParameter(
131
+ "pass at least one of --backend, --frontend, --cli, --miniprogram"
132
+ )
133
+ files = _parse_media(media)
134
+ body: dict[str, Any] = {
135
+ "ticket": ticket,
136
+ "title": title,
137
+ "summary": summary,
138
+ "commits": commits,
139
+ "amplify_job": amplify_job,
140
+ "eb_version": eb_version,
141
+ "watch": watch,
142
+ "kind": kind,
143
+ }
144
+ if deployed_at:
145
+ body["deployed_at"] = deployed_at
146
+
147
+ def run() -> Any:
148
+ result = api_client.admin_create_ship_log(body)
149
+ deploy = (result or {}).get("deploy") if isinstance(result, dict) else None
150
+ if files and deploy and deploy.get("deploy_id"):
151
+ result["media"] = _upload(deploy["deploy_id"], files)
152
+ return result
153
+
154
+ print_json_or_exit(console, run)
155
+
156
+ @command(
157
+ app,
158
+ "admin",
159
+ "list",
160
+ "ship-log",
161
+ api="GET /admin/ship-log/deploys",
162
+ help=(
163
+ "GET /admin/ship-log/deploys — deploys between two UTC days, newest first: "
164
+ "deploy_id, ticket, title, summary, watch, commits, amplify_job, deployed_at, media."
165
+ ),
166
+ epilog=_EPILOG,
167
+ )
168
+ def list_ship_log(
169
+ since: str | None = typer.Option(
170
+ None, "--since", help="First day, YYYY-MM-DD. Default: 6 days ago."
171
+ ),
172
+ until: str | None = typer.Option(
173
+ None, "--until", help="Last day, YYYY-MM-DD. Default: today."
174
+ ),
175
+ ) -> None:
176
+ """List recorded deploys."""
177
+ try:
178
+ end = date.fromisoformat(until) if until else date.today()
179
+ start = date.fromisoformat(since) if since else end - timedelta(days=6)
180
+ except ValueError as exc:
181
+ raise typer.BadParameter("dates are YYYY-MM-DD") from exc
182
+ print_json_or_exit(
183
+ console,
184
+ lambda: api_client.admin_list_ship_log(f"{start}T00:00:00", f"{end}T23:59:59"),
185
+ )
186
+
187
+ @command(
188
+ app,
189
+ "admin",
190
+ "update",
191
+ "ship-log",
192
+ api="PATCH /admin/ship-log/deploys/{deploy_id}",
193
+ side_effects=[
194
+ "the entry changes on the admin Ship log",
195
+ "a changed title or summary gets that day's standup rewritten on its next view",
196
+ "with --media, each file is uploaded to S3 and shown on the entry",
197
+ ],
198
+ approval="ask",
199
+ reversible=True,
200
+ idempotent=False,
201
+ help=(
202
+ "PATCH /admin/ship-log/deploys/{deploy_id} — fix an entry's title, summary or "
203
+ "watch note (pass --watch '' to clear it); --media attaches more recordings."
204
+ ),
205
+ epilog=_EPILOG,
206
+ )
207
+ def update_ship_log(
208
+ deploy_id: str = typer.Argument(..., help="deploy_id (from list ship-log)."),
209
+ title: str | None = typer.Option(None, "--title"),
210
+ summary: str | None = typer.Option(None, "--summary", "-s"),
211
+ watch: str | None = typer.Option(None, "--watch"),
212
+ kind: str | None = typer.Option(None, "--kind", "-k", help="feature or fix."),
213
+ ticket: str | None = typer.Option(None, "--ticket", "-t", help="Jira key or no-jira."),
214
+ media: list[str] = _media_option(),
215
+ ) -> None:
216
+ """Fix a ship log entry or attach recordings."""
217
+ body = {
218
+ k: v
219
+ for k, v in (
220
+ ("title", title),
221
+ ("summary", summary),
222
+ ("watch", watch),
223
+ ("kind", kind),
224
+ ("ticket", ticket),
225
+ )
226
+ if v is not None
227
+ }
228
+ files = _parse_media(media)
229
+ if not body and not files:
230
+ raise typer.BadParameter(
231
+ "nothing to change: pass --title, --summary, --watch, --kind, --ticket or --media"
232
+ )
233
+
234
+ def run() -> Any:
235
+ result: dict[str, Any] = {}
236
+ if body:
237
+ result = api_client.admin_update_ship_log(deploy_id, body)
238
+ if files:
239
+ result["media"] = _upload(deploy_id, files)
240
+ return result
241
+
242
+ print_json_or_exit(console, run)
243
+
244
+ @command(
245
+ app,
246
+ "admin",
247
+ "delete",
248
+ "ship-log",
249
+ api="DELETE /admin/ship-log/deploys/{deploy_id}",
250
+ side_effects=["the entry and its recordings are removed for the whole team"],
251
+ approval="ask",
252
+ reversible=False,
253
+ idempotent=True,
254
+ help="DELETE /admin/ship-log/deploys/{deploy_id} — remove an entry recorded by mistake.",
255
+ epilog=_EPILOG,
256
+ )
257
+ def delete_ship_log(
258
+ deploy_id: str = typer.Argument(..., help="deploy_id (from list ship-log)."),
259
+ ) -> None:
260
+ """Remove a ship log entry and its recordings."""
261
+ print_json_or_exit(console, lambda: api_client.admin_delete_ship_log(deploy_id))
File without changes
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "makea-cli"
7
- version = "0.2.32"
7
+ version = "0.2.34"
8
8
  description = "Makea admin CLI (browser login + Makea admin HTTP API)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -758,6 +758,189 @@
758
758
  }
759
759
  ]
760
760
  },
761
+ {
762
+ "name": "admin create ship-log",
763
+ "persona": "admin",
764
+ "verb": "create",
765
+ "noun": "ship-log",
766
+ "access": "write",
767
+ "api": "POST /admin/ship-log/deploys",
768
+ "external": null,
769
+ "side_effects": [
770
+ "the deploy appears on the admin Ship log for the whole Makea team",
771
+ "the next person to open that day's standup gets it rewritten to include it",
772
+ "with --media, each file is uploaded to S3 and shown on the entry"
773
+ ],
774
+ "approval": "ask",
775
+ "reversible": true,
776
+ "idempotent": true,
777
+ "limit": null,
778
+ "legacy": [],
779
+ "help": "POST /admin/ship-log/deploys — record one change going live, after the deploy succeeded. --ticket is its Jira key, or no-jira when it has none (shown as [no-jira]); --kind says whether it is a new feature or a bug fix. Title and summary are for the team: what changed for brands, factories or Makea, not how. The same ticket with the same commits on the same day returns the existing entry. --media uploads recordings (mp4, webm, mov) or screenshots (png, jpeg, webp, gif), up to 150 MB each.",
780
+ "function": "makea_cli.commands.shiplog.cmd.register.<locals>.create_ship_log",
781
+ "flags": [
782
+ {
783
+ "name": "ticket",
784
+ "kind": "option",
785
+ "opts": [
786
+ "--ticket",
787
+ "-t"
788
+ ],
789
+ "type": "text",
790
+ "required": true,
791
+ "multiple": false,
792
+ "default": null,
793
+ "help": "Jira key, e.g. TECH-218; no-jira when there is none."
794
+ },
795
+ {
796
+ "name": "kind",
797
+ "kind": "option",
798
+ "opts": [
799
+ "--kind",
800
+ "-k"
801
+ ],
802
+ "type": "text",
803
+ "required": true,
804
+ "multiple": false,
805
+ "default": null,
806
+ "help": "feature (something new) or fix (a bug fixed)."
807
+ },
808
+ {
809
+ "name": "title",
810
+ "kind": "option",
811
+ "opts": [
812
+ "--title"
813
+ ],
814
+ "type": "text",
815
+ "required": true,
816
+ "multiple": false,
817
+ "default": null,
818
+ "help": "What changed, in plain words."
819
+ },
820
+ {
821
+ "name": "summary",
822
+ "kind": "option",
823
+ "opts": [
824
+ "--summary",
825
+ "-s"
826
+ ],
827
+ "type": "text",
828
+ "required": false,
829
+ "multiple": false,
830
+ "default": "",
831
+ "help": "One or two sentences more."
832
+ },
833
+ {
834
+ "name": "backend",
835
+ "kind": "option",
836
+ "opts": [
837
+ "--backend"
838
+ ],
839
+ "type": "text",
840
+ "required": false,
841
+ "multiple": true,
842
+ "default": null,
843
+ "help": "garmentby-service commit(s)."
844
+ },
845
+ {
846
+ "name": "frontend",
847
+ "kind": "option",
848
+ "opts": [
849
+ "--frontend"
850
+ ],
851
+ "type": "text",
852
+ "required": false,
853
+ "multiple": true,
854
+ "default": null,
855
+ "help": "Frontend commit(s)."
856
+ },
857
+ {
858
+ "name": "cli",
859
+ "kind": "option",
860
+ "opts": [
861
+ "--cli"
862
+ ],
863
+ "type": "text",
864
+ "required": false,
865
+ "multiple": true,
866
+ "default": null,
867
+ "help": "makea-cli commit(s)."
868
+ },
869
+ {
870
+ "name": "miniprogram",
871
+ "kind": "option",
872
+ "opts": [
873
+ "--miniprogram"
874
+ ],
875
+ "type": "text",
876
+ "required": false,
877
+ "multiple": true,
878
+ "default": null,
879
+ "help": "Mini program commit(s)."
880
+ },
881
+ {
882
+ "name": "amplify_job",
883
+ "kind": "option",
884
+ "opts": [
885
+ "--amplify-job"
886
+ ],
887
+ "type": "text",
888
+ "required": false,
889
+ "multiple": false,
890
+ "default": "",
891
+ "help": "Amplify job number."
892
+ },
893
+ {
894
+ "name": "eb_version",
895
+ "kind": "option",
896
+ "opts": [
897
+ "--eb-version"
898
+ ],
899
+ "type": "text",
900
+ "required": false,
901
+ "multiple": false,
902
+ "default": "",
903
+ "help": "Elastic Beanstalk version label."
904
+ },
905
+ {
906
+ "name": "watch",
907
+ "kind": "option",
908
+ "opts": [
909
+ "--watch"
910
+ ],
911
+ "type": "text",
912
+ "required": false,
913
+ "multiple": false,
914
+ "default": "",
915
+ "help": "Something to do after it is live."
916
+ },
917
+ {
918
+ "name": "deployed_at",
919
+ "kind": "option",
920
+ "opts": [
921
+ "--deployed-at"
922
+ ],
923
+ "type": "text",
924
+ "required": false,
925
+ "multiple": false,
926
+ "default": null,
927
+ "help": "When it went live, ISO UTC. Default: now."
928
+ },
929
+ {
930
+ "name": "media",
931
+ "kind": "option",
932
+ "opts": [
933
+ "--media",
934
+ "-m"
935
+ ],
936
+ "type": "text",
937
+ "required": false,
938
+ "multiple": true,
939
+ "default": null,
940
+ "help": "Recording or screenshot to attach, PATH or PATH::Title. Repeatable."
941
+ }
942
+ ]
943
+ },
761
944
  {
762
945
  "name": "admin create shipping-fee",
763
946
  "persona": "admin",
@@ -1576,6 +1759,39 @@
1576
1759
  }
1577
1760
  ]
1578
1761
  },
1762
+ {
1763
+ "name": "admin delete ship-log",
1764
+ "persona": "admin",
1765
+ "verb": "delete",
1766
+ "noun": "ship-log",
1767
+ "access": "write",
1768
+ "api": "DELETE /admin/ship-log/deploys/{deploy_id}",
1769
+ "external": null,
1770
+ "side_effects": [
1771
+ "the entry and its recordings are removed for the whole team"
1772
+ ],
1773
+ "approval": "ask",
1774
+ "reversible": false,
1775
+ "idempotent": true,
1776
+ "limit": null,
1777
+ "legacy": [],
1778
+ "help": "DELETE /admin/ship-log/deploys/{deploy_id} — remove an entry recorded by mistake.",
1779
+ "function": "makea_cli.commands.shiplog.cmd.register.<locals>.delete_ship_log",
1780
+ "flags": [
1781
+ {
1782
+ "name": "deploy_id",
1783
+ "kind": "argument",
1784
+ "opts": [
1785
+ "deploy_id"
1786
+ ],
1787
+ "type": "text",
1788
+ "required": true,
1789
+ "multiple": false,
1790
+ "default": null,
1791
+ "help": "deploy_id (from list ship-log)."
1792
+ }
1793
+ ]
1794
+ },
1579
1795
  {
1580
1796
  "name": "admin delete shipping-fee",
1581
1797
  "persona": "admin",
@@ -3804,6 +4020,49 @@
3804
4020
  }
3805
4021
  ]
3806
4022
  },
4023
+ {
4024
+ "name": "admin list ship-log",
4025
+ "persona": "admin",
4026
+ "verb": "list",
4027
+ "noun": "ship-log",
4028
+ "access": "read",
4029
+ "api": "GET /admin/ship-log/deploys",
4030
+ "external": null,
4031
+ "side_effects": [],
4032
+ "approval": "auto",
4033
+ "reversible": null,
4034
+ "idempotent": null,
4035
+ "limit": "client",
4036
+ "legacy": [],
4037
+ "help": "GET /admin/ship-log/deploys — deploys between two UTC days, newest first: deploy_id, ticket, title, summary, watch, commits, amplify_job, deployed_at, media.",
4038
+ "function": "makea_cli.commands.shiplog.cmd.register.<locals>.list_ship_log",
4039
+ "flags": [
4040
+ {
4041
+ "name": "since",
4042
+ "kind": "option",
4043
+ "opts": [
4044
+ "--since"
4045
+ ],
4046
+ "type": "text",
4047
+ "required": false,
4048
+ "multiple": false,
4049
+ "default": null,
4050
+ "help": "First day, YYYY-MM-DD. Default: 6 days ago."
4051
+ },
4052
+ {
4053
+ "name": "until",
4054
+ "kind": "option",
4055
+ "opts": [
4056
+ "--until"
4057
+ ],
4058
+ "type": "text",
4059
+ "required": false,
4060
+ "multiple": false,
4061
+ "default": null,
4062
+ "help": "Last day, YYYY-MM-DD. Default: today."
4063
+ }
4064
+ ]
4065
+ },
3807
4066
  {
3808
4067
  "name": "admin list shipping-order",
3809
4068
  "persona": "admin",
@@ -6564,6 +6823,117 @@
6564
6823
  }
6565
6824
  ]
6566
6825
  },
6826
+ {
6827
+ "name": "admin update ship-log",
6828
+ "persona": "admin",
6829
+ "verb": "update",
6830
+ "noun": "ship-log",
6831
+ "access": "write",
6832
+ "api": "PATCH /admin/ship-log/deploys/{deploy_id}",
6833
+ "external": null,
6834
+ "side_effects": [
6835
+ "the entry changes on the admin Ship log",
6836
+ "a changed title or summary gets that day's standup rewritten on its next view",
6837
+ "with --media, each file is uploaded to S3 and shown on the entry"
6838
+ ],
6839
+ "approval": "ask",
6840
+ "reversible": true,
6841
+ "idempotent": false,
6842
+ "limit": null,
6843
+ "legacy": [],
6844
+ "help": "PATCH /admin/ship-log/deploys/{deploy_id} — fix an entry's title, summary or watch note (pass --watch '' to clear it); --media attaches more recordings.",
6845
+ "function": "makea_cli.commands.shiplog.cmd.register.<locals>.update_ship_log",
6846
+ "flags": [
6847
+ {
6848
+ "name": "deploy_id",
6849
+ "kind": "argument",
6850
+ "opts": [
6851
+ "deploy_id"
6852
+ ],
6853
+ "type": "text",
6854
+ "required": true,
6855
+ "multiple": false,
6856
+ "default": null,
6857
+ "help": "deploy_id (from list ship-log)."
6858
+ },
6859
+ {
6860
+ "name": "title",
6861
+ "kind": "option",
6862
+ "opts": [
6863
+ "--title"
6864
+ ],
6865
+ "type": "text",
6866
+ "required": false,
6867
+ "multiple": false,
6868
+ "default": null,
6869
+ "help": null
6870
+ },
6871
+ {
6872
+ "name": "summary",
6873
+ "kind": "option",
6874
+ "opts": [
6875
+ "--summary",
6876
+ "-s"
6877
+ ],
6878
+ "type": "text",
6879
+ "required": false,
6880
+ "multiple": false,
6881
+ "default": null,
6882
+ "help": null
6883
+ },
6884
+ {
6885
+ "name": "watch",
6886
+ "kind": "option",
6887
+ "opts": [
6888
+ "--watch"
6889
+ ],
6890
+ "type": "text",
6891
+ "required": false,
6892
+ "multiple": false,
6893
+ "default": null,
6894
+ "help": null
6895
+ },
6896
+ {
6897
+ "name": "kind",
6898
+ "kind": "option",
6899
+ "opts": [
6900
+ "--kind",
6901
+ "-k"
6902
+ ],
6903
+ "type": "text",
6904
+ "required": false,
6905
+ "multiple": false,
6906
+ "default": null,
6907
+ "help": "feature or fix."
6908
+ },
6909
+ {
6910
+ "name": "ticket",
6911
+ "kind": "option",
6912
+ "opts": [
6913
+ "--ticket",
6914
+ "-t"
6915
+ ],
6916
+ "type": "text",
6917
+ "required": false,
6918
+ "multiple": false,
6919
+ "default": null,
6920
+ "help": "Jira key or no-jira."
6921
+ },
6922
+ {
6923
+ "name": "media",
6924
+ "kind": "option",
6925
+ "opts": [
6926
+ "--media",
6927
+ "-m"
6928
+ ],
6929
+ "type": "text",
6930
+ "required": false,
6931
+ "multiple": true,
6932
+ "default": null,
6933
+ "help": "Recording or screenshot to attach, PATH or PATH::Title. Repeatable."
6934
+ }
6935
+ ]
6936
+ },
6567
6937
  {
6568
6938
  "name": "admin update shipping-order",
6569
6939
  "persona": "admin",
@@ -1 +0,0 @@
1
- __version__ = "0.2.32"
File without changes
File without changes
File without changes