@shipeasy/openapi 2.5.0 → 3.0.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/openapi.json CHANGED
@@ -124,12 +124,12 @@
124
124
  },
125
125
  {
126
126
  "name": "i18n",
127
- "description": "String Manager (i18n): the worker-safe REST surface — locale profiles, the\ninsert-only key push, single-key overwrite, chunk publish, and the read-only\nkey/draft listings.\n\nThe fs/AST parts (scan, validate, install-loader, codemod) are NOT part of\nthis API — they stay in the fs-having CLI/MCP."
127
+ "description": "String Manager (i18n): the worker-safe REST surface — locale profiles, the\ninsert-only key push, single-key overwrite, profile publish, and the read-only\nkey/draft listings.\n\nThe fs/AST parts (scan, validate, install-loader, codemod) are NOT part of\nthis API — they stay in the fs-having CLI/MCP."
128
128
  },
129
129
  {
130
130
  "name": "Profiles",
131
131
  "parent": "i18n",
132
- "description": "Locale profiles (e.g. `en:prod`) — create, list, and publish a profile's chunks to the CDN."
132
+ "description": "Locale profiles (e.g. `en:prod`) — create, list, and publish a profile to the CDN."
133
133
  },
134
134
  {
135
135
  "name": "Keys",
@@ -9099,7 +9099,7 @@
9099
9099
  "get": {
9100
9100
  "operationId": "listI18nProfiles",
9101
9101
  "summary": "List i18n profiles",
9102
- "description": "Returns every locale profile in the project (e.g. `en:prod`, `fr:prod`).\n\n**Use case:** Discover which locale profiles exist before pushing keys or publishing a chunk.",
9102
+ "description": "Returns every locale profile in the project (e.g. `en:prod`, `fr:prod`).\n\n**Use case:** Discover which locale profiles exist before pushing keys or publishing.",
9103
9103
  "tags": [
9104
9104
  "Profiles"
9105
9105
  ],
@@ -9348,8 +9348,8 @@
9348
9348
  },
9349
9349
  "post": {
9350
9350
  "operationId": "pushI18nKeys",
9351
- "summary": "Push new i18n keys (insert-only)",
9352
- "description": "Add NEW keys to a profile. Insert-only — existing keys are left untouched (overwrite one with `updateI18nKey`).\n\n**Use case:** Seed newly-extracted keys without clobbering translations already in the profile.",
9351
+ "summary": "Push i18n keys (insert-only, or `force` to overwrite)",
9352
+ "description": "Add NEW keys to a profile. Insert-only by default — existing keys are left untouched and reported back as `skipped`.\n\nPass `force: true` to overwrite the existing ones in bulk with the submitted values: they come back as `updated` instead of `skipped`. Without `force` the only overwrite paths are `updateI18nKey` (one key) and the devtools-only `upsertI18nKeys`.\n\n**Use case:** Seed newly-extracted keys without clobbering translations already in the profile — or re-push a whole source-language file with `force` after the copy changed.",
9353
9353
  "tags": [
9354
9354
  "Keys"
9355
9355
  ],
@@ -9379,7 +9379,7 @@
9379
9379
  },
9380
9380
  "responses": {
9381
9381
  "201": {
9382
- "description": "Push new i18n keys (insert-only)",
9382
+ "description": "Push i18n keys (insert-only, or `force` to overwrite)",
9383
9383
  "content": {
9384
9384
  "application/json": {
9385
9385
  "schema": {
@@ -9390,8 +9390,10 @@
9390
9390
  "checkout.cta"
9391
9391
  ],
9392
9392
  "skipped": [],
9393
+ "updated": [],
9393
9394
  "pushed_count": 1,
9394
- "skipped_count": 0
9395
+ "skipped_count": 0,
9396
+ "updated_count": 0
9395
9397
  }
9396
9398
  }
9397
9399
  }
@@ -9466,8 +9468,7 @@
9466
9468
  "$ref": "#/components/schemas/UpsertI18nKeysResponse"
9467
9469
  },
9468
9470
  "example": {
9469
- "upserted": 1,
9470
- "chunk": "default"
9471
+ "upserted": 1
9471
9472
  }
9472
9473
  }
9473
9474
  }
@@ -10136,7 +10137,7 @@
10136
10137
  "post": {
10137
10138
  "operationId": "publishI18nProfile",
10138
10139
  "summary": "Publish a profile live",
10139
- "description": "Publish a profile to the CDN — rebuild its KV snapshot + purge the edge. Publishing is PROFILE-WIDE: the whole profile is snapshotted into one KV blob, so the optional `chunk` in the body is an audit label only (it does not scope what ships).\n\n**Use case:** Ship the latest translations live after pushing/updating keys.",
10140
+ "description": "Publish a profile to the CDN — rebuild its KV snapshot + purge the edge. Publishing is PROFILE-WIDE: the whole profile is snapshotted into one KV blob, so the body takes no options.\n\n**Use case:** Ship the latest translations live after pushing/updating keys.",
10140
10141
  "tags": [
10141
10142
  "Profiles"
10142
10143
  ],
@@ -10155,21 +10156,19 @@
10155
10156
  }
10156
10157
  ],
10157
10158
  "requestBody": {
10158
- "required": true,
10159
+ "required": false,
10159
10160
  "content": {
10160
10161
  "application/json": {
10161
10162
  "schema": {
10162
10163
  "$ref": "#/components/schemas/PublishI18nProfileRequest"
10163
10164
  },
10164
- "example": {
10165
- "chunk": "default"
10166
- }
10165
+ "example": {}
10167
10166
  }
10168
10167
  }
10169
10168
  },
10170
10169
  "responses": {
10171
10170
  "200": {
10172
- "description": "Publish a profile chunk",
10171
+ "description": "Publish a profile",
10173
10172
  "content": {
10174
10173
  "application/json": {
10175
10174
  "schema": {
@@ -23611,21 +23610,6 @@
23611
23610
  }
23612
23611
  ]
23613
23612
  },
23614
- "chunkId": {
23615
- "description": "Owning chunk (authoring grouping) id.",
23616
- "type": "string"
23617
- },
23618
- "chunkName": {
23619
- "description": "Name of the owning chunk (authoring grouping), or `null` when it cannot be resolved.",
23620
- "anyOf": [
23621
- {
23622
- "type": "string"
23623
- },
23624
- {
23625
- "type": "null"
23626
- }
23627
- ]
23628
- },
23629
23613
  "updatedAt": {
23630
23614
  "description": "ISO-8601 timestamp of the last edit.",
23631
23615
  "type": "string"
@@ -23643,8 +23627,6 @@
23643
23627
  "variables",
23644
23628
  "profileId",
23645
23629
  "profileName",
23646
- "chunkId",
23647
- "chunkName",
23648
23630
  "updatedAt",
23649
23631
  "updatedBy"
23650
23632
  ],
@@ -23673,13 +23655,6 @@
23673
23655
  "format": "uuid",
23674
23656
  "description": "Target profile id to upsert keys into."
23675
23657
  },
23676
- "chunk": {
23677
- "description": "Logical grouping the keys are filed under. Defaults to `default`.",
23678
- "type": "string",
23679
- "minLength": 1,
23680
- "maxLength": 64,
23681
- "default": "default"
23682
- },
23683
23658
  "keys": {
23684
23659
  "type": "array",
23685
23660
  "minItems": 1,
@@ -23734,15 +23709,10 @@
23734
23709
  "upserted": {
23735
23710
  "type": "number",
23736
23711
  "description": "Number of keys written (inserted or overwritten)."
23737
- },
23738
- "chunk": {
23739
- "type": "string",
23740
- "description": "The chunk the keys were filed under."
23741
23712
  }
23742
23713
  },
23743
23714
  "required": [
23744
- "upserted",
23745
- "chunk"
23715
+ "upserted"
23746
23716
  ],
23747
23717
  "additionalProperties": false,
23748
23718
  "description": "Result of a bulk key upsert. The affected profile's KV snapshot is rebuilt (and the CDN purged) before this returns."
@@ -23755,13 +23725,6 @@
23755
23725
  "format": "uuid",
23756
23726
  "description": "Target profile id to add keys to."
23757
23727
  },
23758
- "chunk": {
23759
- "description": "Logical grouping the new keys are filed under. Defaults to `default`.",
23760
- "type": "string",
23761
- "minLength": 1,
23762
- "maxLength": 64,
23763
- "default": "default"
23764
- },
23765
23728
  "keys": {
23766
23729
  "type": "array",
23767
23730
  "minItems": 1,
@@ -23800,7 +23763,12 @@
23800
23763
  ],
23801
23764
  "additionalProperties": false
23802
23765
  },
23803
- "description": "Keys to add. Insert-only — existing keys are reported back as `skipped`."
23766
+ "description": "Keys to add. Insert-only by default — existing keys are reported back as `skipped` (set `force` to overwrite them instead)."
23767
+ },
23768
+ "force": {
23769
+ "type": "boolean",
23770
+ "default": false,
23771
+ "description": "Overwrite keys that already exist with the submitted value instead of skipping them. Overwritten keys come back as `updated`. Off by default so a routine push can never clobber live translations."
23804
23772
  }
23805
23773
  },
23806
23774
  "required": [
@@ -23808,7 +23776,7 @@
23808
23776
  "keys"
23809
23777
  ],
23810
23778
  "additionalProperties": false,
23811
- "description": "Body for `POST /api/admin/i18n/keys`. Insert-only: keys that already exist are never overwritten — use `PUT /keys/{id}` to change a value."
23779
+ "description": "Body for `POST /api/admin/i18n/keys`. Insert-only by default: keys that already exist are never overwritten — pass `force: true` to overwrite them in bulk, or use `PUT /keys/{id}` to change one value."
23812
23780
  },
23813
23781
  "PushI18nKeysResponse": {
23814
23782
  "type": "object",
@@ -23825,7 +23793,14 @@
23825
23793
  "items": {
23826
23794
  "type": "string"
23827
23795
  },
23828
- "description": "Key names that already existed and were left untouched."
23796
+ "description": "Key names that already existed and were left untouched. Always empty when `force` was set — those key names come back under `updated` instead."
23797
+ },
23798
+ "updated": {
23799
+ "type": "array",
23800
+ "items": {
23801
+ "type": "string"
23802
+ },
23803
+ "description": "Key names that already existed and were overwritten with the submitted value. Only ever non-empty when the push set `force`."
23829
23804
  },
23830
23805
  "pushed_count": {
23831
23806
  "type": "number",
@@ -23835,19 +23810,21 @@
23835
23810
  "type": "number",
23836
23811
  "description": "Number of keys skipped (== `skipped.length`)."
23837
23812
  },
23838
- "chunk": {
23839
- "description": "The chunk the keys were filed under.",
23840
- "type": "string"
23813
+ "updated_count": {
23814
+ "type": "number",
23815
+ "description": "Number of existing keys overwritten (== `updated.length`)."
23841
23816
  }
23842
23817
  },
23843
23818
  "required": [
23844
23819
  "added",
23845
23820
  "skipped",
23821
+ "updated",
23846
23822
  "pushed_count",
23847
- "skipped_count"
23823
+ "skipped_count",
23824
+ "updated_count"
23848
23825
  ],
23849
23826
  "additionalProperties": false,
23850
- "description": "Result of an insert-only key push."
23827
+ "description": "Result of a key push — what was inserted, what was left alone, and (with `force`) what was overwritten."
23851
23828
  },
23852
23829
  "UpdateI18nKeyRequest": {
23853
23830
  "type": "object",
@@ -24121,14 +24098,9 @@
24121
24098
  },
24122
24099
  "PublishI18nProfileRequest": {
24123
24100
  "type": "object",
24124
- "properties": {
24125
- "chunk": {
24126
- "description": "Optional chunk label to stamp on the audit log. Publishing is profile-wide regardless — the whole profile is snapshotted into one KV blob.",
24127
- "type": "string"
24128
- }
24129
- },
24101
+ "properties": {},
24130
24102
  "additionalProperties": false,
24131
- "description": "Body for `POST /api/admin/i18n/profiles/{profileId}/publish`. The `chunk` is an audit label only."
24103
+ "description": "Body for `POST /api/admin/i18n/profiles/{profileId}/publish`. Publishing is profile-wide — the whole profile is snapshotted into one KV blob — so the body takes no options."
24132
24104
  },
24133
24105
  "PublishI18nProfileResponse": {
24134
24106
  "type": "object",
@@ -24142,17 +24114,6 @@
24142
24114
  "type": "string",
24143
24115
  "description": "Profile that was published."
24144
24116
  },
24145
- "chunk": {
24146
- "anyOf": [
24147
- {
24148
- "type": "string"
24149
- },
24150
- {
24151
- "type": "null"
24152
- }
24153
- ],
24154
- "description": "Audit chunk label, or `null` when none was given."
24155
- },
24156
24117
  "published_at": {
24157
24118
  "type": "string",
24158
24119
  "description": "ISO-8601 timestamp of the publish."
@@ -24190,7 +24151,6 @@
24190
24151
  "required": [
24191
24152
  "ok",
24192
24153
  "profile_id",
24193
- "chunk",
24194
24154
  "published_at",
24195
24155
  "version",
24196
24156
  "key_count",
package/openapi.yaml CHANGED
@@ -226,14 +226,14 @@ tags:
226
226
  - name: i18n
227
227
  description: |-
228
228
  String Manager (i18n): the worker-safe REST surface — locale profiles, the
229
- insert-only key push, single-key overwrite, chunk publish, and the read-only
229
+ insert-only key push, single-key overwrite, profile publish, and the read-only
230
230
  key/draft listings.
231
231
 
232
232
  The fs/AST parts (scan, validate, install-loader, codemod) are NOT part of
233
233
  this API — they stay in the fs-having CLI/MCP.
234
234
  - name: Profiles
235
235
  parent: i18n
236
- description: Locale profiles (e.g. `en:prod`) — create, list, and publish a profile's chunks to the CDN.
236
+ description: Locale profiles (e.g. `en:prod`) — create, list, and publish a profile to the CDN.
237
237
  - name: Keys
238
238
  parent: i18n
239
239
  description: Translation keys — the insert-only push, single-key overwrite, and key listing.
@@ -6698,7 +6698,7 @@ paths:
6698
6698
  description: |-
6699
6699
  Returns every locale profile in the project (e.g. `en:prod`, `fr:prod`).
6700
6700
 
6701
- **Use case:** Discover which locale profiles exist before pushing keys or publishing a chunk.
6701
+ **Use case:** Discover which locale profiles exist before pushing keys or publishing.
6702
6702
  tags:
6703
6703
  - Profiles
6704
6704
  parameters:
@@ -6867,11 +6867,13 @@ paths:
6867
6867
  name: list
6868
6868
  post:
6869
6869
  operationId: pushI18nKeys
6870
- summary: Push new i18n keys (insert-only)
6870
+ summary: Push i18n keys (insert-only, or `force` to overwrite)
6871
6871
  description: |-
6872
- Add NEW keys to a profile. Insert-only — existing keys are left untouched (overwrite one with `updateI18nKey`).
6872
+ Add NEW keys to a profile. Insert-only by default — existing keys are left untouched and reported back as `skipped`.
6873
6873
 
6874
- **Use case:** Seed newly-extracted keys without clobbering translations already in the profile.
6874
+ Pass `force: true` to overwrite the existing ones in bulk with the submitted values: they come back as `updated` instead of `skipped`. Without `force` the only overwrite paths are `updateI18nKey` (one key) and the devtools-only `upsertI18nKeys`.
6875
+
6876
+ **Use case:** Seed newly-extracted keys without clobbering translations already in the profile — or re-push a whole source-language file with `force` after the copy changed.
6875
6877
  tags:
6876
6878
  - Keys
6877
6879
  parameters:
@@ -6889,7 +6891,7 @@ paths:
6889
6891
  value: Buy now
6890
6892
  responses:
6891
6893
  '201':
6892
- description: Push new i18n keys (insert-only)
6894
+ description: Push i18n keys (insert-only, or `force` to overwrite)
6893
6895
  content:
6894
6896
  application/json:
6895
6897
  schema:
@@ -6898,8 +6900,10 @@ paths:
6898
6900
  added:
6899
6901
  - checkout.cta
6900
6902
  skipped: []
6903
+ updated: []
6901
6904
  pushed_count: 1
6902
6905
  skipped_count: 0
6906
+ updated_count: 0
6903
6907
  '400':
6904
6908
  $ref: '#/components/responses/BadRequest'
6905
6909
  '401':
@@ -6953,7 +6957,6 @@ paths:
6953
6957
  $ref: '#/components/schemas/UpsertI18nKeysResponse'
6954
6958
  example:
6955
6959
  upserted: 1
6956
- chunk: default
6957
6960
  '400':
6958
6961
  $ref: '#/components/responses/BadRequest'
6959
6962
  '401':
@@ -7420,7 +7423,7 @@ paths:
7420
7423
  operationId: publishI18nProfile
7421
7424
  summary: Publish a profile live
7422
7425
  description: |-
7423
- Publish a profile to the CDN — rebuild its KV snapshot + purge the edge. Publishing is PROFILE-WIDE: the whole profile is snapshotted into one KV blob, so the optional `chunk` in the body is an audit label only (it does not scope what ships).
7426
+ Publish a profile to the CDN — rebuild its KV snapshot + purge the edge. Publishing is PROFILE-WIDE: the whole profile is snapshotted into one KV blob, so the body takes no options.
7424
7427
 
7425
7428
  **Use case:** Ship the latest translations live after pushing/updating keys.
7426
7429
  tags:
@@ -7434,16 +7437,15 @@ paths:
7434
7437
  schema:
7435
7438
  $ref: '#/components/schemas/ResourceId'
7436
7439
  requestBody:
7437
- required: true
7440
+ required: false
7438
7441
  content:
7439
7442
  application/json:
7440
7443
  schema:
7441
7444
  $ref: '#/components/schemas/PublishI18nProfileRequest'
7442
- example:
7443
- chunk: default
7445
+ example: {}
7444
7446
  responses:
7445
7447
  '200':
7446
- description: Publish a profile chunk
7448
+ description: Publish a profile
7447
7449
  content:
7448
7450
  application/json:
7449
7451
  schema:
@@ -16730,14 +16732,6 @@ components:
16730
16732
  anyOf:
16731
16733
  - type: string
16732
16734
  - type: 'null'
16733
- chunkId:
16734
- description: Owning chunk (authoring grouping) id.
16735
- type: string
16736
- chunkName:
16737
- description: Name of the owning chunk (authoring grouping), or `null` when it cannot be resolved.
16738
- anyOf:
16739
- - type: string
16740
- - type: 'null'
16741
16735
  updatedAt:
16742
16736
  description: ISO-8601 timestamp of the last edit.
16743
16737
  type: string
@@ -16752,8 +16746,6 @@ components:
16752
16746
  - variables
16753
16747
  - profileId
16754
16748
  - profileName
16755
- - chunkId
16756
- - chunkName
16757
16749
  - updatedAt
16758
16750
  - updatedBy
16759
16751
  additionalProperties: false
@@ -16774,12 +16766,6 @@ components:
16774
16766
  type: string
16775
16767
  format: uuid
16776
16768
  description: Target profile id to upsert keys into.
16777
- chunk:
16778
- description: Logical grouping the keys are filed under. Defaults to `default`.
16779
- type: string
16780
- minLength: 1
16781
- maxLength: 64
16782
- default: default
16783
16769
  keys:
16784
16770
  type: array
16785
16771
  minItems: 1
@@ -16822,12 +16808,8 @@ components:
16822
16808
  upserted:
16823
16809
  type: number
16824
16810
  description: Number of keys written (inserted or overwritten).
16825
- chunk:
16826
- type: string
16827
- description: The chunk the keys were filed under.
16828
16811
  required:
16829
16812
  - upserted
16830
- - chunk
16831
16813
  additionalProperties: false
16832
16814
  description: Result of a bulk key upsert. The affected profile's KV snapshot is rebuilt (and the CDN purged) before this returns.
16833
16815
  PushI18nKeysRequest:
@@ -16837,12 +16819,6 @@ components:
16837
16819
  type: string
16838
16820
  format: uuid
16839
16821
  description: Target profile id to add keys to.
16840
- chunk:
16841
- description: Logical grouping the new keys are filed under. Defaults to `default`.
16842
- type: string
16843
- minLength: 1
16844
- maxLength: 64
16845
- default: default
16846
16822
  keys:
16847
16823
  type: array
16848
16824
  minItems: 1
@@ -16873,12 +16849,16 @@ components:
16873
16849
  - key
16874
16850
  - value
16875
16851
  additionalProperties: false
16876
- description: Keys to add. Insert-only — existing keys are reported back as `skipped`.
16852
+ description: Keys to add. Insert-only by default — existing keys are reported back as `skipped` (set `force` to overwrite them instead).
16853
+ force:
16854
+ type: boolean
16855
+ default: false
16856
+ description: Overwrite keys that already exist with the submitted value instead of skipping them. Overwritten keys come back as `updated`. Off by default so a routine push can never clobber live translations.
16877
16857
  required:
16878
16858
  - profile_id
16879
16859
  - keys
16880
16860
  additionalProperties: false
16881
- description: 'Body for `POST /api/admin/i18n/keys`. Insert-only: keys that already exist are never overwritten — use `PUT /keys/{id}` to change a value.'
16861
+ description: 'Body for `POST /api/admin/i18n/keys`. Insert-only by default: keys that already exist are never overwritten — pass `force: true` to overwrite them in bulk, or use `PUT /keys/{id}` to change one value.'
16882
16862
  PushI18nKeysResponse:
16883
16863
  type: object
16884
16864
  properties:
@@ -16891,23 +16871,30 @@ components:
16891
16871
  type: array
16892
16872
  items:
16893
16873
  type: string
16894
- description: Key names that already existed and were left untouched.
16874
+ description: Key names that already existed and were left untouched. Always empty when `force` was set — those key names come back under `updated` instead.
16875
+ updated:
16876
+ type: array
16877
+ items:
16878
+ type: string
16879
+ description: Key names that already existed and were overwritten with the submitted value. Only ever non-empty when the push set `force`.
16895
16880
  pushed_count:
16896
16881
  type: number
16897
16882
  description: Number of keys inserted (== `added.length`).
16898
16883
  skipped_count:
16899
16884
  type: number
16900
16885
  description: Number of keys skipped (== `skipped.length`).
16901
- chunk:
16902
- description: The chunk the keys were filed under.
16903
- type: string
16886
+ updated_count:
16887
+ type: number
16888
+ description: Number of existing keys overwritten (== `updated.length`).
16904
16889
  required:
16905
16890
  - added
16906
16891
  - skipped
16892
+ - updated
16907
16893
  - pushed_count
16908
16894
  - skipped_count
16895
+ - updated_count
16909
16896
  additionalProperties: false
16910
- description: Result of an insert-only key push.
16897
+ description: Result of a key push — what was inserted, what was left alone, and (with `force`) what was overwritten.
16911
16898
  UpdateI18nKeyRequest:
16912
16899
  type: object
16913
16900
  properties:
@@ -17102,12 +17089,9 @@ components:
17102
17089
  description: Body for `POST /api/admin/i18n/drafts/{draftId}/keys`. Upserts one staged key into an open draft — inserted when new, overwritten when it already exists. `{{var}}` placeholder names are auto-derived from the value.
17103
17090
  PublishI18nProfileRequest:
17104
17091
  type: object
17105
- properties:
17106
- chunk:
17107
- description: Optional chunk label to stamp on the audit log. Publishing is profile-wide regardless — the whole profile is snapshotted into one KV blob.
17108
- type: string
17092
+ properties: {}
17109
17093
  additionalProperties: false
17110
- description: Body for `POST /api/admin/i18n/profiles/{profileId}/publish`. The `chunk` is an audit label only.
17094
+ description: Body for `POST /api/admin/i18n/profiles/{profileId}/publish`. Publishing is profile-wide — the whole profile is snapshotted into one KV blob — so the body takes no options.
17111
17095
  PublishI18nProfileResponse:
17112
17096
  type: object
17113
17097
  properties:
@@ -17118,11 +17102,6 @@ components:
17118
17102
  profile_id:
17119
17103
  type: string
17120
17104
  description: Profile that was published.
17121
- chunk:
17122
- anyOf:
17123
- - type: string
17124
- - type: 'null'
17125
- description: Audit chunk label, or `null` when none was given.
17126
17105
  published_at:
17127
17106
  type: string
17128
17107
  description: ISO-8601 timestamp of the publish.
@@ -17151,7 +17130,6 @@ components:
17151
17130
  required:
17152
17131
  - ok
17153
17132
  - profile_id
17154
- - chunk
17155
17133
  - published_at
17156
17134
  - version
17157
17135
  - key_count
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipeasy/openapi",
3
- "version": "2.5.0",
3
+ "version": "3.0.0",
4
4
  "description": "Shipeasy admin OpenAPI 3.2 spec (hand-authored, single source of truth) + the generated TypeScript client, Zod schemas, and types. Consumed by @shipeasy/cli and @shipeasy/mcp.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",