@allocator-one/harness-cli 1.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.
@@ -0,0 +1,2099 @@
1
+ {
2
+ "components": {
3
+ "securitySchemes": {
4
+ "bearer": {
5
+ "scheme": "bearer",
6
+ "type": "http"
7
+ }
8
+ }
9
+ },
10
+ "info": {
11
+ "description": "Internal JSON API for the Harness issue tracker.\n\nAuthenticate with a bearer credential:\n\n Authorization: Bearer <token>\n\nTwo kinds are accepted, both requiring an active admin:\n\n- `aone_…` API tokens (admin → API tokens) carrying the\n `harness:read` and/or `harness:write` scope. Writes are attributed\n to the token's creator, displayed as the `actor`/token name.\n- User login tokens from the platform sign-in flow, as used by the\n browser extension and the Harness Drop app. Note: sign-in lives on\n the venture host (`POST https://venture.infra.one/api/v1/sign-in`),\n not on this API's host. These tokens act as the signed-in admin:\n both harness scopes, writes attributed and displayed as that user\n unless an `actor` is given.\n\nRequests are rate limited per client IP.\n",
12
+ "title": "Harness API",
13
+ "version": "1.0"
14
+ },
15
+ "openapi": "3.0.0",
16
+ "paths": {
17
+ "/api/v1/attachments/{attachment_id}/{file}": {
18
+ "get": {
19
+ "callbacks": {},
20
+ "deprecated": false,
21
+ "description": "Requires the `harness:read` scope. Streams the attachment bytes (binary response).",
22
+ "parameters": [
23
+ {
24
+ "description": "Attachment UUID (the directory segment of the upload's URL)",
25
+ "in": "path",
26
+ "name": "attachment_id",
27
+ "required": true,
28
+ "schema": {
29
+ "format": "uuid",
30
+ "type": "string"
31
+ }
32
+ },
33
+ {
34
+ "description": "Stored filename (the final segment of the upload's URL)",
35
+ "in": "path",
36
+ "name": "file",
37
+ "required": true,
38
+ "schema": {
39
+ "type": "string"
40
+ }
41
+ }
42
+ ],
43
+ "responses": {
44
+ "200": {
45
+ "description": "Success"
46
+ },
47
+ "400": {
48
+ "description": "Bad request"
49
+ },
50
+ "401": {
51
+ "description": "Missing or invalid token"
52
+ },
53
+ "403": {
54
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
55
+ },
56
+ "404": {
57
+ "description": "Not found"
58
+ },
59
+ "422": {
60
+ "description": "Validation error"
61
+ }
62
+ },
63
+ "summary": "Download an attachment",
64
+ "tags": []
65
+ }
66
+ },
67
+ "/api/v1/cli/token-exchange": {
68
+ "post": {
69
+ "callbacks": {},
70
+ "deprecated": false,
71
+ "description": "Requires the `none (the code is the credential)` scope. Unauthenticated, tightly IP-rate-limited. Redeems the 60-second single-use code from the /cli/login browser handoff for a 30-day login token; the PKCE code_verifier must hash to the challenge the code was minted with.",
72
+ "parameters": [],
73
+ "requestBody": {
74
+ "content": {
75
+ "application/json": {
76
+ "schema": {
77
+ "properties": {
78
+ "code": {
79
+ "description": "Single-use login code from the browser handoff",
80
+ "type": "string"
81
+ },
82
+ "code_verifier": {
83
+ "description": "PKCE verifier whose SHA-256 the code was bound to",
84
+ "type": "string"
85
+ }
86
+ },
87
+ "type": "object"
88
+ }
89
+ }
90
+ },
91
+ "required": true
92
+ },
93
+ "responses": {
94
+ "200": {
95
+ "description": "Success"
96
+ },
97
+ "400": {
98
+ "description": "Bad request"
99
+ },
100
+ "401": {
101
+ "description": "Invalid, expired, used, or verifier-mismatched code"
102
+ },
103
+ "403": {
104
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
105
+ },
106
+ "404": {
107
+ "description": "Not found"
108
+ },
109
+ "422": {
110
+ "description": "Validation error"
111
+ }
112
+ },
113
+ "summary": "Redeem a CLI login code",
114
+ "tags": []
115
+ }
116
+ },
117
+ "/api/v1/documents": {
118
+ "get": {
119
+ "callbacks": {},
120
+ "deprecated": false,
121
+ "description": "Requires the `harness:read` scope.",
122
+ "parameters": [
123
+ {
124
+ "description": "Page number (default 1)",
125
+ "in": "query",
126
+ "name": "page",
127
+ "required": false,
128
+ "schema": {
129
+ "type": "integer"
130
+ }
131
+ },
132
+ {
133
+ "description": "Items per page (max 100)",
134
+ "in": "query",
135
+ "name": "page_size",
136
+ "required": false,
137
+ "schema": {
138
+ "type": "integer"
139
+ }
140
+ },
141
+ {
142
+ "description": "title, inserted_at, or updated_at",
143
+ "in": "query",
144
+ "name": "order_by",
145
+ "required": false,
146
+ "schema": {
147
+ "type": "string"
148
+ }
149
+ },
150
+ {
151
+ "description": "asc or desc (default asc)",
152
+ "in": "query",
153
+ "name": "order_dir",
154
+ "required": false,
155
+ "schema": {
156
+ "type": "string"
157
+ }
158
+ },
159
+ {
160
+ "description": "Match document title",
161
+ "in": "query",
162
+ "name": "search",
163
+ "required": false,
164
+ "schema": {
165
+ "type": "string"
166
+ }
167
+ }
168
+ ],
169
+ "responses": {
170
+ "200": {
171
+ "description": "Success"
172
+ },
173
+ "400": {
174
+ "description": "Bad request"
175
+ },
176
+ "401": {
177
+ "description": "Missing or invalid token"
178
+ },
179
+ "403": {
180
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
181
+ },
182
+ "404": {
183
+ "description": "Not found"
184
+ },
185
+ "422": {
186
+ "description": "Validation error"
187
+ }
188
+ },
189
+ "summary": "List documents",
190
+ "tags": []
191
+ },
192
+ "post": {
193
+ "callbacks": {},
194
+ "deprecated": false,
195
+ "description": "Requires the `harness:write` scope.",
196
+ "parameters": [],
197
+ "requestBody": {
198
+ "content": {
199
+ "application/json": {
200
+ "schema": {
201
+ "properties": {
202
+ "content": {
203
+ "description": "Markdown body",
204
+ "type": "string"
205
+ },
206
+ "project_id": {
207
+ "description": "Optional project to attach the document to",
208
+ "type": "string"
209
+ },
210
+ "title": {
211
+ "type": "string"
212
+ }
213
+ },
214
+ "type": "object"
215
+ }
216
+ }
217
+ },
218
+ "required": true
219
+ },
220
+ "responses": {
221
+ "200": {
222
+ "description": "Success"
223
+ },
224
+ "400": {
225
+ "description": "Bad request"
226
+ },
227
+ "401": {
228
+ "description": "Missing or invalid token"
229
+ },
230
+ "403": {
231
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
232
+ },
233
+ "404": {
234
+ "description": "Not found"
235
+ },
236
+ "422": {
237
+ "description": "Validation error"
238
+ }
239
+ },
240
+ "summary": "Create a document",
241
+ "tags": []
242
+ }
243
+ },
244
+ "/api/v1/documents/{id}": {
245
+ "get": {
246
+ "callbacks": {},
247
+ "deprecated": false,
248
+ "description": "Requires the `harness:read` scope.",
249
+ "parameters": [
250
+ {
251
+ "description": "Resource id",
252
+ "in": "path",
253
+ "name": "id",
254
+ "required": true,
255
+ "schema": {
256
+ "type": "string"
257
+ }
258
+ }
259
+ ],
260
+ "responses": {
261
+ "200": {
262
+ "description": "Success"
263
+ },
264
+ "400": {
265
+ "description": "Bad request"
266
+ },
267
+ "401": {
268
+ "description": "Missing or invalid token"
269
+ },
270
+ "403": {
271
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
272
+ },
273
+ "404": {
274
+ "description": "Not found"
275
+ },
276
+ "422": {
277
+ "description": "Validation error"
278
+ }
279
+ },
280
+ "summary": "Get a document",
281
+ "tags": []
282
+ },
283
+ "patch": {
284
+ "callbacks": {},
285
+ "deprecated": false,
286
+ "description": "Requires the `harness:write` scope.",
287
+ "parameters": [
288
+ {
289
+ "description": "Resource id",
290
+ "in": "path",
291
+ "name": "id",
292
+ "required": true,
293
+ "schema": {
294
+ "type": "string"
295
+ }
296
+ }
297
+ ],
298
+ "requestBody": {
299
+ "content": {
300
+ "application/json": {
301
+ "schema": {
302
+ "properties": {
303
+ "content": {
304
+ "description": "Markdown body",
305
+ "type": "string"
306
+ },
307
+ "project_id": {
308
+ "description": "Optional project to attach the document to",
309
+ "type": "string"
310
+ },
311
+ "title": {
312
+ "type": "string"
313
+ }
314
+ },
315
+ "type": "object"
316
+ }
317
+ }
318
+ },
319
+ "required": true
320
+ },
321
+ "responses": {
322
+ "200": {
323
+ "description": "Success"
324
+ },
325
+ "400": {
326
+ "description": "Bad request"
327
+ },
328
+ "401": {
329
+ "description": "Missing or invalid token"
330
+ },
331
+ "403": {
332
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
333
+ },
334
+ "404": {
335
+ "description": "Not found"
336
+ },
337
+ "422": {
338
+ "description": "Validation error"
339
+ }
340
+ },
341
+ "summary": "Update a document",
342
+ "tags": []
343
+ }
344
+ },
345
+ "/api/v1/issues": {
346
+ "get": {
347
+ "callbacks": {},
348
+ "deprecated": false,
349
+ "description": "Requires the `harness:read` scope.",
350
+ "parameters": [
351
+ {
352
+ "description": "Page number (default 1)",
353
+ "in": "query",
354
+ "name": "page",
355
+ "required": false,
356
+ "schema": {
357
+ "type": "integer"
358
+ }
359
+ },
360
+ {
361
+ "description": "Items per page (max 100)",
362
+ "in": "query",
363
+ "name": "page_size",
364
+ "required": false,
365
+ "schema": {
366
+ "type": "integer"
367
+ }
368
+ },
369
+ {
370
+ "description": "number, title, priority, due_date, updated_at, or inserted_at",
371
+ "in": "query",
372
+ "name": "order_by",
373
+ "required": false,
374
+ "schema": {
375
+ "type": "string"
376
+ }
377
+ },
378
+ {
379
+ "description": "asc or desc (default desc)",
380
+ "in": "query",
381
+ "name": "order_dir",
382
+ "required": false,
383
+ "schema": {
384
+ "type": "string"
385
+ }
386
+ },
387
+ {
388
+ "description": "Match title or issue number",
389
+ "in": "query",
390
+ "name": "search",
391
+ "required": false,
392
+ "schema": {
393
+ "type": "string"
394
+ }
395
+ },
396
+ {
397
+ "description": "active (default), archived, or all",
398
+ "in": "query",
399
+ "name": "scope",
400
+ "required": false,
401
+ "schema": {
402
+ "type": "string"
403
+ }
404
+ },
405
+ {
406
+ "description": "Filter by workflow state",
407
+ "in": "query",
408
+ "name": "state_id",
409
+ "required": false,
410
+ "schema": {
411
+ "type": "string"
412
+ }
413
+ },
414
+ {
415
+ "description": "Filter by state type, comma-separated: backlog, unstarted, started, completed, canceled",
416
+ "in": "query",
417
+ "name": "state_type",
418
+ "required": false,
419
+ "schema": {
420
+ "type": "string"
421
+ }
422
+ },
423
+ {
424
+ "description": "Filter by assignee — \"me\" for the token owner, a user id, an email address, or an exact display name",
425
+ "in": "query",
426
+ "name": "assignee",
427
+ "required": false,
428
+ "schema": {
429
+ "type": "string"
430
+ }
431
+ },
432
+ {
433
+ "description": "Filter by creator id, or \"me\" for the token owner",
434
+ "in": "query",
435
+ "name": "created_by",
436
+ "required": false,
437
+ "schema": {
438
+ "type": "string"
439
+ }
440
+ },
441
+ {
442
+ "description": "Filter by priority (0-4)",
443
+ "in": "query",
444
+ "name": "priority",
445
+ "required": false,
446
+ "schema": {
447
+ "type": "integer"
448
+ }
449
+ },
450
+ {
451
+ "description": "true keeps only ready issues (unblocked, open state, no open children, not held)",
452
+ "in": "query",
453
+ "name": "ready",
454
+ "required": false,
455
+ "schema": {
456
+ "type": "boolean"
457
+ }
458
+ },
459
+ {
460
+ "description": "true keeps only open issues with at least one open blocker",
461
+ "in": "query",
462
+ "name": "blocked",
463
+ "required": false,
464
+ "schema": {
465
+ "type": "boolean"
466
+ }
467
+ },
468
+ {
469
+ "description": "Filter to children of the given issue identifier",
470
+ "in": "query",
471
+ "name": "parent",
472
+ "required": false,
473
+ "schema": {
474
+ "type": "string"
475
+ }
476
+ },
477
+ {
478
+ "description": "Filter by label name or id",
479
+ "in": "query",
480
+ "name": "label",
481
+ "required": false,
482
+ "schema": {
483
+ "type": "string"
484
+ }
485
+ },
486
+ {
487
+ "description": "Filter by team key, e.g. ALL",
488
+ "in": "query",
489
+ "name": "team",
490
+ "required": false,
491
+ "schema": {
492
+ "type": "string"
493
+ }
494
+ }
495
+ ],
496
+ "responses": {
497
+ "200": {
498
+ "description": "Success"
499
+ },
500
+ "400": {
501
+ "description": "Bad request"
502
+ },
503
+ "401": {
504
+ "description": "Missing or invalid token"
505
+ },
506
+ "403": {
507
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
508
+ },
509
+ "404": {
510
+ "description": "Not found"
511
+ },
512
+ "422": {
513
+ "description": "Validation error"
514
+ }
515
+ },
516
+ "summary": "List issues",
517
+ "tags": []
518
+ }
519
+ },
520
+ "/api/v1/issues/{identifier}": {
521
+ "get": {
522
+ "callbacks": {},
523
+ "deprecated": false,
524
+ "description": "Requires the `harness:read` scope. The payload always carries `blocked` and `blocked_by` (identifiers of open blockers); `include` embeds relations (direction-aware), children, and recent comments in one response.",
525
+ "parameters": [
526
+ {
527
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
528
+ "in": "path",
529
+ "name": "identifier",
530
+ "required": true,
531
+ "schema": {
532
+ "type": "string"
533
+ }
534
+ },
535
+ {
536
+ "description": "Comma-separated embeds: relations, children, comments",
537
+ "in": "query",
538
+ "name": "include",
539
+ "required": false,
540
+ "schema": {
541
+ "type": "string"
542
+ }
543
+ }
544
+ ],
545
+ "responses": {
546
+ "200": {
547
+ "description": "Success"
548
+ },
549
+ "400": {
550
+ "description": "Bad request"
551
+ },
552
+ "401": {
553
+ "description": "Missing or invalid token"
554
+ },
555
+ "403": {
556
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
557
+ },
558
+ "404": {
559
+ "description": "Not found"
560
+ },
561
+ "422": {
562
+ "description": "Validation error"
563
+ }
564
+ },
565
+ "summary": "Get an issue",
566
+ "tags": []
567
+ },
568
+ "patch": {
569
+ "callbacks": {},
570
+ "deprecated": false,
571
+ "description": "Requires the `harness:write` scope.",
572
+ "parameters": [
573
+ {
574
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
575
+ "in": "path",
576
+ "name": "identifier",
577
+ "required": true,
578
+ "schema": {
579
+ "type": "string"
580
+ }
581
+ }
582
+ ],
583
+ "requestBody": {
584
+ "content": {
585
+ "application/json": {
586
+ "schema": {
587
+ "properties": {
588
+ "acceptance_criteria": {
589
+ "type": "string"
590
+ },
591
+ "assignee": {
592
+ "description": "\"me\" for the token owner, a user id, an email address, or an exact display name; empty/null clears the assignee",
593
+ "type": "string"
594
+ },
595
+ "assignee_id": {
596
+ "type": "string"
597
+ },
598
+ "description": {
599
+ "type": "string"
600
+ },
601
+ "design": {
602
+ "type": "string"
603
+ },
604
+ "due_date": {
605
+ "format": "date",
606
+ "type": "string"
607
+ },
608
+ "notes": {
609
+ "type": "string"
610
+ },
611
+ "parent": {
612
+ "description": "Parent issue identifier; empty/null clears the parent",
613
+ "type": "string"
614
+ },
615
+ "priority": {
616
+ "type": "integer"
617
+ },
618
+ "title": {
619
+ "type": "string"
620
+ }
621
+ },
622
+ "type": "object"
623
+ }
624
+ }
625
+ },
626
+ "required": true
627
+ },
628
+ "responses": {
629
+ "200": {
630
+ "description": "Success"
631
+ },
632
+ "400": {
633
+ "description": "Bad request"
634
+ },
635
+ "401": {
636
+ "description": "Missing or invalid token"
637
+ },
638
+ "403": {
639
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
640
+ },
641
+ "404": {
642
+ "description": "Not found"
643
+ },
644
+ "422": {
645
+ "description": "Validation error"
646
+ }
647
+ },
648
+ "summary": "Update issue fields",
649
+ "tags": []
650
+ }
651
+ },
652
+ "/api/v1/issues/{identifier}/archive_state": {
653
+ "put": {
654
+ "callbacks": {},
655
+ "deprecated": false,
656
+ "description": "Requires the `harness:write` scope.",
657
+ "parameters": [
658
+ {
659
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
660
+ "in": "path",
661
+ "name": "identifier",
662
+ "required": true,
663
+ "schema": {
664
+ "type": "string"
665
+ }
666
+ }
667
+ ],
668
+ "requestBody": {
669
+ "content": {
670
+ "application/json": {
671
+ "schema": {
672
+ "properties": {
673
+ "archived": {
674
+ "type": "boolean"
675
+ }
676
+ },
677
+ "type": "object"
678
+ }
679
+ }
680
+ },
681
+ "required": true
682
+ },
683
+ "responses": {
684
+ "200": {
685
+ "description": "Success"
686
+ },
687
+ "400": {
688
+ "description": "Bad request"
689
+ },
690
+ "401": {
691
+ "description": "Missing or invalid token"
692
+ },
693
+ "403": {
694
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
695
+ },
696
+ "404": {
697
+ "description": "Not found"
698
+ },
699
+ "422": {
700
+ "description": "Validation error"
701
+ }
702
+ },
703
+ "summary": "Set archive state",
704
+ "tags": []
705
+ }
706
+ },
707
+ "/api/v1/issues/{identifier}/claim": {
708
+ "post": {
709
+ "callbacks": {},
710
+ "deprecated": false,
711
+ "description": "Requires the `harness:write` scope. Atomic compare-and-swap: assigns the caller and moves the issue to the team's first started-type state. Idempotent for the current claimant.",
712
+ "parameters": [
713
+ {
714
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
715
+ "in": "path",
716
+ "name": "identifier",
717
+ "required": true,
718
+ "schema": {
719
+ "type": "string"
720
+ }
721
+ }
722
+ ],
723
+ "responses": {
724
+ "200": {
725
+ "description": "Success"
726
+ },
727
+ "400": {
728
+ "description": "Bad request"
729
+ },
730
+ "401": {
731
+ "description": "Missing or invalid token"
732
+ },
733
+ "403": {
734
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
735
+ },
736
+ "404": {
737
+ "description": "Not found"
738
+ },
739
+ "409": {
740
+ "description": "Already claimed by someone else"
741
+ },
742
+ "422": {
743
+ "description": "Validation error"
744
+ }
745
+ },
746
+ "summary": "Claim an issue",
747
+ "tags": []
748
+ }
749
+ },
750
+ "/api/v1/issues/{identifier}/close": {
751
+ "post": {
752
+ "callbacks": {},
753
+ "deprecated": false,
754
+ "description": "Requires the `harness:write` scope. Moves the issue to the team's first completed-type state (canceled-type with `cancel`), posting `reason` as a comment first. The response's `unblocked` lists identifiers of issues that became ready because this one closed.",
755
+ "parameters": [
756
+ {
757
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
758
+ "in": "path",
759
+ "name": "identifier",
760
+ "required": true,
761
+ "schema": {
762
+ "type": "string"
763
+ }
764
+ }
765
+ ],
766
+ "requestBody": {
767
+ "content": {
768
+ "application/json": {
769
+ "schema": {
770
+ "properties": {
771
+ "actor": {
772
+ "description": "Display name to attribute the write to (e.g. an agent). Defaults to the token name for API tokens and to the signed-in user for login tokens. Display-only, never an access-control input.",
773
+ "type": "string"
774
+ },
775
+ "cancel": {
776
+ "description": "Move to a canceled-type state instead of completed",
777
+ "type": "boolean"
778
+ },
779
+ "reason": {
780
+ "description": "Optional close reason, posted as a comment",
781
+ "type": "string"
782
+ }
783
+ },
784
+ "type": "object"
785
+ }
786
+ }
787
+ },
788
+ "required": true
789
+ },
790
+ "responses": {
791
+ "200": {
792
+ "description": "Success"
793
+ },
794
+ "400": {
795
+ "description": "Bad request"
796
+ },
797
+ "401": {
798
+ "description": "Missing or invalid token"
799
+ },
800
+ "403": {
801
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
802
+ },
803
+ "404": {
804
+ "description": "Not found"
805
+ },
806
+ "422": {
807
+ "description": "Validation error"
808
+ }
809
+ },
810
+ "summary": "Close an issue",
811
+ "tags": []
812
+ }
813
+ },
814
+ "/api/v1/issues/{identifier}/comments": {
815
+ "get": {
816
+ "callbacks": {},
817
+ "deprecated": false,
818
+ "description": "Requires the `harness:read` scope.",
819
+ "parameters": [
820
+ {
821
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
822
+ "in": "path",
823
+ "name": "identifier",
824
+ "required": true,
825
+ "schema": {
826
+ "type": "string"
827
+ }
828
+ }
829
+ ],
830
+ "responses": {
831
+ "200": {
832
+ "description": "Success"
833
+ },
834
+ "400": {
835
+ "description": "Bad request"
836
+ },
837
+ "401": {
838
+ "description": "Missing or invalid token"
839
+ },
840
+ "403": {
841
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
842
+ },
843
+ "404": {
844
+ "description": "Not found"
845
+ },
846
+ "422": {
847
+ "description": "Validation error"
848
+ }
849
+ },
850
+ "summary": "List issue comments",
851
+ "tags": []
852
+ },
853
+ "post": {
854
+ "callbacks": {},
855
+ "deprecated": false,
856
+ "description": "Requires the `harness:write` scope.",
857
+ "parameters": [
858
+ {
859
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
860
+ "in": "path",
861
+ "name": "identifier",
862
+ "required": true,
863
+ "schema": {
864
+ "type": "string"
865
+ }
866
+ }
867
+ ],
868
+ "requestBody": {
869
+ "content": {
870
+ "application/json": {
871
+ "schema": {
872
+ "properties": {
873
+ "actor": {
874
+ "description": "Display name to attribute the write to (e.g. an agent). Defaults to the token name for API tokens and to the signed-in user for login tokens. Display-only, never an access-control input.",
875
+ "type": "string"
876
+ },
877
+ "body": {
878
+ "type": "string"
879
+ }
880
+ },
881
+ "type": "object"
882
+ }
883
+ }
884
+ },
885
+ "required": true
886
+ },
887
+ "responses": {
888
+ "200": {
889
+ "description": "Success"
890
+ },
891
+ "400": {
892
+ "description": "Bad request"
893
+ },
894
+ "401": {
895
+ "description": "Missing or invalid token"
896
+ },
897
+ "403": {
898
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
899
+ },
900
+ "404": {
901
+ "description": "Not found"
902
+ },
903
+ "422": {
904
+ "description": "Validation error"
905
+ }
906
+ },
907
+ "summary": "Add an issue comment",
908
+ "tags": []
909
+ }
910
+ },
911
+ "/api/v1/issues/{identifier}/labels": {
912
+ "put": {
913
+ "callbacks": {},
914
+ "deprecated": false,
915
+ "description": "Requires the `harness:write` scope.",
916
+ "parameters": [
917
+ {
918
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
919
+ "in": "path",
920
+ "name": "identifier",
921
+ "required": true,
922
+ "schema": {
923
+ "type": "string"
924
+ }
925
+ }
926
+ ],
927
+ "requestBody": {
928
+ "content": {
929
+ "application/json": {
930
+ "schema": {
931
+ "properties": {
932
+ "label_ids": {
933
+ "items": {
934
+ "type": "string"
935
+ },
936
+ "type": "array"
937
+ }
938
+ },
939
+ "type": "object"
940
+ }
941
+ }
942
+ },
943
+ "required": true
944
+ },
945
+ "responses": {
946
+ "200": {
947
+ "description": "Success"
948
+ },
949
+ "400": {
950
+ "description": "Bad request"
951
+ },
952
+ "401": {
953
+ "description": "Missing or invalid token"
954
+ },
955
+ "403": {
956
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
957
+ },
958
+ "404": {
959
+ "description": "Not found"
960
+ },
961
+ "422": {
962
+ "description": "Validation error"
963
+ }
964
+ },
965
+ "summary": "Replace issue labels",
966
+ "tags": []
967
+ }
968
+ },
969
+ "/api/v1/issues/{identifier}/links": {
970
+ "get": {
971
+ "callbacks": {},
972
+ "deprecated": false,
973
+ "description": "Requires the `harness:read` scope.",
974
+ "parameters": [
975
+ {
976
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
977
+ "in": "path",
978
+ "name": "identifier",
979
+ "required": true,
980
+ "schema": {
981
+ "type": "string"
982
+ }
983
+ }
984
+ ],
985
+ "responses": {
986
+ "200": {
987
+ "description": "Success"
988
+ },
989
+ "400": {
990
+ "description": "Bad request"
991
+ },
992
+ "401": {
993
+ "description": "Missing or invalid token"
994
+ },
995
+ "403": {
996
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
997
+ },
998
+ "404": {
999
+ "description": "Not found"
1000
+ },
1001
+ "422": {
1002
+ "description": "Validation error"
1003
+ }
1004
+ },
1005
+ "summary": "List an issue's links",
1006
+ "tags": []
1007
+ },
1008
+ "post": {
1009
+ "callbacks": {},
1010
+ "deprecated": false,
1011
+ "description": "Requires the `harness:write` scope.",
1012
+ "parameters": [
1013
+ {
1014
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1015
+ "in": "path",
1016
+ "name": "identifier",
1017
+ "required": true,
1018
+ "schema": {
1019
+ "type": "string"
1020
+ }
1021
+ }
1022
+ ],
1023
+ "requestBody": {
1024
+ "content": {
1025
+ "application/json": {
1026
+ "schema": {
1027
+ "properties": {
1028
+ "title": {
1029
+ "type": "string"
1030
+ },
1031
+ "url": {
1032
+ "description": "http(s) URL",
1033
+ "type": "string"
1034
+ }
1035
+ },
1036
+ "type": "object"
1037
+ }
1038
+ }
1039
+ },
1040
+ "required": true
1041
+ },
1042
+ "responses": {
1043
+ "200": {
1044
+ "description": "Success"
1045
+ },
1046
+ "400": {
1047
+ "description": "Bad request"
1048
+ },
1049
+ "401": {
1050
+ "description": "Missing or invalid token"
1051
+ },
1052
+ "403": {
1053
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1054
+ },
1055
+ "404": {
1056
+ "description": "Not found"
1057
+ },
1058
+ "422": {
1059
+ "description": "Validation error"
1060
+ }
1061
+ },
1062
+ "summary": "Add a link",
1063
+ "tags": []
1064
+ }
1065
+ },
1066
+ "/api/v1/issues/{identifier}/links/{id}": {
1067
+ "delete": {
1068
+ "callbacks": {},
1069
+ "deprecated": false,
1070
+ "description": "Requires the `harness:write` scope.",
1071
+ "parameters": [
1072
+ {
1073
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1074
+ "in": "path",
1075
+ "name": "identifier",
1076
+ "required": true,
1077
+ "schema": {
1078
+ "type": "string"
1079
+ }
1080
+ },
1081
+ {
1082
+ "description": "Resource id",
1083
+ "in": "path",
1084
+ "name": "id",
1085
+ "required": true,
1086
+ "schema": {
1087
+ "type": "string"
1088
+ }
1089
+ }
1090
+ ],
1091
+ "responses": {
1092
+ "200": {
1093
+ "description": "Success"
1094
+ },
1095
+ "400": {
1096
+ "description": "Bad request"
1097
+ },
1098
+ "401": {
1099
+ "description": "Missing or invalid token"
1100
+ },
1101
+ "403": {
1102
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1103
+ },
1104
+ "404": {
1105
+ "description": "Not found"
1106
+ },
1107
+ "422": {
1108
+ "description": "Validation error"
1109
+ }
1110
+ },
1111
+ "summary": "Delete a link",
1112
+ "tags": []
1113
+ }
1114
+ },
1115
+ "/api/v1/issues/{identifier}/relations": {
1116
+ "get": {
1117
+ "callbacks": {},
1118
+ "deprecated": false,
1119
+ "description": "Requires the `harness:read` scope.",
1120
+ "parameters": [
1121
+ {
1122
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1123
+ "in": "path",
1124
+ "name": "identifier",
1125
+ "required": true,
1126
+ "schema": {
1127
+ "type": "string"
1128
+ }
1129
+ }
1130
+ ],
1131
+ "responses": {
1132
+ "200": {
1133
+ "description": "Success"
1134
+ },
1135
+ "400": {
1136
+ "description": "Bad request"
1137
+ },
1138
+ "401": {
1139
+ "description": "Missing or invalid token"
1140
+ },
1141
+ "403": {
1142
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1143
+ },
1144
+ "404": {
1145
+ "description": "Not found"
1146
+ },
1147
+ "422": {
1148
+ "description": "Validation error"
1149
+ }
1150
+ },
1151
+ "summary": "List an issue's relations",
1152
+ "tags": []
1153
+ },
1154
+ "post": {
1155
+ "callbacks": {},
1156
+ "deprecated": false,
1157
+ "description": "Requires the `harness:write` scope.",
1158
+ "parameters": [
1159
+ {
1160
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1161
+ "in": "path",
1162
+ "name": "identifier",
1163
+ "required": true,
1164
+ "schema": {
1165
+ "type": "string"
1166
+ }
1167
+ }
1168
+ ],
1169
+ "requestBody": {
1170
+ "content": {
1171
+ "application/json": {
1172
+ "schema": {
1173
+ "properties": {
1174
+ "related_issue": {
1175
+ "description": "Identifier of the related issue, e.g. ALL-7",
1176
+ "type": "string"
1177
+ },
1178
+ "type": {
1179
+ "description": "Directional aliases (blocked_by, duplicated_by) store the inverse edge",
1180
+ "enum": [
1181
+ "blocks",
1182
+ "blocked_by",
1183
+ "related",
1184
+ "duplicate",
1185
+ "duplicate_of",
1186
+ "duplicated_by"
1187
+ ],
1188
+ "type": "string"
1189
+ }
1190
+ },
1191
+ "type": "object"
1192
+ }
1193
+ }
1194
+ },
1195
+ "required": true
1196
+ },
1197
+ "responses": {
1198
+ "200": {
1199
+ "description": "Success"
1200
+ },
1201
+ "400": {
1202
+ "description": "Bad request"
1203
+ },
1204
+ "401": {
1205
+ "description": "Missing or invalid token"
1206
+ },
1207
+ "403": {
1208
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1209
+ },
1210
+ "404": {
1211
+ "description": "Not found"
1212
+ },
1213
+ "422": {
1214
+ "description": "Validation error"
1215
+ }
1216
+ },
1217
+ "summary": "Create a relation",
1218
+ "tags": []
1219
+ }
1220
+ },
1221
+ "/api/v1/issues/{identifier}/relations/{id}": {
1222
+ "delete": {
1223
+ "callbacks": {},
1224
+ "deprecated": false,
1225
+ "description": "Requires the `harness:write` scope.",
1226
+ "parameters": [
1227
+ {
1228
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1229
+ "in": "path",
1230
+ "name": "identifier",
1231
+ "required": true,
1232
+ "schema": {
1233
+ "type": "string"
1234
+ }
1235
+ },
1236
+ {
1237
+ "description": "Resource id",
1238
+ "in": "path",
1239
+ "name": "id",
1240
+ "required": true,
1241
+ "schema": {
1242
+ "type": "string"
1243
+ }
1244
+ }
1245
+ ],
1246
+ "responses": {
1247
+ "200": {
1248
+ "description": "Success"
1249
+ },
1250
+ "400": {
1251
+ "description": "Bad request"
1252
+ },
1253
+ "401": {
1254
+ "description": "Missing or invalid token"
1255
+ },
1256
+ "403": {
1257
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1258
+ },
1259
+ "404": {
1260
+ "description": "Not found"
1261
+ },
1262
+ "422": {
1263
+ "description": "Validation error"
1264
+ }
1265
+ },
1266
+ "summary": "Delete a relation",
1267
+ "tags": []
1268
+ }
1269
+ },
1270
+ "/api/v1/issues/{identifier}/state": {
1271
+ "put": {
1272
+ "callbacks": {},
1273
+ "deprecated": false,
1274
+ "description": "Requires the `harness:write` scope.",
1275
+ "parameters": [
1276
+ {
1277
+ "description": "Issue identifier, e.g. IO-10001 (minted) or ALL-4223 (imported)",
1278
+ "in": "path",
1279
+ "name": "identifier",
1280
+ "required": true,
1281
+ "schema": {
1282
+ "type": "string"
1283
+ }
1284
+ }
1285
+ ],
1286
+ "requestBody": {
1287
+ "content": {
1288
+ "application/json": {
1289
+ "schema": {
1290
+ "properties": {
1291
+ "state_id": {
1292
+ "type": "string"
1293
+ }
1294
+ },
1295
+ "type": "object"
1296
+ }
1297
+ }
1298
+ },
1299
+ "required": true
1300
+ },
1301
+ "responses": {
1302
+ "200": {
1303
+ "description": "Success"
1304
+ },
1305
+ "400": {
1306
+ "description": "Bad request"
1307
+ },
1308
+ "401": {
1309
+ "description": "Missing or invalid token"
1310
+ },
1311
+ "403": {
1312
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1313
+ },
1314
+ "404": {
1315
+ "description": "Not found"
1316
+ },
1317
+ "422": {
1318
+ "description": "Validation error"
1319
+ }
1320
+ },
1321
+ "summary": "Set issue state",
1322
+ "tags": []
1323
+ }
1324
+ },
1325
+ "/api/v1/labels": {
1326
+ "get": {
1327
+ "callbacks": {},
1328
+ "deprecated": false,
1329
+ "description": "Requires the `harness:read` scope.",
1330
+ "parameters": [],
1331
+ "responses": {
1332
+ "200": {
1333
+ "description": "Success"
1334
+ },
1335
+ "400": {
1336
+ "description": "Bad request"
1337
+ },
1338
+ "401": {
1339
+ "description": "Missing or invalid token"
1340
+ },
1341
+ "403": {
1342
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1343
+ },
1344
+ "404": {
1345
+ "description": "Not found"
1346
+ },
1347
+ "422": {
1348
+ "description": "Validation error"
1349
+ }
1350
+ },
1351
+ "summary": "List labels",
1352
+ "tags": []
1353
+ },
1354
+ "post": {
1355
+ "callbacks": {},
1356
+ "deprecated": false,
1357
+ "description": "Requires the `harness:write` scope.",
1358
+ "parameters": [],
1359
+ "requestBody": {
1360
+ "content": {
1361
+ "application/json": {
1362
+ "schema": {
1363
+ "properties": {
1364
+ "color": {
1365
+ "type": "string"
1366
+ },
1367
+ "name": {
1368
+ "type": "string"
1369
+ },
1370
+ "parent_id": {
1371
+ "description": "Optional parent label (label groups)",
1372
+ "type": "string"
1373
+ },
1374
+ "team_id": {
1375
+ "description": "Optional; omit for a workspace-level label",
1376
+ "type": "string"
1377
+ }
1378
+ },
1379
+ "type": "object"
1380
+ }
1381
+ }
1382
+ },
1383
+ "required": true
1384
+ },
1385
+ "responses": {
1386
+ "200": {
1387
+ "description": "Success"
1388
+ },
1389
+ "400": {
1390
+ "description": "Bad request"
1391
+ },
1392
+ "401": {
1393
+ "description": "Missing or invalid token"
1394
+ },
1395
+ "403": {
1396
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1397
+ },
1398
+ "404": {
1399
+ "description": "Not found"
1400
+ },
1401
+ "422": {
1402
+ "description": "Validation error"
1403
+ }
1404
+ },
1405
+ "summary": "Create a label",
1406
+ "tags": []
1407
+ }
1408
+ },
1409
+ "/api/v1/projects": {
1410
+ "get": {
1411
+ "callbacks": {},
1412
+ "deprecated": false,
1413
+ "description": "Requires the `harness:read` scope.",
1414
+ "parameters": [
1415
+ {
1416
+ "description": "Page number (default 1)",
1417
+ "in": "query",
1418
+ "name": "page",
1419
+ "required": false,
1420
+ "schema": {
1421
+ "type": "integer"
1422
+ }
1423
+ },
1424
+ {
1425
+ "description": "Items per page (max 100)",
1426
+ "in": "query",
1427
+ "name": "page_size",
1428
+ "required": false,
1429
+ "schema": {
1430
+ "type": "integer"
1431
+ }
1432
+ },
1433
+ {
1434
+ "description": "name, sort_order, inserted_at, or updated_at",
1435
+ "in": "query",
1436
+ "name": "order_by",
1437
+ "required": false,
1438
+ "schema": {
1439
+ "type": "string"
1440
+ }
1441
+ },
1442
+ {
1443
+ "description": "asc or desc (default asc)",
1444
+ "in": "query",
1445
+ "name": "order_dir",
1446
+ "required": false,
1447
+ "schema": {
1448
+ "type": "string"
1449
+ }
1450
+ },
1451
+ {
1452
+ "description": "Match project name or summary",
1453
+ "in": "query",
1454
+ "name": "search",
1455
+ "required": false,
1456
+ "schema": {
1457
+ "type": "string"
1458
+ }
1459
+ },
1460
+ {
1461
+ "description": "Filter by state: backlog, planned, started, completed, canceled",
1462
+ "in": "query",
1463
+ "name": "state",
1464
+ "required": false,
1465
+ "schema": {
1466
+ "type": "string"
1467
+ }
1468
+ }
1469
+ ],
1470
+ "responses": {
1471
+ "200": {
1472
+ "description": "Success"
1473
+ },
1474
+ "400": {
1475
+ "description": "Bad request"
1476
+ },
1477
+ "401": {
1478
+ "description": "Missing or invalid token"
1479
+ },
1480
+ "403": {
1481
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1482
+ },
1483
+ "404": {
1484
+ "description": "Not found"
1485
+ },
1486
+ "422": {
1487
+ "description": "Validation error"
1488
+ }
1489
+ },
1490
+ "summary": "List projects",
1491
+ "tags": []
1492
+ },
1493
+ "post": {
1494
+ "callbacks": {},
1495
+ "deprecated": false,
1496
+ "description": "Requires the `harness:write` scope.",
1497
+ "parameters": [],
1498
+ "requestBody": {
1499
+ "content": {
1500
+ "application/json": {
1501
+ "schema": {
1502
+ "properties": {
1503
+ "description": {
1504
+ "type": "string"
1505
+ },
1506
+ "lead_id": {
1507
+ "type": "string"
1508
+ },
1509
+ "name": {
1510
+ "type": "string"
1511
+ },
1512
+ "sort_order": {
1513
+ "type": "number"
1514
+ },
1515
+ "start_date": {
1516
+ "format": "date",
1517
+ "type": "string"
1518
+ },
1519
+ "state": {
1520
+ "description": "backlog, planned, started, completed, or canceled",
1521
+ "type": "string"
1522
+ },
1523
+ "summary": {
1524
+ "type": "string"
1525
+ },
1526
+ "target_date": {
1527
+ "format": "date",
1528
+ "type": "string"
1529
+ }
1530
+ },
1531
+ "type": "object"
1532
+ }
1533
+ }
1534
+ },
1535
+ "required": true
1536
+ },
1537
+ "responses": {
1538
+ "200": {
1539
+ "description": "Success"
1540
+ },
1541
+ "400": {
1542
+ "description": "Bad request"
1543
+ },
1544
+ "401": {
1545
+ "description": "Missing or invalid token"
1546
+ },
1547
+ "403": {
1548
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1549
+ },
1550
+ "404": {
1551
+ "description": "Not found"
1552
+ },
1553
+ "422": {
1554
+ "description": "Validation error"
1555
+ }
1556
+ },
1557
+ "summary": "Create a project",
1558
+ "tags": []
1559
+ }
1560
+ },
1561
+ "/api/v1/projects/{id}": {
1562
+ "get": {
1563
+ "callbacks": {},
1564
+ "deprecated": false,
1565
+ "description": "Requires the `harness:read` scope.",
1566
+ "parameters": [
1567
+ {
1568
+ "description": "Resource id",
1569
+ "in": "path",
1570
+ "name": "id",
1571
+ "required": true,
1572
+ "schema": {
1573
+ "type": "string"
1574
+ }
1575
+ }
1576
+ ],
1577
+ "responses": {
1578
+ "200": {
1579
+ "description": "Success"
1580
+ },
1581
+ "400": {
1582
+ "description": "Bad request"
1583
+ },
1584
+ "401": {
1585
+ "description": "Missing or invalid token"
1586
+ },
1587
+ "403": {
1588
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1589
+ },
1590
+ "404": {
1591
+ "description": "Not found"
1592
+ },
1593
+ "422": {
1594
+ "description": "Validation error"
1595
+ }
1596
+ },
1597
+ "summary": "Get a project",
1598
+ "tags": []
1599
+ },
1600
+ "patch": {
1601
+ "callbacks": {},
1602
+ "deprecated": false,
1603
+ "description": "Requires the `harness:write` scope.",
1604
+ "parameters": [
1605
+ {
1606
+ "description": "Resource id",
1607
+ "in": "path",
1608
+ "name": "id",
1609
+ "required": true,
1610
+ "schema": {
1611
+ "type": "string"
1612
+ }
1613
+ }
1614
+ ],
1615
+ "requestBody": {
1616
+ "content": {
1617
+ "application/json": {
1618
+ "schema": {
1619
+ "properties": {
1620
+ "description": {
1621
+ "type": "string"
1622
+ },
1623
+ "lead_id": {
1624
+ "type": "string"
1625
+ },
1626
+ "name": {
1627
+ "type": "string"
1628
+ },
1629
+ "sort_order": {
1630
+ "type": "number"
1631
+ },
1632
+ "start_date": {
1633
+ "format": "date",
1634
+ "type": "string"
1635
+ },
1636
+ "state": {
1637
+ "description": "backlog, planned, started, completed, or canceled",
1638
+ "type": "string"
1639
+ },
1640
+ "summary": {
1641
+ "type": "string"
1642
+ },
1643
+ "target_date": {
1644
+ "format": "date",
1645
+ "type": "string"
1646
+ }
1647
+ },
1648
+ "type": "object"
1649
+ }
1650
+ }
1651
+ },
1652
+ "required": true
1653
+ },
1654
+ "responses": {
1655
+ "200": {
1656
+ "description": "Success"
1657
+ },
1658
+ "400": {
1659
+ "description": "Bad request"
1660
+ },
1661
+ "401": {
1662
+ "description": "Missing or invalid token"
1663
+ },
1664
+ "403": {
1665
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1666
+ },
1667
+ "404": {
1668
+ "description": "Not found"
1669
+ },
1670
+ "422": {
1671
+ "description": "Validation error"
1672
+ }
1673
+ },
1674
+ "summary": "Update a project",
1675
+ "tags": []
1676
+ }
1677
+ },
1678
+ "/api/v1/projects/{project_id}/milestones": {
1679
+ "get": {
1680
+ "callbacks": {},
1681
+ "deprecated": false,
1682
+ "description": "Requires the `harness:read` scope.",
1683
+ "parameters": [
1684
+ {
1685
+ "description": "Project id",
1686
+ "in": "path",
1687
+ "name": "project_id",
1688
+ "required": true,
1689
+ "schema": {
1690
+ "type": "string"
1691
+ }
1692
+ }
1693
+ ],
1694
+ "responses": {
1695
+ "200": {
1696
+ "description": "Success"
1697
+ },
1698
+ "400": {
1699
+ "description": "Bad request"
1700
+ },
1701
+ "401": {
1702
+ "description": "Missing or invalid token"
1703
+ },
1704
+ "403": {
1705
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1706
+ },
1707
+ "404": {
1708
+ "description": "Not found"
1709
+ },
1710
+ "422": {
1711
+ "description": "Validation error"
1712
+ }
1713
+ },
1714
+ "summary": "List a project's milestones",
1715
+ "tags": []
1716
+ },
1717
+ "post": {
1718
+ "callbacks": {},
1719
+ "deprecated": false,
1720
+ "description": "Requires the `harness:write` scope.",
1721
+ "parameters": [
1722
+ {
1723
+ "description": "Project id",
1724
+ "in": "path",
1725
+ "name": "project_id",
1726
+ "required": true,
1727
+ "schema": {
1728
+ "type": "string"
1729
+ }
1730
+ }
1731
+ ],
1732
+ "requestBody": {
1733
+ "content": {
1734
+ "application/json": {
1735
+ "schema": {
1736
+ "properties": {
1737
+ "description": {
1738
+ "type": "string"
1739
+ },
1740
+ "name": {
1741
+ "type": "string"
1742
+ },
1743
+ "sort_order": {
1744
+ "type": "number"
1745
+ },
1746
+ "target_date": {
1747
+ "format": "date",
1748
+ "type": "string"
1749
+ }
1750
+ },
1751
+ "type": "object"
1752
+ }
1753
+ }
1754
+ },
1755
+ "required": true
1756
+ },
1757
+ "responses": {
1758
+ "200": {
1759
+ "description": "Success"
1760
+ },
1761
+ "400": {
1762
+ "description": "Bad request"
1763
+ },
1764
+ "401": {
1765
+ "description": "Missing or invalid token"
1766
+ },
1767
+ "403": {
1768
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1769
+ },
1770
+ "404": {
1771
+ "description": "Not found"
1772
+ },
1773
+ "422": {
1774
+ "description": "Validation error"
1775
+ }
1776
+ },
1777
+ "summary": "Create a milestone",
1778
+ "tags": []
1779
+ }
1780
+ },
1781
+ "/api/v1/session": {
1782
+ "delete": {
1783
+ "callbacks": {},
1784
+ "deprecated": false,
1785
+ "description": "Requires the `harness:read` scope. Logout for the harness CLI: revokes the bearer login token making the request. aone_ API tokens are refused (400) — manage those in the admin UI.",
1786
+ "parameters": [],
1787
+ "responses": {
1788
+ "200": {
1789
+ "description": "Success"
1790
+ },
1791
+ "400": {
1792
+ "description": "Bad request"
1793
+ },
1794
+ "401": {
1795
+ "description": "Missing or invalid token"
1796
+ },
1797
+ "403": {
1798
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1799
+ },
1800
+ "404": {
1801
+ "description": "Not found"
1802
+ },
1803
+ "422": {
1804
+ "description": "Validation error"
1805
+ }
1806
+ },
1807
+ "summary": "Revoke the presented login token",
1808
+ "tags": []
1809
+ }
1810
+ },
1811
+ "/api/v1/stats": {
1812
+ "get": {
1813
+ "callbacks": {},
1814
+ "deprecated": false,
1815
+ "description": "Requires the `harness:read` scope. Per-team and total open / started / blocked / ready / closed counts, one call.",
1816
+ "parameters": [],
1817
+ "responses": {
1818
+ "200": {
1819
+ "description": "Success"
1820
+ },
1821
+ "400": {
1822
+ "description": "Bad request"
1823
+ },
1824
+ "401": {
1825
+ "description": "Missing or invalid token"
1826
+ },
1827
+ "403": {
1828
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1829
+ },
1830
+ "404": {
1831
+ "description": "Not found"
1832
+ },
1833
+ "422": {
1834
+ "description": "Validation error"
1835
+ }
1836
+ },
1837
+ "summary": "Workspace issue counts",
1838
+ "tags": []
1839
+ }
1840
+ },
1841
+ "/api/v1/teams": {
1842
+ "get": {
1843
+ "callbacks": {},
1844
+ "deprecated": false,
1845
+ "description": "Requires the `harness:read` scope.",
1846
+ "parameters": [],
1847
+ "responses": {
1848
+ "200": {
1849
+ "description": "Success"
1850
+ },
1851
+ "400": {
1852
+ "description": "Bad request"
1853
+ },
1854
+ "401": {
1855
+ "description": "Missing or invalid token"
1856
+ },
1857
+ "403": {
1858
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1859
+ },
1860
+ "404": {
1861
+ "description": "Not found"
1862
+ },
1863
+ "422": {
1864
+ "description": "Validation error"
1865
+ }
1866
+ },
1867
+ "summary": "List teams",
1868
+ "tags": []
1869
+ }
1870
+ },
1871
+ "/api/v1/teams/{team_key}/issues": {
1872
+ "post": {
1873
+ "callbacks": {},
1874
+ "deprecated": false,
1875
+ "description": "Requires the `harness:write` scope.",
1876
+ "parameters": [
1877
+ {
1878
+ "description": "Team key, e.g. ALL",
1879
+ "in": "path",
1880
+ "name": "team_key",
1881
+ "required": true,
1882
+ "schema": {
1883
+ "type": "string"
1884
+ }
1885
+ }
1886
+ ],
1887
+ "requestBody": {
1888
+ "content": {
1889
+ "application/json": {
1890
+ "schema": {
1891
+ "properties": {
1892
+ "acceptance_criteria": {
1893
+ "description": "Acceptance criteria (markdown)",
1894
+ "type": "string"
1895
+ },
1896
+ "actor": {
1897
+ "description": "Display name to attribute the write to (e.g. an agent). Defaults to the token name for API tokens and to the signed-in user for login tokens. Display-only, never an access-control input.",
1898
+ "type": "string"
1899
+ },
1900
+ "assignee": {
1901
+ "description": "\"me\" for the token owner, a user id, an email address, or an exact display name",
1902
+ "type": "string"
1903
+ },
1904
+ "assignee_id": {
1905
+ "type": "string"
1906
+ },
1907
+ "description": {
1908
+ "type": "string"
1909
+ },
1910
+ "design": {
1911
+ "description": "Design decisions (markdown)",
1912
+ "type": "string"
1913
+ },
1914
+ "due_date": {
1915
+ "format": "date",
1916
+ "type": "string"
1917
+ },
1918
+ "notes": {
1919
+ "description": "Working notes (markdown)",
1920
+ "type": "string"
1921
+ },
1922
+ "parent": {
1923
+ "description": "Parent issue identifier, e.g. ALL-4223",
1924
+ "type": "string"
1925
+ },
1926
+ "priority": {
1927
+ "description": "0 none, 1 urgent, 2 high, 3 medium, 4 low",
1928
+ "type": "integer"
1929
+ },
1930
+ "state_id": {
1931
+ "description": "Defaults to the team's first workflow state",
1932
+ "type": "string"
1933
+ },
1934
+ "title": {
1935
+ "type": "string"
1936
+ }
1937
+ },
1938
+ "type": "object"
1939
+ }
1940
+ }
1941
+ },
1942
+ "required": true
1943
+ },
1944
+ "responses": {
1945
+ "200": {
1946
+ "description": "Success"
1947
+ },
1948
+ "400": {
1949
+ "description": "Bad request"
1950
+ },
1951
+ "401": {
1952
+ "description": "Missing or invalid token"
1953
+ },
1954
+ "403": {
1955
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1956
+ },
1957
+ "404": {
1958
+ "description": "Not found"
1959
+ },
1960
+ "422": {
1961
+ "description": "Validation error"
1962
+ }
1963
+ },
1964
+ "summary": "Create an issue",
1965
+ "tags": []
1966
+ }
1967
+ },
1968
+ "/api/v1/teams/{team_key}/workflow_states": {
1969
+ "get": {
1970
+ "callbacks": {},
1971
+ "deprecated": false,
1972
+ "description": "Requires the `harness:read` scope.",
1973
+ "parameters": [
1974
+ {
1975
+ "description": "Team key, e.g. ALL",
1976
+ "in": "path",
1977
+ "name": "team_key",
1978
+ "required": true,
1979
+ "schema": {
1980
+ "type": "string"
1981
+ }
1982
+ }
1983
+ ],
1984
+ "responses": {
1985
+ "200": {
1986
+ "description": "Success"
1987
+ },
1988
+ "400": {
1989
+ "description": "Bad request"
1990
+ },
1991
+ "401": {
1992
+ "description": "Missing or invalid token"
1993
+ },
1994
+ "403": {
1995
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
1996
+ },
1997
+ "404": {
1998
+ "description": "Not found"
1999
+ },
2000
+ "422": {
2001
+ "description": "Validation error"
2002
+ }
2003
+ },
2004
+ "summary": "List a team's workflow states",
2005
+ "tags": []
2006
+ }
2007
+ },
2008
+ "/api/v1/uploads": {
2009
+ "post": {
2010
+ "callbacks": {},
2011
+ "deprecated": false,
2012
+ "description": "Requires the `harness:write` scope. Multipart upload of a png, jpg, webp, or gif (max 25 MB). Returns the attachment URL and a ready-to-paste `![alt](url)` markdown snippet for issue descriptions and comments. Attachments are private: the URL serves admins with a session; API clients fetch the bytes via `GET /api/v1/attachments/{attachment_id}/{file}`.",
2013
+ "parameters": [],
2014
+ "requestBody": {
2015
+ "content": {
2016
+ "multipart/form-data": {
2017
+ "schema": {
2018
+ "properties": {
2019
+ "file": {
2020
+ "description": "png, jpg, webp, or gif up to 25 MB",
2021
+ "format": "binary",
2022
+ "type": "string"
2023
+ }
2024
+ },
2025
+ "required": [
2026
+ "file"
2027
+ ],
2028
+ "type": "object"
2029
+ }
2030
+ }
2031
+ },
2032
+ "required": true
2033
+ },
2034
+ "responses": {
2035
+ "200": {
2036
+ "description": "Success"
2037
+ },
2038
+ "400": {
2039
+ "description": "Bad request"
2040
+ },
2041
+ "401": {
2042
+ "description": "Missing or invalid token"
2043
+ },
2044
+ "403": {
2045
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
2046
+ },
2047
+ "404": {
2048
+ "description": "Not found"
2049
+ },
2050
+ "422": {
2051
+ "description": "Validation error"
2052
+ },
2053
+ "502": {
2054
+ "description": "File storage failed (transient) — retry"
2055
+ }
2056
+ },
2057
+ "summary": "Upload an image attachment",
2058
+ "tags": []
2059
+ }
2060
+ },
2061
+ "/api/v1/users": {
2062
+ "get": {
2063
+ "callbacks": {},
2064
+ "deprecated": false,
2065
+ "description": "Requires the `harness:read` scope.",
2066
+ "parameters": [],
2067
+ "responses": {
2068
+ "200": {
2069
+ "description": "Success"
2070
+ },
2071
+ "400": {
2072
+ "description": "Bad request"
2073
+ },
2074
+ "401": {
2075
+ "description": "Missing or invalid token"
2076
+ },
2077
+ "403": {
2078
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
2079
+ },
2080
+ "404": {
2081
+ "description": "Not found"
2082
+ },
2083
+ "422": {
2084
+ "description": "Validation error"
2085
+ }
2086
+ },
2087
+ "summary": "List assignable users",
2088
+ "tags": []
2089
+ }
2090
+ }
2091
+ },
2092
+ "security": [
2093
+ {
2094
+ "bearer": []
2095
+ }
2096
+ ],
2097
+ "servers": [],
2098
+ "tags": []
2099
+ }