@shipeasy/openapi 3.3.0 → 3.4.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/dist/schemas.js CHANGED
@@ -12,6 +12,7 @@ import {
12
12
  zAddToGateWhitelistResponse,
13
13
  zAlertApiRow,
14
14
  zAlertCompositeSpec,
15
+ zAlertRuleNotify,
15
16
  zAnswerOpsQuestionBody,
16
17
  zAnswerOpsQuestionHeaders,
17
18
  zAnswerOpsQuestionPath,
@@ -137,6 +138,11 @@ import {
137
138
  zCreateOpsItemRequest,
138
139
  zCreateOpsItemResponse,
139
140
  zCreateOpsItemResponse2,
141
+ zCreateOpsQaNoteBody,
142
+ zCreateOpsQaNoteHeaders,
143
+ zCreateOpsQaNotePath,
144
+ zCreateOpsQaNoteRequest,
145
+ zCreateOpsQaNoteResponse,
140
146
  zCreatePublicBugBody,
141
147
  zCreatePublicBugRequest,
142
148
  zCreatePublicBugResponse,
@@ -443,6 +449,11 @@ import {
443
449
  zListOpsItemsQuery,
444
450
  zListOpsItemsResponse,
445
451
  zListOpsItemsResponse2,
452
+ zListOpsQaNotesHeaders,
453
+ zListOpsQaNotesPath,
454
+ zListOpsQaNotesQuery,
455
+ zListOpsQaNotesResponse,
456
+ zListOpsQaNotesResponse2,
446
457
  zListOpsQuestionsHeaders,
447
458
  zListOpsQuestionsPath,
448
459
  zListOpsQuestionsQuery,
@@ -496,6 +507,9 @@ import {
496
507
  zOpsItemRelated,
497
508
  zOpsItemStatus,
498
509
  zOpsMeasurePlanContext,
510
+ zOpsQaNote,
511
+ zOpsQaNoteKind,
512
+ zOpsQaNoteVerdict,
499
513
  zOpsQuestion,
500
514
  zOpsQuestionAnswer,
501
515
  zOpsQuestionDelivery,
@@ -767,7 +781,7 @@ import {
767
781
  zUpsertProjectRequest,
768
782
  zUpsertProjectResponse,
769
783
  zUpsertProjectResponse2
770
- } from "./chunk-ZYK74ZIW.js";
784
+ } from "./chunk-Z3CY5Y44.js";
771
785
  export {
772
786
  zAckOpsItemBody,
773
787
  zAckOpsItemHeaders,
@@ -782,6 +796,7 @@ export {
782
796
  zAddToGateWhitelistResponse,
783
797
  zAlertApiRow,
784
798
  zAlertCompositeSpec,
799
+ zAlertRuleNotify,
785
800
  zAnswerOpsQuestionBody,
786
801
  zAnswerOpsQuestionHeaders,
787
802
  zAnswerOpsQuestionPath,
@@ -907,6 +922,11 @@ export {
907
922
  zCreateOpsItemRequest,
908
923
  zCreateOpsItemResponse,
909
924
  zCreateOpsItemResponse2,
925
+ zCreateOpsQaNoteBody,
926
+ zCreateOpsQaNoteHeaders,
927
+ zCreateOpsQaNotePath,
928
+ zCreateOpsQaNoteRequest,
929
+ zCreateOpsQaNoteResponse,
910
930
  zCreatePublicBugBody,
911
931
  zCreatePublicBugRequest,
912
932
  zCreatePublicBugResponse,
@@ -1213,6 +1233,11 @@ export {
1213
1233
  zListOpsItemsQuery,
1214
1234
  zListOpsItemsResponse,
1215
1235
  zListOpsItemsResponse2,
1236
+ zListOpsQaNotesHeaders,
1237
+ zListOpsQaNotesPath,
1238
+ zListOpsQaNotesQuery,
1239
+ zListOpsQaNotesResponse,
1240
+ zListOpsQaNotesResponse2,
1216
1241
  zListOpsQuestionsHeaders,
1217
1242
  zListOpsQuestionsPath,
1218
1243
  zListOpsQuestionsQuery,
@@ -1266,6 +1291,9 @@ export {
1266
1291
  zOpsItemRelated,
1267
1292
  zOpsItemStatus,
1268
1293
  zOpsMeasurePlanContext,
1294
+ zOpsQaNote,
1295
+ zOpsQaNoteKind,
1296
+ zOpsQaNoteVerdict,
1269
1297
  zOpsQuestion,
1270
1298
  zOpsQuestionAnswer,
1271
1299
  zOpsQuestionDelivery,
package/openapi.json CHANGED
@@ -123,6 +123,11 @@
123
123
  "parent": "Ops",
124
124
  "description": "Structured questions an agent asks the team about a queue item — the\n`AskUserQuestion` shape: a short `header`, the `question`, 2–4 `options`\n(label + description), and `multiSelect` for checkboxes instead of radios.\nEvery question also accepts a free-text \"Other\" answer. Open questions sit\nat the very top of the item's detail panel and mark the row in the queue.\n\n**Asking.** `ask` posts 1–4 questions at once. Several agents (or several\nruns) may have questions open on the same item at the same time.\n\n**Getting the answer back.** `delivery: resume` (the default for a run\nlaunched through a trigger connector) re-fires that same agent on the\nitem once every question its run asked is answered, continuing the same\nrun record with the answers in the prompt. `delivery: poll` (the default\nfor a live, connector-less session such as Claude Code in a terminal)\nfires nothing — call `list` until the status reads `completed`."
125
125
  },
126
+ {
127
+ "name": "QA notes",
128
+ "parent": "Ops",
129
+ "description": "Typed QA notes on a queue item — the QA follow-up that is not discussion.\nEach note is one of four kinds: `narrowing` (only part of the bug still\nfails), `clarification` (changes what \"fixed\" means), `verification` (a\n`pass` / `fail` verdict on a fix) or `correction` (withdraws an earlier\nframing). Notes are append-only, carry their author and time, and render in\ntheir own section of the item's detail panel, separate from the comment\nthread. A failing verification offers a \"Reopen item\" action in the\ndashboard; it is always an explicit click, never a side effect of `create`."
130
+ },
126
131
  {
127
132
  "name": "Projects",
128
133
  "description": "Projects: the account-level container every other resource is scoped to.\n\n**Account-level, not bound-project-level.** Both operations resolve from the caller's credential rather than the `.shipeasy`-bound project — `current` reads the project the auth header maps to, and `upsert` find-or-creates under the session's owner. Neither touches the local `.shipeasy` binding; recording the result there is a consumer side-effect layered on top.\n\n**Idempotent upsert.** A project is keyed by `(owner_email, domain)`. Calling `upsert` again with the same domain returns the existing project with `created: false`, so it is safe to run on every install."
@@ -8990,6 +8995,167 @@
8990
8995
  }
8991
8996
  }
8992
8997
  },
8998
+ "/api/admin/ops/{handle}/qa-notes": {
8999
+ "get": {
9000
+ "operationId": "listOpsQaNotes",
9001
+ "summary": "List an item's QA notes",
9002
+ "description": "The typed QA notes on a queue item, newest first (max 200) — narrowing,\nclarification, verification and correction notes, each with its author and\ntime. They are separate from the comment thread: read these to learn the\nCURRENT QA state of a ticket (what remains failing, what \"fixed\" now means,\nthe last verification verdict) without parsing prose comments.\n\n**Use case:** A coding agent picks an item up and checks the latest\n`verification` verdict and any `narrowing` note before touching the code.",
9003
+ "tags": [
9004
+ "QA notes"
9005
+ ],
9006
+ "parameters": [
9007
+ {
9008
+ "$ref": "#/components/parameters/ProjectId"
9009
+ },
9010
+ {
9011
+ "name": "handle",
9012
+ "in": "path",
9013
+ "required": true,
9014
+ "description": "Per-project item number (e.g. `7`) or the full ops item id.",
9015
+ "schema": {
9016
+ "$ref": "#/components/schemas/ResourceId"
9017
+ }
9018
+ },
9019
+ {
9020
+ "name": "kind",
9021
+ "in": "query",
9022
+ "required": false,
9023
+ "description": "Only notes of this kind.",
9024
+ "schema": {
9025
+ "$ref": "#/components/schemas/OpsQaNoteKind"
9026
+ }
9027
+ }
9028
+ ],
9029
+ "responses": {
9030
+ "200": {
9031
+ "description": "List an item's QA notes",
9032
+ "content": {
9033
+ "application/json": {
9034
+ "schema": {
9035
+ "$ref": "#/components/schemas/ListOpsQaNotesResponse"
9036
+ }
9037
+ }
9038
+ }
9039
+ },
9040
+ "400": {
9041
+ "$ref": "#/components/responses/BadRequest"
9042
+ },
9043
+ "401": {
9044
+ "$ref": "#/components/responses/Unauthorized"
9045
+ },
9046
+ "403": {
9047
+ "$ref": "#/components/responses/Forbidden"
9048
+ },
9049
+ "404": {
9050
+ "$ref": "#/components/responses/NotFound"
9051
+ },
9052
+ "422": {
9053
+ "$ref": "#/components/responses/UnprocessableEntity"
9054
+ }
9055
+ },
9056
+ "x-error-codes": [
9057
+ "BAD_REQUEST",
9058
+ "UNAUTHORIZED",
9059
+ "FORBIDDEN",
9060
+ "NOT_FOUND"
9061
+ ],
9062
+ "x-cli": {
9063
+ "name": "list",
9064
+ "positional": [
9065
+ "handle"
9066
+ ]
9067
+ }
9068
+ },
9069
+ "post": {
9070
+ "operationId": "createOpsQaNote",
9071
+ "summary": "Add a QA note to an item",
9072
+ "description": "Append one typed QA note to a queue item. `kind` is `narrowing` (what now\npasses vs what still fails), `clarification` (what \"fixed\" now means),\n`verification` (requires a `verdict` of `pass` or `fail`, and `body` says\nwhat was checked) or `correction` (withdraws an earlier framing). Notes\nare append-only and appear in the item's QA notes section, not in the\ncomment thread. The author is the caller's identity; pass `agent` to\nrecord the note as written by that agent type's QA automation. A `fail` verdict never changes the item's\nstatus by itself: the dashboard offers an explicit \"Reopen item\" action,\nand `ops update --status open` does the same from the CLI.\n\n**Use case:** QA automation records \"verified on production: FAIL, the\nsecond facet still errors\" as data an agent can read back.",
9073
+ "tags": [
9074
+ "QA notes"
9075
+ ],
9076
+ "parameters": [
9077
+ {
9078
+ "$ref": "#/components/parameters/ProjectId"
9079
+ },
9080
+ {
9081
+ "name": "handle",
9082
+ "in": "path",
9083
+ "required": true,
9084
+ "description": "Per-project item number (e.g. `7`) or the full ops item id.",
9085
+ "schema": {
9086
+ "$ref": "#/components/schemas/ResourceId"
9087
+ }
9088
+ }
9089
+ ],
9090
+ "requestBody": {
9091
+ "required": true,
9092
+ "content": {
9093
+ "application/json": {
9094
+ "schema": {
9095
+ "$ref": "#/components/schemas/CreateOpsQaNoteRequest"
9096
+ },
9097
+ "examples": {
9098
+ "verification": {
9099
+ "summary": "A failing verification",
9100
+ "value": {
9101
+ "kind": "verification",
9102
+ "verdict": "fail",
9103
+ "body": "Retested on production after the deploy — the export still drops the second sheet"
9104
+ }
9105
+ },
9106
+ "narrowing": {
9107
+ "summary": "Narrow a bug to the facet that still fails",
9108
+ "value": {
9109
+ "kind": "narrowing",
9110
+ "body": "The list view is fixed; only the detail panel still shows the stale count"
9111
+ }
9112
+ }
9113
+ }
9114
+ }
9115
+ }
9116
+ },
9117
+ "responses": {
9118
+ "200": {
9119
+ "description": "The created note",
9120
+ "content": {
9121
+ "application/json": {
9122
+ "schema": {
9123
+ "$ref": "#/components/schemas/OpsQaNote"
9124
+ }
9125
+ }
9126
+ }
9127
+ },
9128
+ "400": {
9129
+ "$ref": "#/components/responses/BadRequest"
9130
+ },
9131
+ "401": {
9132
+ "$ref": "#/components/responses/Unauthorized"
9133
+ },
9134
+ "403": {
9135
+ "$ref": "#/components/responses/Forbidden"
9136
+ },
9137
+ "404": {
9138
+ "$ref": "#/components/responses/NotFound"
9139
+ },
9140
+ "422": {
9141
+ "$ref": "#/components/responses/UnprocessableEntity"
9142
+ }
9143
+ },
9144
+ "x-error-codes": [
9145
+ "BAD_REQUEST",
9146
+ "UNAUTHORIZED",
9147
+ "FORBIDDEN",
9148
+ "NOT_FOUND",
9149
+ "VALIDATION"
9150
+ ],
9151
+ "x-cli": {
9152
+ "name": "create",
9153
+ "positional": [
9154
+ "handle"
9155
+ ]
9156
+ }
9157
+ }
9158
+ },
8993
9159
  "/api/admin/agent-profiles": {
8994
9160
  "get": {
8995
9161
  "operationId": "listOpsAgents",
@@ -24438,6 +24604,141 @@
24438
24604
  "minProperties": 1,
24439
24605
  "description": "Body for `POST /api/admin/ops/{handle}/questions/{questionId}/answer` — pick option labels, write a free-text answer, or both (multi-select only)."
24440
24606
  },
24607
+ "OpsQaNoteKind": {
24608
+ "type": "string",
24609
+ "enum": [
24610
+ "narrowing",
24611
+ "clarification",
24612
+ "verification",
24613
+ "correction"
24614
+ ],
24615
+ "description": "What a QA note is — `narrowing` (only part of the bug still fails), `clarification` (changes what \"fixed\" means), `verification` (a pass/fail verdict on a fix) or `correction` (withdraws an earlier framing)."
24616
+ },
24617
+ "OpsQaNoteVerdict": {
24618
+ "type": "string",
24619
+ "enum": [
24620
+ "pass",
24621
+ "fail"
24622
+ ],
24623
+ "description": "The outcome a `verification` note records."
24624
+ },
24625
+ "OpsQaNote": {
24626
+ "type": "object",
24627
+ "properties": {
24628
+ "id": {
24629
+ "type": "string",
24630
+ "description": "Note id."
24631
+ },
24632
+ "feedbackId": {
24633
+ "type": "string",
24634
+ "description": "The queue item the note hangs off."
24635
+ },
24636
+ "kind": {
24637
+ "$ref": "#/components/schemas/OpsQaNoteKind"
24638
+ },
24639
+ "verdict": {
24640
+ "anyOf": [
24641
+ {
24642
+ "$ref": "#/components/schemas/OpsQaNoteVerdict"
24643
+ },
24644
+ {
24645
+ "type": "null"
24646
+ }
24647
+ ],
24648
+ "description": "The pass/fail verdict of a `verification` note; `null` for every other kind."
24649
+ },
24650
+ "body": {
24651
+ "type": "string",
24652
+ "description": "The note (markdown) — for a `verification`, what was checked."
24653
+ },
24654
+ "authorEmail": {
24655
+ "anyOf": [
24656
+ {
24657
+ "type": "string"
24658
+ },
24659
+ {
24660
+ "type": "null"
24661
+ }
24662
+ ],
24663
+ "description": "Email of the person (or the key's actor) who wrote the note, or `null` when an agent wrote it."
24664
+ },
24665
+ "authorAgent": {
24666
+ "anyOf": [
24667
+ {
24668
+ "type": "string",
24669
+ "enum": [
24670
+ "jarvis",
24671
+ "claude",
24672
+ "cursor",
24673
+ "copilot",
24674
+ "jules"
24675
+ ]
24676
+ },
24677
+ {
24678
+ "type": "null"
24679
+ }
24680
+ ],
24681
+ "description": "The agent type that wrote the note (QA automation), or `null` for a person."
24682
+ },
24683
+ "createdAt": {
24684
+ "type": "string",
24685
+ "description": "ISO-8601 creation timestamp."
24686
+ }
24687
+ },
24688
+ "required": [
24689
+ "id",
24690
+ "feedbackId",
24691
+ "kind",
24692
+ "verdict",
24693
+ "body",
24694
+ "authorEmail",
24695
+ "authorAgent",
24696
+ "createdAt"
24697
+ ],
24698
+ "additionalProperties": false,
24699
+ "description": "One typed, append-only QA note on a queue item."
24700
+ },
24701
+ "ListOpsQaNotesResponse": {
24702
+ "type": "array",
24703
+ "items": {
24704
+ "$ref": "#/components/schemas/OpsQaNote"
24705
+ },
24706
+ "description": "Response for `GET /api/admin/ops/{handle}/qa-notes` — the item's QA notes, newest first (max 200)."
24707
+ },
24708
+ "CreateOpsQaNoteRequest": {
24709
+ "type": "object",
24710
+ "properties": {
24711
+ "kind": {
24712
+ "$ref": "#/components/schemas/OpsQaNoteKind"
24713
+ },
24714
+ "body": {
24715
+ "type": "string",
24716
+ "minLength": 1,
24717
+ "maxLength": 10000,
24718
+ "description": "The note (markdown)."
24719
+ },
24720
+ "verdict": {
24721
+ "$ref": "#/components/schemas/OpsQaNoteVerdict"
24722
+ },
24723
+ "agent": {
24724
+ "type": "string",
24725
+ "enum": [
24726
+ "jarvis",
24727
+ "claude",
24728
+ "cursor",
24729
+ "copilot",
24730
+ "jules"
24731
+ ],
24732
+ "description": "The agent type writing the note — pass your own type when you are QA automation. Omitted, the note is attributed to the caller's identity."
24733
+ }
24734
+ },
24735
+ "required": [
24736
+ "kind",
24737
+ "body"
24738
+ ],
24739
+ "additionalProperties": false,
24740
+ "description": "Body for `POST /api/admin/ops/{handle}/qa-notes`. A `verification` note requires `verdict`; every other kind rejects it."
24741
+ },
24441
24742
  "OpsAgentProfile": {
24442
24743
  "type": "object",
24443
24744
  "properties": {
@@ -24741,6 +25042,67 @@
24741
25042
  ],
24742
25043
  "additionalProperties": false
24743
25044
  },
25045
+ "AlertRuleNotify": {
25046
+ "anyOf": [
25047
+ {
25048
+ "type": "object",
25049
+ "properties": {
25050
+ "slackChannel": {
25051
+ "anyOf": [
25052
+ {
25053
+ "type": "object",
25054
+ "properties": {
25055
+ "id": {
25056
+ "type": "string",
25057
+ "minLength": 1
25058
+ },
25059
+ "name": {
25060
+ "type": "string",
25061
+ "minLength": 1
25062
+ }
25063
+ },
25064
+ "required": [
25065
+ "id",
25066
+ "name"
25067
+ ],
25068
+ "additionalProperties": false
25069
+ },
25070
+ {
25071
+ "type": "null"
25072
+ }
25073
+ ]
25074
+ },
25075
+ "email": {
25076
+ "anyOf": [
25077
+ {
25078
+ "type": "string",
25079
+ "format": "email"
25080
+ },
25081
+ {
25082
+ "type": "null"
25083
+ }
25084
+ ]
25085
+ },
25086
+ "inApp": {
25087
+ "anyOf": [
25088
+ {
25089
+ "type": "boolean"
25090
+ },
25091
+ {
25092
+ "type": "null"
25093
+ }
25094
+ ],
25095
+ "description": "Whether the in-app notification (the dashboard bell and Home) is recorded when the rule fires. Absent or `null` means on; `false` skips it for this rule."
25096
+ }
25097
+ },
25098
+ "additionalProperties": false
25099
+ },
25100
+ {
25101
+ "type": "null"
25102
+ }
25103
+ ],
25104
+ "description": "Delivery target for a rule's alert; `null` = use the project default. The `NotificationTarget` shape plus the in-app switch."
25105
+ },
24744
25106
  "ListAlertRulesResponse": {
24745
25107
  "type": "array",
24746
25108
  "items": {
@@ -24970,7 +25332,7 @@
24970
25332
  "description": "Whether the rule is evaluated by the cron."
24971
25333
  },
24972
25334
  "notify": {
24973
- "$ref": "#/components/schemas/NotificationTarget"
25335
+ "$ref": "#/components/schemas/AlertRuleNotify"
24974
25336
  },
24975
25337
  "createdAt": {
24976
25338
  "type": "string",
@@ -25240,7 +25602,7 @@
25240
25602
  "type": "boolean"
25241
25603
  },
25242
25604
  "notify": {
25243
- "$ref": "#/components/schemas/NotificationTarget"
25605
+ "$ref": "#/components/schemas/AlertRuleNotify"
25244
25606
  }
25245
25607
  },
25246
25608
  "required": [
@@ -25481,7 +25843,7 @@
25481
25843
  "type": "boolean"
25482
25844
  },
25483
25845
  "notify": {
25484
- "$ref": "#/components/schemas/NotificationTarget"
25846
+ "$ref": "#/components/schemas/AlertRuleNotify"
25485
25847
  }
25486
25848
  },
25487
25849
  "additionalProperties": false
@@ -28749,6 +29111,16 @@
28749
29111
  }
28750
29112
  ],
28751
29113
  "description": "Last 4 characters of the raw token, so the dashboard mask is matchable against the held key. `null` for keys minted before this column."
29114
+ },
29115
+ "origin": {
29116
+ "type": "string",
29117
+ "enum": [
29118
+ "cli",
29119
+ "mobile",
29120
+ "dashboard",
29121
+ "api"
29122
+ ],
29123
+ "description": "Where the key was minted. `cli` (a signed-in CLI session from device auth), `mobile` (a mobile app login), `dashboard` (the \"New API key\" dialog) or `api` (minted with another key — CLI, MCP, agents). Set at mint time; keys that predate the column were backfilled from their label, defaulting to `dashboard`."
28752
29124
  }
28753
29125
  },
28754
29126
  "required": [
@@ -28762,7 +29134,8 @@
28762
29134
  "name",
28763
29135
  "description",
28764
29136
  "scopes",
28765
- "last4"
29137
+ "last4",
29138
+ "origin"
28766
29139
  ],
28767
29140
  "additionalProperties": false
28768
29141
  },
@@ -28974,7 +29347,8 @@
28974
29347
  "experiment",
28975
29348
  "config",
28976
29349
  "killswitch",
28977
- "metric"
29350
+ "metric",
29351
+ "ops"
28978
29352
  ],
28979
29353
  "description": "Resource family — drives the result group + icon in the palette. (`member` hits are surfaced first.)"
28980
29354
  },