@kosuke-ai/cli 6.2.0 → 6.3.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.
@@ -149,24 +149,26 @@ import { operation as o147 } from './workspaces/lead-cards.js';
149
149
  import { operation as o148 } from './workspaces/lead-merge.js';
150
150
  import { operation as o149 } from './workspaces/lead-notifications-open.js';
151
151
  import { operation as o150 } from './workspaces/lead-proposals-create.js';
152
- import { operation as o151 } from './workspaces/lead-triage.js';
153
- import { operation as o152 } from './workspaces/list.js';
154
- import { operation as o153 } from './workspaces/members.js';
155
- import { operation as o154 } from './workspaces/plugins-list.js';
156
- import { operation as o155 } from './workspaces/plugins-update.js';
157
- import { operation as o156 } from './workspaces/provider-login-claude-complete.js';
158
- import { operation as o157 } from './workspaces/provider-login-claude-start.js';
159
- import { operation as o158 } from './workspaces/provider-login-codex-complete.js';
160
- import { operation as o159 } from './workspaces/provider-login-codex-start.js';
161
- import { operation as o160 } from './workspaces/sandbox-limit.js';
162
- import { operation as o161 } from './workspaces/skills-create.js';
163
- import { operation as o162 } from './workspaces/skills-delete.js';
164
- import { operation as o163 } from './workspaces/skills-get.js';
165
- import { operation as o164 } from './workspaces/skills-list.js';
166
- import { operation as o165 } from './workspaces/skills-update.js';
167
- import { operation as o166 } from './workspaces/stop-sandboxes.js';
168
- import { operation as o167 } from './workspaces/timezone-set.js';
169
- import { operation as o168 } from './workspaces/usage.js';
152
+ import { operation as o151 } from './workspaces/lead-review-request.js';
153
+ import { operation as o152 } from './workspaces/lead-session-send.js';
154
+ import { operation as o153 } from './workspaces/lead-triage.js';
155
+ import { operation as o154 } from './workspaces/list.js';
156
+ import { operation as o155 } from './workspaces/members.js';
157
+ import { operation as o156 } from './workspaces/plugins-list.js';
158
+ import { operation as o157 } from './workspaces/plugins-update.js';
159
+ import { operation as o158 } from './workspaces/provider-login-claude-complete.js';
160
+ import { operation as o159 } from './workspaces/provider-login-claude-start.js';
161
+ import { operation as o160 } from './workspaces/provider-login-codex-complete.js';
162
+ import { operation as o161 } from './workspaces/provider-login-codex-start.js';
163
+ import { operation as o162 } from './workspaces/sandbox-limit.js';
164
+ import { operation as o163 } from './workspaces/skills-create.js';
165
+ import { operation as o164 } from './workspaces/skills-delete.js';
166
+ import { operation as o165 } from './workspaces/skills-get.js';
167
+ import { operation as o166 } from './workspaces/skills-list.js';
168
+ import { operation as o167 } from './workspaces/skills-update.js';
169
+ import { operation as o168 } from './workspaces/stop-sandboxes.js';
170
+ import { operation as o169 } from './workspaces/timezone-set.js';
171
+ import { operation as o170 } from './workspaces/usage.js';
170
172
  export const operations = [
171
173
  o0,
172
174
  o1,
@@ -337,4 +339,6 @@ export const operations = [
337
339
  o166,
338
340
  o167,
339
341
  o168,
342
+ o169,
343
+ o170,
340
344
  ];
@@ -34,7 +34,17 @@ export const operation = {
34
34
  "flag": "needs-you",
35
35
  "kind": "boolean",
36
36
  "required": false,
37
- "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, awaiting_response, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list."
37
+ "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, turn_failed, awaiting_response, ship_stop, ready_to_merge, awaiting_approval, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list."
38
+ },
39
+ {
40
+ "name": "viewer",
41
+ "flag": "viewer",
42
+ "kind": "string",
43
+ "required": false,
44
+ "description": "'me' reads Needs You for you, as Home does: your own sessions' reasons, and awaiting_approval on the pull requests that ask you for a review, which --owners then lets through whoever they belong to. Without it every reason is read for the session's Assignee.",
45
+ "choices": [
46
+ "me"
47
+ ]
38
48
  },
39
49
  {
40
50
  "name": "status",
@@ -5,7 +5,7 @@ export const operation = {
5
5
  "workspaces",
6
6
  "lead-merge"
7
7
  ],
8
- "summary": "Put the pull request of one of your own Chat Sessions in the Merge Queue, as your Merge tap on its Lead Card does. Refused with the reason when the pull request is not approved yet, or when its Merge card is not yours.",
8
+ "summary": "Put the pull request of one of your own Chat Sessions in the Merge Queue, as a Merge tap on a Lead Card does. Refused with the reason unless you are its Assignee and the pull request is open and approved.",
9
9
  "pathParams": [
10
10
  "workspaceId"
11
11
  ],
@@ -0,0 +1,39 @@
1
+ export const operation = {
2
+ "method": "post",
3
+ "path": "/api/organizations/{workspaceId}/lead/review-requests",
4
+ "command": [
5
+ "workspaces",
6
+ "lead-review-request"
7
+ ],
8
+ "summary": "Ask again, as Kosuke, the reviewers one of your member’s Chat Sessions asked before, on its open pull request. Only the Lead calls it. In an Event Turn it names a fact of its batch about that session. A retry for the same fact or Turn asks nobody twice. Answers who GitHub took and the reason for each one it refused.",
9
+ "pathParams": [
10
+ "workspaceId"
11
+ ],
12
+ "query": [],
13
+ "body": {
14
+ "fields": [
15
+ {
16
+ "name": "sessionId",
17
+ "flag": "session-id",
18
+ "kind": "string",
19
+ "required": true,
20
+ "description": "The Chat Session whose pull request to ask again. Its Assignee is your member."
21
+ },
22
+ {
23
+ "name": "factId",
24
+ "flag": "fact-id",
25
+ "kind": "string",
26
+ "required": false,
27
+ "description": "The Lead Fact the re-ask answers. Required in an Event Turn: one of its batch, about this session."
28
+ }
29
+ ],
30
+ "required": true
31
+ },
32
+ "multipart": null,
33
+ "attachments": false,
34
+ "anonymous": false,
35
+ "sandboxToken": false,
36
+ "orchestratorToken": false,
37
+ "cronToken": false,
38
+ "leadToken": true
39
+ };
@@ -0,0 +1,57 @@
1
+ export const operation = {
2
+ "method": "post",
3
+ "path": "/api/organizations/{workspaceId}/lead/session-sends",
4
+ "command": [
5
+ "workspaces",
6
+ "lead-session-send"
7
+ ],
8
+ "summary": "Send a message into one of your member’s Chat Sessions as Kosuke, from the Lead, with an optional /kosuke:ship or /kosuke:sync-branch. Only the Lead calls it. In an Event Turn it names a fact of its batch about that session. One send per session per Turn, and at most 3 in a row with nothing new from a person or GitHub; a refusal comes back with its reason.",
9
+ "pathParams": [
10
+ "workspaceId"
11
+ ],
12
+ "query": [],
13
+ "body": {
14
+ "fields": [
15
+ {
16
+ "name": "sessionId",
17
+ "flag": "session-id",
18
+ "kind": "string",
19
+ "required": true,
20
+ "description": "The Chat Session to send into. Its Assignee is your member."
21
+ },
22
+ {
23
+ "name": "factId",
24
+ "flag": "fact-id",
25
+ "kind": "string",
26
+ "required": false,
27
+ "description": "The Lead Fact the send answers. Required in an Event Turn: one of its batch, about this session."
28
+ },
29
+ {
30
+ "name": "content",
31
+ "flag": "content",
32
+ "kind": "string",
33
+ "required": true,
34
+ "description": "The message, in your own words, written from the facts."
35
+ },
36
+ {
37
+ "name": "skill",
38
+ "flag": "skill",
39
+ "kind": "string",
40
+ "required": false,
41
+ "description": "A Kosuke skill the message runs: /kosuke:ship or /kosuke:sync-branch.",
42
+ "choices": [
43
+ "ship",
44
+ "sync-branch"
45
+ ]
46
+ }
47
+ ],
48
+ "required": true
49
+ },
50
+ "multipart": null,
51
+ "attachments": false,
52
+ "anonymous": false,
53
+ "sandboxToken": false,
54
+ "orchestratorToken": false,
55
+ "cronToken": false,
56
+ "leadToken": true
57
+ };
@@ -5,13 +5,27 @@ export const operation = {
5
5
  "workspaces",
6
6
  "lead-triage"
7
7
  ],
8
- "summary": "Write the triage of your own open Lead Cards in a workspace: their order, one line of why per card, who reviews a ready pull request, one notification, and the Welcome back sentence. Answers what was ranked, whether the notification went out, and every part it refused with the reason.",
8
+ "summary": "Write your own Lead Cards in a workspace: open, update and close them from the Lead Facts you received, put them in order, one line of why per card, one notification, and the Welcome back sentence. Answers the cards opened and closed, what was ranked, whether the notification went out, and every part it refused with the reason. Pass the body whole with --body or --body-file.",
9
9
  "pathParams": [
10
10
  "workspaceId"
11
11
  ],
12
12
  "query": [],
13
13
  "body": {
14
14
  "fields": [
15
+ {
16
+ "name": "open",
17
+ "flag": "open",
18
+ "kind": "json",
19
+ "required": false,
20
+ "description": "Cards to open, or to update when you already have one open on that session with that key. Each names the facts it is basedOn, all yours and about its session, none older than the member's last answer. At most 4 parts and 6 actions. A JSON array."
21
+ },
22
+ {
23
+ "name": "close",
24
+ "flag": "close",
25
+ "kind": "json",
26
+ "required": false,
27
+ "description": "Cards to resolve, each at the revision you read, with the facts it is basedOn and one line of reason. A JSON array."
28
+ },
15
29
  {
16
30
  "name": "rank",
17
31
  "flag": "rank",
@@ -26,19 +40,12 @@ export const operation = {
26
40
  "required": false,
27
41
  "description": "One line of why per card, kept to 300 characters. A JSON array."
28
42
  },
29
- {
30
- "name": "picks",
31
- "flag": "picks",
32
- "kind": "json",
33
- "required": false,
34
- "description": "Who reviews the pull request of a To approve card: every candidate but its author, at most 15. A JSON array."
35
- },
36
43
  {
37
44
  "name": "notify",
38
45
  "flag": "notify",
39
46
  "kind": "json",
40
47
  "required": false,
41
- "description": "One notification for one card. Refused while the Lead is on screen. A JSON object."
48
+ "description": "One notification for one open card: once per card, never for a skipped card, refused while the Lead is on screen. A JSON object."
42
49
  },
43
50
  {
44
51
  "name": "welcome",
package/openapi.json CHANGED
@@ -276,12 +276,23 @@
276
276
  "name": "needsYou",
277
277
  "in": "query",
278
278
  "required": false,
279
- "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, awaiting_response, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list.",
279
+ "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, turn_failed, awaiting_response, ship_stop, ready_to_merge, awaiting_approval, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list.",
280
280
  "schema": {
281
- "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, awaiting_response, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list.",
281
+ "description": "Only sessions blocked on a person: at most 100, most severe reason first (checks_failed, turn_failed, awaiting_response, ship_stop, ready_to_merge, awaiting_approval, behind, stale_pr), as on Home. Never paged: meta.pagination.total counts them all, and --workspace or --project narrows the list.",
282
282
  "type": "boolean"
283
283
  }
284
284
  },
285
+ {
286
+ "name": "viewer",
287
+ "in": "query",
288
+ "required": false,
289
+ "description": "'me' reads Needs You for you, as Home does: your own sessions' reasons, and awaiting_approval on the pull requests that ask you for a review, which --owners then lets through whoever they belong to. Without it every reason is read for the session's Assignee.",
290
+ "schema": {
291
+ "description": "'me' reads Needs You for you, as Home does: your own sessions' reasons, and awaiting_approval on the pull requests that ask you for a review, which --owners then lets through whoever they belong to. Without it every reason is read for the session's Assignee.",
292
+ "type": "string",
293
+ "enum": ["me"]
294
+ }
295
+ },
285
296
  {
286
297
  "name": "status",
287
298
  "in": "query",
@@ -3081,7 +3092,7 @@
3081
3092
  "/api/organizations/{workspaceId}/lead/merge": {
3082
3093
  "post": {
3083
3094
  "operationId": "workspacesLeadMerge",
3084
- "summary": "Put the pull request of one of your own Chat Sessions in the Merge Queue, as your Merge tap on its Lead Card does. Refused with the reason when the pull request is not approved yet, or when its Merge card is not yours.",
3095
+ "summary": "Put the pull request of one of your own Chat Sessions in the Merge Queue, as a Merge tap on a Lead Card does. Refused with the reason unless you are its Assignee and the pull request is open and approved.",
3085
3096
  "tags": ["workspaces"],
3086
3097
  "x-kosuke-command": ["workspaces", "lead-merge"],
3087
3098
  "x-kosuke-lead-token": true,
@@ -3484,10 +3495,182 @@
3484
3495
  }
3485
3496
  }
3486
3497
  },
3498
+ "/api/organizations/{workspaceId}/lead/review-requests": {
3499
+ "post": {
3500
+ "operationId": "workspacesLeadReviewRequest",
3501
+ "summary": "Ask again, as Kosuke, the reviewers one of your member’s Chat Sessions asked before, on its open pull request. Only the Lead calls it. In an Event Turn it names a fact of its batch about that session. A retry for the same fact or Turn asks nobody twice. Answers who GitHub took and the reason for each one it refused.",
3502
+ "tags": ["workspaces"],
3503
+ "x-kosuke-command": ["workspaces", "lead-review-request"],
3504
+ "x-kosuke-lead-token": true,
3505
+ "parameters": [
3506
+ {
3507
+ "name": "workspaceId",
3508
+ "in": "path",
3509
+ "required": true,
3510
+ "schema": {
3511
+ "type": "string",
3512
+ "minLength": 1
3513
+ }
3514
+ }
3515
+ ],
3516
+ "requestBody": {
3517
+ "required": true,
3518
+ "content": {
3519
+ "application/json": {
3520
+ "schema": {
3521
+ "type": "object",
3522
+ "properties": {
3523
+ "sessionId": {
3524
+ "type": "string",
3525
+ "format": "uuid",
3526
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
3527
+ "description": "The Chat Session whose pull request to ask again. Its Assignee is your member."
3528
+ },
3529
+ "factId": {
3530
+ "description": "The Lead Fact the re-ask answers. Required in an Event Turn: one of its batch, about this session.",
3531
+ "type": "string",
3532
+ "format": "uuid",
3533
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3534
+ }
3535
+ },
3536
+ "required": ["sessionId"]
3537
+ }
3538
+ }
3539
+ }
3540
+ },
3541
+ "responses": {
3542
+ "2XX": {
3543
+ "description": "Success envelope",
3544
+ "content": {
3545
+ "application/json": {
3546
+ "schema": {
3547
+ "$ref": "#/components/schemas/ApiSuccess"
3548
+ }
3549
+ }
3550
+ }
3551
+ },
3552
+ "4XX": {
3553
+ "description": "Error envelope",
3554
+ "content": {
3555
+ "application/json": {
3556
+ "schema": {
3557
+ "$ref": "#/components/schemas/ApiError"
3558
+ }
3559
+ }
3560
+ }
3561
+ },
3562
+ "5XX": {
3563
+ "description": "Error envelope",
3564
+ "content": {
3565
+ "application/json": {
3566
+ "schema": {
3567
+ "$ref": "#/components/schemas/ApiError"
3568
+ }
3569
+ }
3570
+ }
3571
+ }
3572
+ }
3573
+ }
3574
+ },
3575
+ "/api/organizations/{workspaceId}/lead/session-sends": {
3576
+ "post": {
3577
+ "operationId": "workspacesLeadSessionSend",
3578
+ "summary": "Send a message into one of your member’s Chat Sessions as Kosuke, from the Lead, with an optional /kosuke:ship or /kosuke:sync-branch. Only the Lead calls it. In an Event Turn it names a fact of its batch about that session. One send per session per Turn, and at most 3 in a row with nothing new from a person or GitHub; a refusal comes back with its reason.",
3579
+ "tags": ["workspaces"],
3580
+ "x-kosuke-command": ["workspaces", "lead-session-send"],
3581
+ "x-kosuke-lead-token": true,
3582
+ "parameters": [
3583
+ {
3584
+ "name": "workspaceId",
3585
+ "in": "path",
3586
+ "required": true,
3587
+ "schema": {
3588
+ "type": "string",
3589
+ "minLength": 1
3590
+ }
3591
+ }
3592
+ ],
3593
+ "requestBody": {
3594
+ "required": true,
3595
+ "content": {
3596
+ "application/json": {
3597
+ "schema": {
3598
+ "type": "object",
3599
+ "properties": {
3600
+ "sessionId": {
3601
+ "type": "string",
3602
+ "format": "uuid",
3603
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
3604
+ "description": "The Chat Session to send into. Its Assignee is your member."
3605
+ },
3606
+ "factId": {
3607
+ "description": "The Lead Fact the send answers. Required in an Event Turn: one of its batch, about this session.",
3608
+ "type": "string",
3609
+ "format": "uuid",
3610
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3611
+ },
3612
+ "content": {
3613
+ "type": "string",
3614
+ "minLength": 1,
3615
+ "maxLength": 20000,
3616
+ "description": "The message, in your own words, written from the facts."
3617
+ },
3618
+ "skill": {
3619
+ "description": "A Kosuke skill the message runs: /kosuke:ship or /kosuke:sync-branch.",
3620
+ "anyOf": [
3621
+ {
3622
+ "type": "string",
3623
+ "enum": ["ship", "sync-branch"]
3624
+ },
3625
+ {
3626
+ "type": "null"
3627
+ }
3628
+ ]
3629
+ }
3630
+ },
3631
+ "required": ["sessionId", "content"]
3632
+ }
3633
+ }
3634
+ }
3635
+ },
3636
+ "responses": {
3637
+ "2XX": {
3638
+ "description": "Success envelope",
3639
+ "content": {
3640
+ "application/json": {
3641
+ "schema": {
3642
+ "$ref": "#/components/schemas/ApiSuccess"
3643
+ }
3644
+ }
3645
+ }
3646
+ },
3647
+ "4XX": {
3648
+ "description": "Error envelope",
3649
+ "content": {
3650
+ "application/json": {
3651
+ "schema": {
3652
+ "$ref": "#/components/schemas/ApiError"
3653
+ }
3654
+ }
3655
+ }
3656
+ },
3657
+ "5XX": {
3658
+ "description": "Error envelope",
3659
+ "content": {
3660
+ "application/json": {
3661
+ "schema": {
3662
+ "$ref": "#/components/schemas/ApiError"
3663
+ }
3664
+ }
3665
+ }
3666
+ }
3667
+ }
3668
+ }
3669
+ },
3487
3670
  "/api/organizations/{workspaceId}/lead/triage": {
3488
3671
  "post": {
3489
3672
  "operationId": "workspacesLeadTriage",
3490
- "summary": "Write the triage of your own open Lead Cards in a workspace: their order, one line of why per card, who reviews a ready pull request, one notification, and the Welcome back sentence. Answers what was ranked, whether the notification went out, and every part it refused with the reason.",
3673
+ "summary": "Write your own Lead Cards in a workspace: open, update and close them from the Lead Facts you received, put them in order, one line of why per card, one notification, and the Welcome back sentence. Answers the cards opened and closed, what was ranked, whether the notification went out, and every part it refused with the reason. Pass the body whole with --body or --body-file.",
3491
3674
  "tags": ["workspaces"],
3492
3675
  "x-kosuke-command": ["workspaces", "lead-triage"],
3493
3676
  "x-kosuke-sandbox-token": true,
@@ -3512,19 +3695,307 @@
3512
3695
  "schema": {
3513
3696
  "type": "object",
3514
3697
  "properties": {
3515
- "rank": {
3516
- "description": "Open card ids, most urgent first. Cards left out keep their place behind these. A JSON array.",
3517
- "maxItems": 200,
3698
+ "open": {
3699
+ "description": "Cards to open, or to update when you already have one open on that session with that key. Each names the facts it is basedOn, all yours and about its session, none older than the member's last answer. At most 4 parts and 6 actions. A JSON array.",
3700
+ "maxItems": 20,
3518
3701
  "type": "array",
3519
3702
  "items": {
3520
- "type": "string",
3521
- "format": "uuid",
3522
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3703
+ "type": "object",
3704
+ "properties": {
3705
+ "sessionId": {
3706
+ "type": "string",
3707
+ "format": "uuid",
3708
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3709
+ },
3710
+ "key": {
3711
+ "type": "string",
3712
+ "minLength": 1,
3713
+ "maxLength": 48,
3714
+ "pattern": "^[a-z0-9_:-]+$",
3715
+ "description": "The card's subject on its session, such as review or merge. The same key updates it."
3716
+ },
3717
+ "basedOn": {
3718
+ "minItems": 1,
3719
+ "maxItems": 50,
3720
+ "type": "array",
3721
+ "items": {
3722
+ "type": "string",
3723
+ "format": "uuid",
3724
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3725
+ },
3726
+ "description": "The ids of the Lead Facts the card is written from, about its session."
3727
+ },
3728
+ "title": {
3729
+ "type": "string",
3730
+ "minLength": 1,
3731
+ "maxLength": 120
3732
+ },
3733
+ "body": {
3734
+ "anyOf": [
3735
+ {
3736
+ "type": "string",
3737
+ "maxLength": 600
3738
+ },
3739
+ {
3740
+ "type": "null"
3741
+ }
3742
+ ]
3743
+ },
3744
+ "parts": {
3745
+ "maxItems": 4,
3746
+ "type": "array",
3747
+ "items": {
3748
+ "oneOf": [
3749
+ {
3750
+ "type": "object",
3751
+ "properties": {
3752
+ "type": {
3753
+ "type": "string",
3754
+ "const": "artifact"
3755
+ },
3756
+ "slug": {
3757
+ "type": "string",
3758
+ "minLength": 1,
3759
+ "maxLength": 200,
3760
+ "description": "An Artifact slug of the session."
3761
+ }
3762
+ },
3763
+ "required": ["type", "slug"]
3764
+ },
3765
+ {
3766
+ "type": "object",
3767
+ "properties": {
3768
+ "type": {
3769
+ "type": "string",
3770
+ "const": "qa_report"
3771
+ },
3772
+ "sections": {
3773
+ "minItems": 1,
3774
+ "maxItems": 40,
3775
+ "type": "array",
3776
+ "items": {
3777
+ "type": "object",
3778
+ "properties": {
3779
+ "title": {
3780
+ "type": "string",
3781
+ "minLength": 1,
3782
+ "maxLength": 200
3783
+ },
3784
+ "passed": {
3785
+ "type": "integer",
3786
+ "minimum": 0,
3787
+ "maximum": 9007199254740991
3788
+ },
3789
+ "total": {
3790
+ "type": "integer",
3791
+ "minimum": 0,
3792
+ "maximum": 9007199254740991
3793
+ },
3794
+ "note": {
3795
+ "type": "string",
3796
+ "maxLength": 300
3797
+ }
3798
+ },
3799
+ "required": ["title", "passed", "total"]
3800
+ }
3801
+ }
3802
+ },
3803
+ "required": ["type", "sections"]
3804
+ },
3805
+ {
3806
+ "type": "object",
3807
+ "properties": {
3808
+ "type": {
3809
+ "type": "string",
3810
+ "const": "clarification"
3811
+ }
3812
+ },
3813
+ "required": ["type"]
3814
+ },
3815
+ {
3816
+ "type": "object",
3817
+ "properties": {
3818
+ "type": {
3819
+ "type": "string",
3820
+ "const": "reviewers"
3821
+ },
3822
+ "reviewers": {
3823
+ "minItems": 1,
3824
+ "maxItems": 15,
3825
+ "type": "array",
3826
+ "items": {
3827
+ "type": "object",
3828
+ "properties": {
3829
+ "id": {
3830
+ "type": "string",
3831
+ "minLength": 1,
3832
+ "description": "A member id from the candidates list."
3833
+ },
3834
+ "why": {
3835
+ "type": "string",
3836
+ "minLength": 1,
3837
+ "maxLength": 300
3838
+ }
3839
+ },
3840
+ "required": ["id", "why"]
3841
+ }
3842
+ }
3843
+ },
3844
+ "required": ["type", "reviewers"]
3845
+ }
3846
+ ]
3847
+ }
3848
+ },
3849
+ "actions": {
3850
+ "maxItems": 6,
3851
+ "type": "array",
3852
+ "items": {
3853
+ "oneOf": [
3854
+ {
3855
+ "type": "object",
3856
+ "properties": {
3857
+ "type": {
3858
+ "type": "string",
3859
+ "const": "send"
3860
+ },
3861
+ "label": {
3862
+ "type": "string",
3863
+ "minLength": 1,
3864
+ "maxLength": 40
3865
+ },
3866
+ "text": {
3867
+ "type": "string",
3868
+ "minLength": 1,
3869
+ "maxLength": 4000
3870
+ },
3871
+ "skill": {
3872
+ "default": null,
3873
+ "anyOf": [
3874
+ {
3875
+ "type": "string",
3876
+ "enum": ["ship"]
3877
+ },
3878
+ {
3879
+ "type": "null"
3880
+ }
3881
+ ]
3882
+ },
3883
+ "editable": {
3884
+ "default": false,
3885
+ "type": "boolean"
3886
+ }
3887
+ },
3888
+ "required": ["type", "label", "text"]
3889
+ },
3890
+ {
3891
+ "type": "object",
3892
+ "properties": {
3893
+ "type": {
3894
+ "type": "string",
3895
+ "const": "change"
3896
+ },
3897
+ "label": {
3898
+ "type": "string",
3899
+ "minLength": 1,
3900
+ "maxLength": 40
3901
+ }
3902
+ },
3903
+ "required": ["type", "label"]
3904
+ },
3905
+ {
3906
+ "type": "object",
3907
+ "properties": {
3908
+ "type": {
3909
+ "type": "string",
3910
+ "const": "ask"
3911
+ },
3912
+ "label": {
3913
+ "type": "string",
3914
+ "minLength": 1,
3915
+ "maxLength": 40
3916
+ }
3917
+ },
3918
+ "required": ["type", "label"]
3919
+ },
3920
+ {
3921
+ "type": "object",
3922
+ "properties": {
3923
+ "type": {
3924
+ "type": "string",
3925
+ "const": "approve"
3926
+ },
3927
+ "label": {
3928
+ "type": "string",
3929
+ "minLength": 1,
3930
+ "maxLength": 40
3931
+ }
3932
+ },
3933
+ "required": ["type", "label"]
3934
+ },
3935
+ {
3936
+ "type": "object",
3937
+ "properties": {
3938
+ "type": {
3939
+ "type": "string",
3940
+ "const": "merge"
3941
+ },
3942
+ "label": {
3943
+ "type": "string",
3944
+ "minLength": 1,
3945
+ "maxLength": 40
3946
+ }
3947
+ },
3948
+ "required": ["type", "label"]
3949
+ },
3950
+ {
3951
+ "type": "object",
3952
+ "properties": {
3953
+ "type": {
3954
+ "type": "string",
3955
+ "const": "accept"
3956
+ },
3957
+ "label": {
3958
+ "type": "string",
3959
+ "minLength": 1,
3960
+ "maxLength": 40
3961
+ }
3962
+ },
3963
+ "required": ["type", "label"]
3964
+ },
3965
+ {
3966
+ "type": "object",
3967
+ "properties": {
3968
+ "type": {
3969
+ "type": "string",
3970
+ "const": "open"
3971
+ },
3972
+ "label": {
3973
+ "type": "string",
3974
+ "minLength": 1,
3975
+ "maxLength": 40
3976
+ }
3977
+ },
3978
+ "required": ["type", "label"]
3979
+ }
3980
+ ]
3981
+ }
3982
+ },
3983
+ "waits": {
3984
+ "type": "string",
3985
+ "enum": ["teammate", "own_build", "nobody"]
3986
+ },
3987
+ "why": {
3988
+ "type": "string",
3989
+ "minLength": 1,
3990
+ "maxLength": 300
3991
+ }
3992
+ },
3993
+ "required": ["sessionId", "key", "basedOn", "title", "actions", "waits"]
3523
3994
  }
3524
3995
  },
3525
- "whys": {
3526
- "description": "One line of why per card, kept to 300 characters. A JSON array.",
3527
- "maxItems": 200,
3996
+ "close": {
3997
+ "description": "Cards to resolve, each at the revision you read, with the facts it is basedOn and one line of reason. A JSON array.",
3998
+ "maxItems": 20,
3528
3999
  "type": "array",
3529
4000
  "items": {
3530
4001
  "type": "object",
@@ -3534,18 +4005,44 @@
3534
4005
  "format": "uuid",
3535
4006
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3536
4007
  },
3537
- "why": {
4008
+ "revision": {
4009
+ "type": "integer",
4010
+ "minimum": 1,
4011
+ "maximum": 9007199254740991
4012
+ },
4013
+ "basedOn": {
4014
+ "minItems": 1,
4015
+ "maxItems": 50,
4016
+ "type": "array",
4017
+ "items": {
4018
+ "type": "string",
4019
+ "format": "uuid",
4020
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
4021
+ },
4022
+ "description": "The ids of the Lead Facts the card is written from, about its session."
4023
+ },
4024
+ "reason": {
3538
4025
  "type": "string",
3539
4026
  "minLength": 1,
3540
- "maxLength": 1000
4027
+ "maxLength": 300
3541
4028
  }
3542
4029
  },
3543
- "required": ["cardId", "why"]
4030
+ "required": ["cardId", "revision", "basedOn", "reason"]
3544
4031
  }
3545
4032
  },
3546
- "picks": {
3547
- "description": "Who reviews the pull request of a To approve card: every candidate but its author, at most 15. A JSON array.",
3548
- "maxItems": 50,
4033
+ "rank": {
4034
+ "description": "Open card ids, most urgent first. Cards left out keep their place behind these. A JSON array.",
4035
+ "maxItems": 200,
4036
+ "type": "array",
4037
+ "items": {
4038
+ "type": "string",
4039
+ "format": "uuid",
4040
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
4041
+ }
4042
+ },
4043
+ "whys": {
4044
+ "description": "One line of why per card, kept to 300 characters. A JSON array.",
4045
+ "maxItems": 200,
3549
4046
  "type": "array",
3550
4047
  "items": {
3551
4048
  "type": "object",
@@ -3555,32 +4052,17 @@
3555
4052
  "format": "uuid",
3556
4053
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3557
4054
  },
3558
- "reviewers": {
3559
- "maxItems": 15,
3560
- "type": "array",
3561
- "items": {
3562
- "type": "object",
3563
- "properties": {
3564
- "id": {
3565
- "type": "string",
3566
- "minLength": 1,
3567
- "description": "A member id from the candidates list."
3568
- },
3569
- "why": {
3570
- "type": "string",
3571
- "minLength": 1,
3572
- "maxLength": 300
3573
- }
3574
- },
3575
- "required": ["id", "why"]
3576
- }
4055
+ "why": {
4056
+ "type": "string",
4057
+ "minLength": 1,
4058
+ "maxLength": 1000
3577
4059
  }
3578
4060
  },
3579
- "required": ["cardId"]
4061
+ "required": ["cardId", "why"]
3580
4062
  }
3581
4063
  },
3582
4064
  "notify": {
3583
- "description": "One notification for one card. Refused while the Lead is on screen. A JSON object.",
4065
+ "description": "One notification for one open card: once per card, never for a skipped card, refused while the Lead is on screen. A JSON object.",
3584
4066
  "type": "object",
3585
4067
  "properties": {
3586
4068
  "cardId": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kosuke-ai/cli",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "Kosuke platform CLI. The client customers install to drive app.kosuke.ai from their own machine.",
5
5
  "license": "MIT",
6
6
  "repository": {