@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/openapi.yaml CHANGED
@@ -234,6 +234,17 @@ tags:
234
234
  run record with the answers in the prompt. `delivery: poll` (the default
235
235
  for a live, connector-less session such as Claude Code in a terminal)
236
236
  fires nothing — call `list` until the status reads `completed`.
237
+ - name: QA notes
238
+ parent: Ops
239
+ description: |-
240
+ Typed QA notes on a queue item — the QA follow-up that is not discussion.
241
+ Each note is one of four kinds: `narrowing` (only part of the bug still
242
+ fails), `clarification` (changes what "fixed" means), `verification` (a
243
+ `pass` / `fail` verdict on a fix) or `correction` (withdraws an earlier
244
+ framing). Notes are append-only, carry their author and time, and render in
245
+ their own section of the item's detail panel, separate from the comment
246
+ thread. A failing verification offers a "Reopen item" action in the
247
+ dashboard; it is always an explicit click, never a side effect of `create`.
237
248
  - name: Projects
238
249
  description: |-
239
250
  Projects: the account-level container every other resource is scoped to.
@@ -6642,6 +6653,132 @@ paths:
6642
6653
  positional:
6643
6654
  - handle
6644
6655
  - questionId
6656
+ /api/admin/ops/{handle}/qa-notes:
6657
+ get:
6658
+ operationId: listOpsQaNotes
6659
+ summary: List an item's QA notes
6660
+ description: |-
6661
+ The typed QA notes on a queue item, newest first (max 200) — narrowing,
6662
+ clarification, verification and correction notes, each with its author and
6663
+ time. They are separate from the comment thread: read these to learn the
6664
+ CURRENT QA state of a ticket (what remains failing, what "fixed" now means,
6665
+ the last verification verdict) without parsing prose comments.
6666
+
6667
+ **Use case:** A coding agent picks an item up and checks the latest
6668
+ `verification` verdict and any `narrowing` note before touching the code.
6669
+ tags:
6670
+ - QA notes
6671
+ parameters:
6672
+ - $ref: '#/components/parameters/ProjectId'
6673
+ - name: handle
6674
+ in: path
6675
+ required: true
6676
+ description: Per-project item number (e.g. `7`) or the full ops item id.
6677
+ schema:
6678
+ $ref: '#/components/schemas/ResourceId'
6679
+ - name: kind
6680
+ in: query
6681
+ required: false
6682
+ description: Only notes of this kind.
6683
+ schema:
6684
+ $ref: '#/components/schemas/OpsQaNoteKind'
6685
+ responses:
6686
+ '200':
6687
+ description: List an item's QA notes
6688
+ content:
6689
+ application/json:
6690
+ schema:
6691
+ $ref: '#/components/schemas/ListOpsQaNotesResponse'
6692
+ '400':
6693
+ $ref: '#/components/responses/BadRequest'
6694
+ '401':
6695
+ $ref: '#/components/responses/Unauthorized'
6696
+ '403':
6697
+ $ref: '#/components/responses/Forbidden'
6698
+ '404':
6699
+ $ref: '#/components/responses/NotFound'
6700
+ '422':
6701
+ $ref: '#/components/responses/UnprocessableEntity'
6702
+ x-error-codes:
6703
+ - BAD_REQUEST
6704
+ - UNAUTHORIZED
6705
+ - FORBIDDEN
6706
+ - NOT_FOUND
6707
+ x-cli:
6708
+ name: list
6709
+ positional:
6710
+ - handle
6711
+ post:
6712
+ operationId: createOpsQaNote
6713
+ summary: Add a QA note to an item
6714
+ description: |-
6715
+ Append one typed QA note to a queue item. `kind` is `narrowing` (what now
6716
+ passes vs what still fails), `clarification` (what "fixed" now means),
6717
+ `verification` (requires a `verdict` of `pass` or `fail`, and `body` says
6718
+ what was checked) or `correction` (withdraws an earlier framing). Notes
6719
+ are append-only and appear in the item's QA notes section, not in the
6720
+ comment thread. The author is the caller's identity; pass `agent` to
6721
+ record the note as written by that agent type's QA automation. A `fail` verdict never changes the item's
6722
+ status by itself: the dashboard offers an explicit "Reopen item" action,
6723
+ and `ops update --status open` does the same from the CLI.
6724
+
6725
+ **Use case:** QA automation records "verified on production: FAIL, the
6726
+ second facet still errors" as data an agent can read back.
6727
+ tags:
6728
+ - QA notes
6729
+ parameters:
6730
+ - $ref: '#/components/parameters/ProjectId'
6731
+ - name: handle
6732
+ in: path
6733
+ required: true
6734
+ description: Per-project item number (e.g. `7`) or the full ops item id.
6735
+ schema:
6736
+ $ref: '#/components/schemas/ResourceId'
6737
+ requestBody:
6738
+ required: true
6739
+ content:
6740
+ application/json:
6741
+ schema:
6742
+ $ref: '#/components/schemas/CreateOpsQaNoteRequest'
6743
+ examples:
6744
+ verification:
6745
+ summary: A failing verification
6746
+ value:
6747
+ kind: verification
6748
+ verdict: fail
6749
+ body: Retested on production after the deploy — the export still drops the second sheet
6750
+ narrowing:
6751
+ summary: Narrow a bug to the facet that still fails
6752
+ value:
6753
+ kind: narrowing
6754
+ body: The list view is fixed; only the detail panel still shows the stale count
6755
+ responses:
6756
+ '200':
6757
+ description: The created note
6758
+ content:
6759
+ application/json:
6760
+ schema:
6761
+ $ref: '#/components/schemas/OpsQaNote'
6762
+ '400':
6763
+ $ref: '#/components/responses/BadRequest'
6764
+ '401':
6765
+ $ref: '#/components/responses/Unauthorized'
6766
+ '403':
6767
+ $ref: '#/components/responses/Forbidden'
6768
+ '404':
6769
+ $ref: '#/components/responses/NotFound'
6770
+ '422':
6771
+ $ref: '#/components/responses/UnprocessableEntity'
6772
+ x-error-codes:
6773
+ - BAD_REQUEST
6774
+ - UNAUTHORIZED
6775
+ - FORBIDDEN
6776
+ - NOT_FOUND
6777
+ - VALIDATION
6778
+ x-cli:
6779
+ name: create
6780
+ positional:
6781
+ - handle
6645
6782
  /api/admin/agent-profiles:
6646
6783
  get:
6647
6784
  operationId: listOpsAgents
@@ -17411,6 +17548,100 @@ components:
17411
17548
  additionalProperties: false
17412
17549
  minProperties: 1
17413
17550
  description: Body for `POST /api/admin/ops/{handle}/questions/{questionId}/answer` — pick option labels, write a free-text answer, or both (multi-select only).
17551
+ OpsQaNoteKind:
17552
+ type: string
17553
+ enum:
17554
+ - narrowing
17555
+ - clarification
17556
+ - verification
17557
+ - correction
17558
+ 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).
17559
+ OpsQaNoteVerdict:
17560
+ type: string
17561
+ enum:
17562
+ - pass
17563
+ - fail
17564
+ description: The outcome a `verification` note records.
17565
+ OpsQaNote:
17566
+ type: object
17567
+ properties:
17568
+ id:
17569
+ type: string
17570
+ description: Note id.
17571
+ feedbackId:
17572
+ type: string
17573
+ description: The queue item the note hangs off.
17574
+ kind:
17575
+ $ref: '#/components/schemas/OpsQaNoteKind'
17576
+ verdict:
17577
+ anyOf:
17578
+ - $ref: '#/components/schemas/OpsQaNoteVerdict'
17579
+ - type: 'null'
17580
+ description: The pass/fail verdict of a `verification` note; `null` for every other kind.
17581
+ body:
17582
+ type: string
17583
+ description: The note (markdown) — for a `verification`, what was checked.
17584
+ authorEmail:
17585
+ anyOf:
17586
+ - type: string
17587
+ - type: 'null'
17588
+ description: Email of the person (or the key's actor) who wrote the note, or `null` when an agent wrote it.
17589
+ authorAgent:
17590
+ anyOf:
17591
+ - type: string
17592
+ enum:
17593
+ - jarvis
17594
+ - claude
17595
+ - cursor
17596
+ - copilot
17597
+ - jules
17598
+ - type: 'null'
17599
+ description: The agent type that wrote the note (QA automation), or `null` for a person.
17600
+ createdAt:
17601
+ type: string
17602
+ description: ISO-8601 creation timestamp.
17603
+ required:
17604
+ - id
17605
+ - feedbackId
17606
+ - kind
17607
+ - verdict
17608
+ - body
17609
+ - authorEmail
17610
+ - authorAgent
17611
+ - createdAt
17612
+ additionalProperties: false
17613
+ description: One typed, append-only QA note on a queue item.
17614
+ ListOpsQaNotesResponse:
17615
+ type: array
17616
+ items:
17617
+ $ref: '#/components/schemas/OpsQaNote'
17618
+ description: Response for `GET /api/admin/ops/{handle}/qa-notes` — the item's QA notes, newest first (max 200).
17619
+ CreateOpsQaNoteRequest:
17620
+ type: object
17621
+ properties:
17622
+ kind:
17623
+ $ref: '#/components/schemas/OpsQaNoteKind'
17624
+ body:
17625
+ type: string
17626
+ minLength: 1
17627
+ maxLength: 10000
17628
+ description: The note (markdown).
17629
+ verdict:
17630
+ $ref: '#/components/schemas/OpsQaNoteVerdict'
17631
+ agent:
17632
+ type: string
17633
+ enum:
17634
+ - jarvis
17635
+ - claude
17636
+ - cursor
17637
+ - copilot
17638
+ - jules
17639
+ 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.
17640
+ required:
17641
+ - kind
17642
+ - body
17643
+ additionalProperties: false
17644
+ description: Body for `POST /api/admin/ops/{handle}/qa-notes`. A `verification` note requires `verdict`; every other kind rejects it.
17414
17645
  OpsAgentProfile:
17415
17646
  type: object
17416
17647
  properties:
@@ -17625,6 +17856,38 @@ components:
17625
17856
  - op
17626
17857
  - rules
17627
17858
  additionalProperties: false
17859
+ AlertRuleNotify:
17860
+ anyOf:
17861
+ - type: object
17862
+ properties:
17863
+ slackChannel:
17864
+ anyOf:
17865
+ - type: object
17866
+ properties:
17867
+ id:
17868
+ type: string
17869
+ minLength: 1
17870
+ name:
17871
+ type: string
17872
+ minLength: 1
17873
+ required:
17874
+ - id
17875
+ - name
17876
+ additionalProperties: false
17877
+ - type: 'null'
17878
+ email:
17879
+ anyOf:
17880
+ - type: string
17881
+ format: email
17882
+ - type: 'null'
17883
+ inApp:
17884
+ anyOf:
17885
+ - type: boolean
17886
+ - type: 'null'
17887
+ 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.
17888
+ additionalProperties: false
17889
+ - type: 'null'
17890
+ description: Delivery target for a rule's alert; `null` = use the project default. The `NotificationTarget` shape plus the in-app switch.
17628
17891
  ListAlertRulesResponse:
17629
17892
  type: array
17630
17893
  items:
@@ -17755,7 +18018,7 @@ components:
17755
18018
  type: boolean
17756
18019
  description: Whether the rule is evaluated by the cron.
17757
18020
  notify:
17758
- $ref: '#/components/schemas/NotificationTarget'
18021
+ $ref: '#/components/schemas/AlertRuleNotify'
17759
18022
  createdAt:
17760
18023
  type: string
17761
18024
  description: ISO-8601 timestamp of creation.
@@ -17931,7 +18194,7 @@ components:
17931
18194
  description: Whether the rule is evaluated by the cron.
17932
18195
  type: boolean
17933
18196
  notify:
17934
- $ref: '#/components/schemas/NotificationTarget'
18197
+ $ref: '#/components/schemas/AlertRuleNotify'
17935
18198
  required:
17936
18199
  - name
17937
18200
  - metricId
@@ -18074,7 +18337,7 @@ components:
18074
18337
  enabled:
18075
18338
  type: boolean
18076
18339
  notify:
18077
- $ref: '#/components/schemas/NotificationTarget'
18340
+ $ref: '#/components/schemas/AlertRuleNotify'
18078
18341
  additionalProperties: false
18079
18342
  UpdateAlertRuleResponse:
18080
18343
  type: object
@@ -20319,6 +20582,14 @@ components:
20319
20582
  - type: string
20320
20583
  - type: 'null'
20321
20584
  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.
20585
+ origin:
20586
+ type: string
20587
+ enum:
20588
+ - cli
20589
+ - mobile
20590
+ - dashboard
20591
+ - api
20592
+ 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`.
20322
20593
  required:
20323
20594
  - id
20324
20595
  - type
@@ -20331,6 +20602,7 @@ components:
20331
20602
  - description
20332
20603
  - scopes
20333
20604
  - last4
20605
+ - origin
20334
20606
  additionalProperties: false
20335
20607
  ListKeysResponse:
20336
20608
  type: object
@@ -20487,6 +20759,7 @@ components:
20487
20759
  - config
20488
20760
  - killswitch
20489
20761
  - metric
20762
+ - ops
20490
20763
  description: Resource family — drives the result group + icon in the palette. (`member` hits are surfaced first.)
20491
20764
  id:
20492
20765
  type: string
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipeasy/openapi",
3
- "version": "3.3.0",
3
+ "version": "3.4.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",
@@ -1,3 +1,29 @@
1
+ AlertRuleNotify:
2
+ anyOf:
3
+ - type: object
4
+ properties:
5
+ slackChannel:
6
+ anyOf:
7
+ - type: object
8
+ properties:
9
+ id: { type: string, minLength: 1 }
10
+ name: { type: string, minLength: 1 }
11
+ required: [id, name]
12
+ additionalProperties: false
13
+ - type: "null"
14
+ email:
15
+ anyOf:
16
+ - type: string
17
+ format: email
18
+ - type: "null"
19
+ inApp:
20
+ anyOf:
21
+ - type: boolean
22
+ - type: "null"
23
+ 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.
24
+ additionalProperties: false
25
+ - type: "null"
26
+ description: Delivery target for a rule's alert; `null` = use the project default. The `NotificationTarget` shape plus the in-app switch.
1
27
  AlertCompositeSpec:
2
28
  type: object
3
29
  description: >-
@@ -172,7 +198,7 @@ ListAlertRulesResponse:
172
198
  type: boolean
173
199
  description: Whether the rule is evaluated by the cron.
174
200
  notify:
175
- $ref: ./common.yaml#/NotificationTarget
201
+ $ref: "#/AlertRuleNotify"
176
202
  createdAt:
177
203
  type: string
178
204
  description: ISO-8601 timestamp of creation.
@@ -415,7 +441,7 @@ CreateAlertRuleRequest:
415
441
  description: Whether the rule is evaluated by the cron.
416
442
  type: boolean
417
443
  notify:
418
- $ref: ./common.yaml#/NotificationTarget
444
+ $ref: "#/AlertRuleNotify"
419
445
  required:
420
446
  - name
421
447
  - metricId
@@ -551,7 +577,7 @@ UpdateAlertRuleRequest:
551
577
  enabled:
552
578
  type: boolean
553
579
  notify:
554
- $ref: ./common.yaml#/NotificationTarget
580
+ $ref: "#/AlertRuleNotify"
555
581
  additionalProperties: false
556
582
  UpdateAlertRuleResponse:
557
583
  type: object
@@ -77,6 +77,14 @@ KeyRecord:
77
77
  - type: string
78
78
  - type: "null"
79
79
  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.
80
+ origin:
81
+ type: string
82
+ enum:
83
+ - cli
84
+ - mobile
85
+ - dashboard
86
+ - api
87
+ 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`.
80
88
  required:
81
89
  - id
82
90
  - type
@@ -89,6 +97,7 @@ KeyRecord:
89
97
  - description
90
98
  - scopes
91
99
  - last4
100
+ - origin
92
101
  additionalProperties: false
93
102
  UpdateKeyRequest:
94
103
  type: object
@@ -2516,6 +2516,100 @@ ListOpsQuestionsResponse:
2516
2516
  items:
2517
2517
  $ref: "#/OpsQuestion"
2518
2518
  description: Response for `GET /api/admin/ops/{handle}/questions` — the item's questions, newest first (max 100).
2519
+ OpsQaNoteKind:
2520
+ type: string
2521
+ enum:
2522
+ - narrowing
2523
+ - clarification
2524
+ - verification
2525
+ - correction
2526
+ 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)."
2527
+ OpsQaNoteVerdict:
2528
+ type: string
2529
+ enum:
2530
+ - pass
2531
+ - fail
2532
+ description: The outcome a `verification` note records.
2533
+ OpsQaNote:
2534
+ type: object
2535
+ properties:
2536
+ id:
2537
+ type: string
2538
+ description: Note id.
2539
+ feedbackId:
2540
+ type: string
2541
+ description: The queue item the note hangs off.
2542
+ kind:
2543
+ $ref: "#/OpsQaNoteKind"
2544
+ verdict:
2545
+ anyOf:
2546
+ - $ref: "#/OpsQaNoteVerdict"
2547
+ - type: "null"
2548
+ description: The pass/fail verdict of a `verification` note; `null` for every other kind.
2549
+ body:
2550
+ type: string
2551
+ description: The note (markdown) — for a `verification`, what was checked.
2552
+ authorEmail:
2553
+ anyOf:
2554
+ - type: string
2555
+ - type: "null"
2556
+ description: Email of the person (or the key's actor) who wrote the note, or `null` when an agent wrote it.
2557
+ authorAgent:
2558
+ anyOf:
2559
+ - type: string
2560
+ enum:
2561
+ - jarvis
2562
+ - claude
2563
+ - cursor
2564
+ - copilot
2565
+ - jules
2566
+ - type: "null"
2567
+ description: The agent type that wrote the note (QA automation), or `null` for a person.
2568
+ createdAt:
2569
+ type: string
2570
+ description: ISO-8601 creation timestamp.
2571
+ required:
2572
+ - id
2573
+ - feedbackId
2574
+ - kind
2575
+ - verdict
2576
+ - body
2577
+ - authorEmail
2578
+ - authorAgent
2579
+ - createdAt
2580
+ additionalProperties: false
2581
+ description: One typed, append-only QA note on a queue item.
2582
+ CreateOpsQaNoteRequest:
2583
+ type: object
2584
+ properties:
2585
+ kind:
2586
+ $ref: "#/OpsQaNoteKind"
2587
+ body:
2588
+ type: string
2589
+ minLength: 1
2590
+ maxLength: 10000
2591
+ description: The note (markdown).
2592
+ verdict:
2593
+ $ref: "#/OpsQaNoteVerdict"
2594
+ agent:
2595
+ type: string
2596
+ enum:
2597
+ - jarvis
2598
+ - claude
2599
+ - cursor
2600
+ - copilot
2601
+ - jules
2602
+ 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.
2603
+ required:
2604
+ - kind
2605
+ - body
2606
+ additionalProperties: false
2607
+ description: "Body for `POST /api/admin/ops/{handle}/qa-notes`. A `verification` note requires `verdict`; every other kind rejects it."
2608
+ ListOpsQaNotesResponse:
2609
+ type: array
2610
+ items:
2611
+ $ref: "#/OpsQaNote"
2612
+ description: Response for `GET /api/admin/ops/{handle}/qa-notes` — the item's QA notes, newest first (max 200).
2519
2613
  NotificationFeedItem:
2520
2614
  type: object
2521
2615
  properties:
@@ -22,6 +22,7 @@ SearchHit:
22
22
  - config
23
23
  - killswitch
24
24
  - metric
25
+ - ops
25
26
  description: Resource family — drives the result group + icon in the palette. (`member` hits are surfaced first.)
26
27
  id:
27
28
  type: string
package/spec/openapi.yaml CHANGED
@@ -236,6 +236,17 @@ tags:
236
236
  run record with the answers in the prompt. `delivery: poll` (the default
237
237
  for a live, connector-less session such as Claude Code in a terminal)
238
238
  fires nothing — call `list` until the status reads `completed`.
239
+ - name: QA notes
240
+ parent: Ops
241
+ description: |-
242
+ Typed QA notes on a queue item — the QA follow-up that is not discussion.
243
+ Each note is one of four kinds: `narrowing` (only part of the bug still
244
+ fails), `clarification` (changes what "fixed" means), `verification` (a
245
+ `pass` / `fail` verdict on a fix) or `correction` (withdraws an earlier
246
+ framing). Notes are append-only, carry their author and time, and render in
247
+ their own section of the item's detail panel, separate from the comment
248
+ thread. A failing verification offers a "Reopen item" action in the
249
+ dashboard; it is always an explicit click, never a side effect of `create`.
239
250
  - name: Projects
240
251
  description: |-
241
252
  Projects: the account-level container every other resource is scoped to.
@@ -407,6 +418,8 @@ paths:
407
418
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1questions~1{questionId}~1answer
408
419
  /api/admin/ops/{handle}/questions/{questionId}/cancel:
409
420
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1questions~1{questionId}~1cancel
421
+ /api/admin/ops/{handle}/qa-notes:
422
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1qa-notes
410
423
  /api/admin/agent-profiles:
411
424
  $ref: ./paths/ops.yaml#/~1api~1admin~1agent-profiles
412
425
  /api/admin/ops/{handle}/comments: