@motir/cli 0.2.0 → 0.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.
Files changed (3) hide show
  1. package/README.md +4 -4
  2. package/dist/index.js +85 -77
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -4,7 +4,7 @@ Terminal dispatch of the Motir work loop. The CLI is a client of **Motir's
4
4
  public REST API** (`/api/v1`): every command is an ordinary HTTPS request
5
5
  carrying a personal access token (PAT) as its bearer. There is no private
6
6
  channel — the CLI uses the same documented endpoints, the same credential and
7
- the same scopes any third-party integration gets, and if it needs a capability
7
+ the same permissions any third-party integration gets, and if it needs a capability
8
8
  that capability lands on `/api/v1` first, where everyone can reach it.
9
9
 
10
10
  That is the point rather than an implementation detail: nothing this tool does
@@ -68,8 +68,8 @@ construction** — the code and URL are printed whether or not a browser opens,
68
68
  an SSH session or a container uses the same command; `--no-browser` skips the
69
69
  launch attempt outright.
70
70
 
71
- The approval mints a CLI-scoped PAT: scopes `read`, `work_items:write`,
72
- `integration` (fixed — the grant can neither widen nor narrow them), 90-day
71
+ The approval mints a CLI-scoped PAT: permissions `project:browse`, `work_item:edit`,
72
+ `comment:add`, `ai:plan` (fixed — the grant can neither widen nor narrow them), 90-day
73
73
  expiry, labelled `CLI · <hostname>`. It lands in `~/.config/motir/config.json`,
74
74
  `chmod 600`, keyed by server URL.
75
75
 
@@ -85,7 +85,7 @@ There are three credential tiers, and `motir login` is the middle one:
85
85
  there is no `.motir.json` to walk up to) and outranks a stored credential.
86
86
 
87
87
  **Disconnecting** is two different things: `motir logout` forgets the local copy
88
- on this machine, while **revoking the token in Settings → Account → API tokens**
88
+ on this machine, while **revoking the token in Settings → Account → Tokens**
89
89
  is the server-side kill switch. Full guide: [`docs/cli.md` §
90
90
  Authenticate](../../docs/cli.md#authenticate).
91
91
 
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ var __export = (target, all) => {
9
9
  import { Command as Command2 } from "commander";
10
10
 
11
11
  // src/version.ts
12
- var CLI_VERSION = "0.2.0";
12
+ var CLI_VERSION = "0.3.0";
13
13
 
14
14
  // src/commandCatalog.ts
15
15
  var HELP_GROUP = {
@@ -112,7 +112,7 @@ var COMMAND_CATALOG = [
112
112
  },
113
113
  {
114
114
  flags: "--project <key>",
115
- description: "Project key, e.g. PROD. Omit it and the workspace\u2019s only project is used."
115
+ description: "Project key, e.g. ACME. Omit it and the workspace\u2019s only project is used."
116
116
  },
117
117
  {
118
118
  flags: "--repo <name>",
@@ -201,7 +201,7 @@ var COMMAND_CATALOG = [
201
201
  {
202
202
  path: "show",
203
203
  signature: "<key>",
204
- description: "Read one work item (e.g. PROD-7): fields, readiness, children, edges, body.",
204
+ description: "Read one work item (e.g. ACME-7): fields, readiness, children, edges, body.",
205
205
  helpGroup: HELP_GROUP.read,
206
206
  options: [
207
207
  {
@@ -237,7 +237,7 @@ var COMMAND_CATALOG = [
237
237
  {
238
238
  path: "open",
239
239
  signature: "<key>",
240
- description: "Open a work item (e.g. PROD-7) in the browser; prints the URL.",
240
+ description: "Open a work item (e.g. ACME-7) in the browser; prints the URL.",
241
241
  helpGroup: HELP_GROUP.read,
242
242
  options: [
243
243
  {
@@ -273,7 +273,7 @@ var COMMAND_CATALOG = [
273
273
  {
274
274
  path: "run",
275
275
  signature: "<key>",
276
- description: "Dispatch a SPECIFIC work item (e.g. PROD-7), ready or forced.",
276
+ description: "Dispatch a SPECIFIC work item (e.g. ACME-7), ready or forced.",
277
277
  helpGroup: HELP_GROUP.workLoop,
278
278
  options: [
279
279
  {
@@ -493,280 +493,280 @@ var V1_OPERATIONS = {
493
493
  "appendPlanTurn": {
494
494
  method: "POST",
495
495
  path: "/api/v1/projects/{projectKey}/plan-session/turns",
496
- scope: "work_items:write",
496
+ permission: "ai:plan",
497
497
  successStatus: 200,
498
498
  responseComponent: "PlanSession"
499
499
  },
500
500
  "archiveWorkItem": {
501
501
  method: "POST",
502
502
  path: "/api/v1/work-items/{key}/archive",
503
- scope: "work_items:archive",
503
+ permission: "work_item:delete",
504
504
  successStatus: 200,
505
505
  responseComponent: "WorkItemDetail"
506
506
  },
507
507
  "completeSession": {
508
508
  method: "POST",
509
509
  path: "/api/v1/sessions/complete",
510
- scope: "integration",
510
+ permission: "work_item:edit",
511
511
  successStatus: 200,
512
512
  responseComponent: "SessionCloseOut"
513
513
  },
514
514
  "completeSprint": {
515
515
  method: "POST",
516
516
  path: "/api/v1/sprints/{sprintId}/complete",
517
- scope: "sprints:write",
517
+ permission: "sprint:manage",
518
518
  successStatus: 200,
519
519
  responseComponent: "Sprint"
520
520
  },
521
521
  "countProjectWorkItems": {
522
522
  method: "GET",
523
523
  path: "/api/v1/projects/{projectKey}/work-items/count",
524
- scope: "read",
524
+ permission: "project:browse",
525
525
  successStatus: 200,
526
526
  responseComponent: "WorkItemCount"
527
527
  },
528
528
  "createSprint": {
529
529
  method: "POST",
530
530
  path: "/api/v1/projects/{projectKey}/sprints",
531
- scope: "sprints:write",
531
+ permission: "sprint:manage",
532
532
  successStatus: 201,
533
533
  responseComponent: "Sprint"
534
534
  },
535
535
  "createWorkItem": {
536
536
  method: "POST",
537
537
  path: "/api/v1/projects/{projectKey}/work-items",
538
- scope: "work_items:write",
538
+ permission: "work_item:edit",
539
539
  successStatus: 201,
540
540
  responseComponent: "WorkItemDetail"
541
541
  },
542
542
  "createWorkItemComment": {
543
543
  method: "POST",
544
544
  path: "/api/v1/work-items/{key}/comments",
545
- scope: "work_items:write",
545
+ permission: "comment:add",
546
546
  successStatus: 201,
547
547
  responseComponent: void 0
548
548
  },
549
549
  "createWorkItemLink": {
550
550
  method: "POST",
551
551
  path: "/api/v1/work-items/{key}/links",
552
- scope: "work_items:write",
552
+ permission: "work_item:edit",
553
553
  successStatus: 201,
554
554
  responseComponent: void 0
555
555
  },
556
556
  "deleteWorkItemLink": {
557
557
  method: "DELETE",
558
558
  path: "/api/v1/work-items/{key}/links",
559
- scope: "work_items:write",
559
+ permission: "work_item:edit",
560
560
  successStatus: 204,
561
561
  responseComponent: void 0
562
562
  },
563
563
  "getMe": {
564
564
  method: "GET",
565
565
  path: "/api/v1/me",
566
- scope: "read",
566
+ permission: "project:browse",
567
567
  successStatus: 200,
568
568
  responseComponent: "Me"
569
569
  },
570
570
  "getPlan": {
571
571
  method: "GET",
572
572
  path: "/api/v1/plans/{planId}",
573
- scope: "read",
573
+ permission: "project:browse",
574
574
  successStatus: 200,
575
575
  responseComponent: "Plan"
576
576
  },
577
577
  "getPlanStatus": {
578
578
  method: "GET",
579
579
  path: "/api/v1/plans/{planId}/status",
580
- scope: "read",
580
+ permission: "project:browse",
581
581
  successStatus: 200,
582
582
  responseComponent: "PlanOutcome"
583
583
  },
584
584
  "getProject": {
585
585
  method: "GET",
586
586
  path: "/api/v1/projects/{projectKey}",
587
- scope: "read",
587
+ permission: "project:browse",
588
588
  successStatus: 200,
589
589
  responseComponent: "Project"
590
590
  },
591
591
  "getProjectBacklog": {
592
592
  method: "GET",
593
593
  path: "/api/v1/projects/{projectKey}/backlog",
594
- scope: "read",
594
+ permission: "project:browse",
595
595
  successStatus: 200,
596
596
  responseComponent: void 0
597
597
  },
598
598
  "getProjectReadySet": {
599
599
  method: "GET",
600
600
  path: "/api/v1/projects/{projectKey}/ready",
601
- scope: "read",
601
+ permission: "project:browse",
602
602
  successStatus: 200,
603
603
  responseComponent: void 0
604
604
  },
605
605
  "getSprint": {
606
606
  method: "GET",
607
607
  path: "/api/v1/sprints/{sprintId}",
608
- scope: "read",
608
+ permission: "project:browse",
609
609
  successStatus: 200,
610
610
  responseComponent: "Sprint"
611
611
  },
612
612
  "getWorkItem": {
613
613
  method: "GET",
614
614
  path: "/api/v1/work-items/{key}",
615
- scope: "read",
615
+ permission: "project:browse",
616
616
  successStatus: 200,
617
617
  responseComponent: "WorkItemDetail"
618
618
  },
619
619
  "getWorkItemActivity": {
620
620
  method: "GET",
621
621
  path: "/api/v1/work-items/{key}/activity",
622
- scope: "read",
622
+ permission: "project:browse",
623
623
  successStatus: 200,
624
624
  responseComponent: void 0
625
625
  },
626
626
  "getWorkItemDispatchPrompt": {
627
627
  method: "GET",
628
628
  path: "/api/v1/work-items/{key}/dispatch-prompt",
629
- scope: "read",
629
+ permission: "project:browse",
630
630
  successStatus: 200,
631
631
  responseComponent: "DispatchPrompt"
632
632
  },
633
633
  "listProjects": {
634
634
  method: "GET",
635
635
  path: "/api/v1/projects",
636
- scope: "read",
636
+ permission: "project:browse",
637
637
  successStatus: 200,
638
638
  responseComponent: void 0
639
639
  },
640
640
  "listProjectSprints": {
641
641
  method: "GET",
642
642
  path: "/api/v1/projects/{projectKey}/sprints",
643
- scope: "read",
643
+ permission: "project:browse",
644
644
  successStatus: 200,
645
645
  responseComponent: void 0
646
646
  },
647
647
  "listProjectWorkItems": {
648
648
  method: "GET",
649
649
  path: "/api/v1/projects/{projectKey}/work-items",
650
- scope: "read",
650
+ permission: "project:browse",
651
651
  successStatus: 200,
652
652
  responseComponent: void 0
653
653
  },
654
654
  "listSprintWorkItems": {
655
655
  method: "GET",
656
656
  path: "/api/v1/sprints/{sprintId}/work-items",
657
- scope: "read",
657
+ permission: "project:browse",
658
658
  successStatus: 200,
659
659
  responseComponent: void 0
660
660
  },
661
661
  "listWorkItemComments": {
662
662
  method: "GET",
663
663
  path: "/api/v1/work-items/{key}/comments",
664
- scope: "read",
664
+ permission: "project:browse",
665
665
  successStatus: 200,
666
666
  responseComponent: void 0
667
667
  },
668
668
  "listWorkItemLinks": {
669
669
  method: "GET",
670
670
  path: "/api/v1/work-items/{key}/links",
671
- scope: "read",
671
+ permission: "project:browse",
672
672
  successStatus: 200,
673
673
  responseComponent: "WorkItemLinkGroups"
674
674
  },
675
675
  "listWorkItemTransitions": {
676
676
  method: "GET",
677
677
  path: "/api/v1/work-items/{key}/transitions",
678
- scope: "read",
678
+ permission: "project:browse",
679
679
  successStatus: 200,
680
680
  responseComponent: "TransitionList"
681
681
  },
682
682
  "listWorkspaces": {
683
683
  method: "GET",
684
684
  path: "/api/v1/workspaces",
685
- scope: "read",
685
+ permission: "project:browse",
686
686
  successStatus: 200,
687
687
  responseComponent: void 0
688
688
  },
689
689
  "moveWorkItemsToBacklog": {
690
690
  method: "POST",
691
691
  path: "/api/v1/projects/{projectKey}/backlog/work-items",
692
- scope: "sprints:write",
692
+ permission: "sprint:manage",
693
693
  successStatus: 200,
694
694
  responseComponent: "MembershipMoveResult"
695
695
  },
696
696
  "moveWorkItemsToSprint": {
697
697
  method: "POST",
698
698
  path: "/api/v1/sprints/{sprintId}/work-items",
699
- scope: "sprints:write",
699
+ permission: "sprint:manage",
700
700
  successStatus: 200,
701
701
  responseComponent: "MembershipMoveResult"
702
702
  },
703
703
  "openPlanSession": {
704
704
  method: "POST",
705
705
  path: "/api/v1/projects/{projectKey}/plan-session",
706
- scope: "read",
706
+ permission: "ai:plan",
707
707
  successStatus: 200,
708
708
  responseComponent: "PlanSession"
709
709
  },
710
710
  "recordWorkItemIntegration": {
711
711
  method: "POST",
712
712
  path: "/api/v1/work-items/{key}/integration",
713
- scope: "integration",
713
+ permission: "work_item:edit",
714
714
  successStatus: 200,
715
715
  responseComponent: "IntegrationResult"
716
716
  },
717
717
  "reportWorkItemImplementation": {
718
718
  method: "POST",
719
719
  path: "/api/v1/work-items/{key}/implementation",
720
- scope: "integration",
720
+ permission: "work_item:edit",
721
721
  successStatus: 200,
722
722
  responseComponent: void 0
723
723
  },
724
724
  "restoreWorkItem": {
725
725
  method: "POST",
726
726
  path: "/api/v1/work-items/{key}/restore",
727
- scope: "work_items:archive",
727
+ permission: "work_item:delete",
728
728
  successStatus: 200,
729
729
  responseComponent: "WorkItemDetail"
730
730
  },
731
731
  "startSprint": {
732
732
  method: "POST",
733
733
  path: "/api/v1/sprints/{sprintId}/start",
734
- scope: "sprints:write",
734
+ permission: "sprint:manage",
735
735
  successStatus: 200,
736
736
  responseComponent: "Sprint"
737
737
  },
738
738
  "submitPlanSession": {
739
739
  method: "POST",
740
740
  path: "/api/v1/projects/{projectKey}/plan-session/submissions",
741
- scope: "work_items:write",
741
+ permission: "ai:plan",
742
742
  successStatus: 202,
743
743
  responseComponent: "PlanJobHandle"
744
744
  },
745
745
  "submitWorkItemExpansion": {
746
746
  method: "POST",
747
747
  path: "/api/v1/work-items/{key}/expansions",
748
- scope: "work_items:write",
748
+ permission: "ai:plan",
749
749
  successStatus: 202,
750
750
  responseComponent: "PlanJobHandle"
751
751
  },
752
752
  "transitionWorkItem": {
753
753
  method: "POST",
754
754
  path: "/api/v1/work-items/{key}/transitions",
755
- scope: "work_items:write",
755
+ permission: "work_item:edit",
756
756
  successStatus: 200,
757
757
  responseComponent: "WorkItemDetail"
758
758
  },
759
759
  "updateSprint": {
760
760
  method: "PATCH",
761
761
  path: "/api/v1/sprints/{sprintId}",
762
- scope: "sprints:write",
762
+ permission: "sprint:manage",
763
763
  successStatus: 200,
764
764
  responseComponent: "Sprint"
765
765
  },
766
766
  "updateWorkItem": {
767
767
  method: "PATCH",
768
768
  path: "/api/v1/work-items/{key}",
769
- scope: "work_items:write",
769
+ permission: "work_item:edit",
770
770
  successStatus: 200,
771
771
  responseComponent: "WorkItemDetail"
772
772
  }
@@ -1369,7 +1369,7 @@ function validate20(data, { instancePath = "", parentData, parentDataProperty, r
1369
1369
  }
1370
1370
  validate20.evaluated = { "props": true, "dynamicProps": false, "dynamicItems": false };
1371
1371
  var operation_archiveWorkItem = validate21;
1372
- var schema34 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "research", "review", "decision", "deploy", "manual", "chore"] }, { "type": "null" }] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "reporterId": { "type": "string" }, "dueDate": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updatedAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "descriptionMd": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "ancestorKeys": { "type": "array", "items": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" } }, "children": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived", "dependencies"], "additionalProperties": false } }, "links": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "relatesTo": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "duplicates": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "clones": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks", "relatesTo", "duplicates", "clones"], "additionalProperties": false }, "readiness": { "type": "object", "properties": { "ready": { "type": "boolean" }, "openBlockers": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "blockedByAncestorKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "blockedByAncestorTitle": { "anyOf": [{ "type": "string" }, { "type": "null" }] } }, "required": ["ready", "openBlockers", "blockedByAncestorKey", "blockedByAncestorTitle"], "additionalProperties": false }, "labels": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "components": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "commentCount": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "sprintId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "targetRepo": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "executor": { "anyOf": [{ "type": "string", "enum": ["coding_agent", "human"] }, { "type": "null" }] }, "planningSource": { "anyOf": [{ "type": "string", "enum": ["native", "mcp", "manual", "api"] }, { "type": "null" }] }, "planningHarness": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "planningModel": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "implementationSource": { "anyOf": [{ "type": "string", "enum": ["hosted", "byok", "manual"] }, { "type": "null" }] }, "implementationHarness": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "implementationModel": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "archivedAt": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] } }, "required": ["key", "kind", "type", "title", "status", "priority", "assigneeId", "reporterId", "dueDate", "estimateMinutes", "storyPoints", "createdAt", "updatedAt", "descriptionMd", "parentKey", "ancestorKeys", "children", "links", "readiness", "labels", "components", "commentCount", "sprintId", "targetRepo", "executor", "planningSource", "planningHarness", "planningModel", "implementationSource", "implementationHarness", "implementationModel", "archivedAt"], "additionalProperties": false, "$id": "motir://v1/components/WorkItemDetail" };
1372
+ var schema34 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "copy", "translate", "research", "review", "verification", "decision", "deploy", "manual", "legal", "chore"] }, { "type": "null" }] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "reporterId": { "type": "string" }, "dueDate": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updatedAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "descriptionMd": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "ancestorKeys": { "type": "array", "items": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" } }, "children": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived", "dependencies"], "additionalProperties": false } }, "links": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "relatesTo": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "duplicates": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "clones": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks", "relatesTo", "duplicates", "clones"], "additionalProperties": false }, "readiness": { "type": "object", "properties": { "ready": { "type": "boolean" }, "openBlockers": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "parentKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "archived": { "type": "boolean" } }, "required": ["key", "kind", "title", "status", "priority", "assigneeId", "estimateMinutes", "storyPoints", "parentKey", "archived"], "additionalProperties": false } }, "blockedByAncestorKey": { "anyOf": [{ "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, { "type": "null" }] }, "blockedByAncestorTitle": { "anyOf": [{ "type": "string" }, { "type": "null" }] } }, "required": ["ready", "openBlockers", "blockedByAncestorKey", "blockedByAncestorTitle"], "additionalProperties": false }, "labels": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "components": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } }, "required": ["name"], "additionalProperties": false } }, "commentCount": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "sprintId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "targetRepo": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "executor": { "anyOf": [{ "type": "string", "enum": ["coding_agent", "human"] }, { "type": "null" }] }, "planningSource": { "anyOf": [{ "type": "string", "enum": ["native", "mcp", "manual", "api"] }, { "type": "null" }] }, "planningHarness": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "planningModel": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "implementationSource": { "anyOf": [{ "type": "string", "enum": ["hosted", "byok", "manual"] }, { "type": "null" }] }, "implementationHarness": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "implementationModel": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "archivedAt": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] } }, "required": ["key", "kind", "type", "title", "status", "priority", "assigneeId", "reporterId", "dueDate", "estimateMinutes", "storyPoints", "createdAt", "updatedAt", "descriptionMd", "parentKey", "ancestorKeys", "children", "links", "readiness", "labels", "components", "commentCount", "sprintId", "targetRepo", "executor", "planningSource", "planningHarness", "planningModel", "implementationSource", "implementationHarness", "implementationModel", "archivedAt"], "additionalProperties": false, "$id": "motir://v1/components/WorkItemDetail" };
1373
1373
  var pattern6 = new RegExp("^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", "u");
1374
1374
  function validate21(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
1375
1375
  ;
@@ -1449,7 +1449,7 @@ function validate21(data, { instancePath = "", parentData, parentDataProperty, r
1449
1449
  }
1450
1450
  errors++;
1451
1451
  }
1452
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
1452
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
1453
1453
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
1454
1454
  if (vErrors === null) {
1455
1455
  vErrors = [err1];
@@ -7239,7 +7239,7 @@ function validate26(data, { instancePath = "", parentData, parentDataProperty, r
7239
7239
  }
7240
7240
  errors++;
7241
7241
  }
7242
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
7242
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
7243
7243
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
7244
7244
  if (vErrors === null) {
7245
7245
  vErrors = [err1];
@@ -12082,13 +12082,13 @@ function validate29(data, { instancePath = "", parentData, parentDataProperty, r
12082
12082
  if (errors === _errs0) {
12083
12083
  if (data && typeof data == "object" && !Array.isArray(data)) {
12084
12084
  let missing0;
12085
- if (data.user === void 0 && (missing0 = "user") || data.workspaceId === void 0 && (missing0 = "workspaceId") || data.scopes === void 0 && (missing0 = "scopes")) {
12085
+ if (data.user === void 0 && (missing0 = "user") || data.workspaceId === void 0 && (missing0 = "workspaceId") || data.permissions === void 0 && (missing0 = "permissions")) {
12086
12086
  validate29.errors = [{ instancePath, schemaPath: "motir://v1/components/Me/required", keyword: "required", params: { missingProperty: missing0 }, message: "must have required property '" + missing0 + "'" }];
12087
12087
  return false;
12088
12088
  } else {
12089
12089
  const _errs2 = errors;
12090
12090
  for (const key0 in data) {
12091
- if (!(key0 === "user" || key0 === "workspaceId" || key0 === "scopes")) {
12091
+ if (!(key0 === "user" || key0 === "workspaceId" || key0 === "permissions")) {
12092
12092
  validate29.errors = [{ instancePath, schemaPath: "motir://v1/components/Me/additionalProperties", keyword: "additionalProperties", params: { additionalProperty: key0 }, message: "must NOT have additional properties" }];
12093
12093
  return false;
12094
12094
  break;
@@ -12171,8 +12171,8 @@ function validate29(data, { instancePath = "", parentData, parentDataProperty, r
12171
12171
  var valid1 = true;
12172
12172
  }
12173
12173
  if (valid1) {
12174
- if (data.scopes !== void 0) {
12175
- let data5 = data.scopes;
12174
+ if (data.permissions !== void 0) {
12175
+ let data5 = data.permissions;
12176
12176
  const _errs14 = errors;
12177
12177
  if (errors === _errs14) {
12178
12178
  if (Array.isArray(data5)) {
@@ -12181,7 +12181,7 @@ function validate29(data, { instancePath = "", parentData, parentDataProperty, r
12181
12181
  for (let i0 = 0; i0 < len0; i0++) {
12182
12182
  const _errs16 = errors;
12183
12183
  if (typeof data5[i0] !== "string") {
12184
- validate29.errors = [{ instancePath: instancePath + "/scopes/" + i0, schemaPath: "motir://v1/components/Me/properties/scopes/items/type", keyword: "type", params: { type: "string" }, message: "must be string" }];
12184
+ validate29.errors = [{ instancePath: instancePath + "/permissions/" + i0, schemaPath: "motir://v1/components/Me/properties/permissions/items/type", keyword: "type", params: { type: "string" }, message: "must be string" }];
12185
12185
  return false;
12186
12186
  }
12187
12187
  var valid3 = _errs16 === errors;
@@ -12190,7 +12190,7 @@ function validate29(data, { instancePath = "", parentData, parentDataProperty, r
12190
12190
  }
12191
12191
  }
12192
12192
  } else {
12193
- validate29.errors = [{ instancePath: instancePath + "/scopes", schemaPath: "motir://v1/components/Me/properties/scopes/type", keyword: "type", params: { type: "array" }, message: "must be array" }];
12193
+ validate29.errors = [{ instancePath: instancePath + "/permissions", schemaPath: "motir://v1/components/Me/properties/permissions/type", keyword: "type", params: { type: "array" }, message: "must be array" }];
12194
12194
  return false;
12195
12195
  }
12196
12196
  }
@@ -14644,7 +14644,7 @@ function validate33(data, { instancePath = "", parentData, parentDataProperty, r
14644
14644
  }
14645
14645
  validate33.evaluated = { "props": { "items": true, "nextCursor": true, "totalCount": true }, "dynamicProps": false, "dynamicItems": false };
14646
14646
  var operation_getProjectReadySet = validate34;
14647
- var schema60 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "status": { "type": "object", "properties": { "key": { "type": "string" }, "category": { "type": "string" } }, "required": ["key", "category"], "additionalProperties": false }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "research", "review", "decision", "deploy", "manual", "chore"] }, { "type": "null" }] }, "executor": { "anyOf": [{ "type": "string", "enum": ["coding_agent", "human"] }, { "type": "null" }] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "assignee": { "anyOf": [{ "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "required": ["id", "name"], "additionalProperties": false }, { "type": "null" }] }, "descriptionExcerpt": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "inheritedSessionBranch": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "title", "priority", "status", "type", "executor", "assigneeId", "assignee", "descriptionExcerpt", "inheritedSessionBranch", "dependencies"], "additionalProperties": false, "$id": "motir://v1/components/ReadyItem" };
14647
+ var schema60 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "title": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "status": { "type": "object", "properties": { "key": { "type": "string" }, "category": { "type": "string" } }, "required": ["key", "category"], "additionalProperties": false }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "copy", "translate", "research", "review", "verification", "decision", "deploy", "manual", "legal", "chore"] }, { "type": "null" }] }, "executor": { "anyOf": [{ "type": "string", "enum": ["coding_agent", "human"] }, { "type": "null" }] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "assignee": { "anyOf": [{ "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "required": ["id", "name"], "additionalProperties": false }, { "type": "null" }] }, "descriptionExcerpt": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "inheritedSessionBranch": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "title", "priority", "status", "type", "executor", "assigneeId", "assignee", "descriptionExcerpt", "inheritedSessionBranch", "dependencies"], "additionalProperties": false, "$id": "motir://v1/components/ReadyItem" };
14648
14648
  function validate34(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
14649
14649
  ;
14650
14650
  let vErrors = null;
@@ -14900,7 +14900,7 @@ function validate34(data, { instancePath = "", parentData, parentDataProperty, r
14900
14900
  }
14901
14901
  errors++;
14902
14902
  }
14903
- if (!(data11 === "code" || data11 === "design" || data11 === "test" || data11 === "content" || data11 === "research" || data11 === "review" || data11 === "decision" || data11 === "deploy" || data11 === "manual" || data11 === "chore")) {
14903
+ if (!(data11 === "code" || data11 === "design" || data11 === "test" || data11 === "content" || data11 === "copy" || data11 === "translate" || data11 === "research" || data11 === "review" || data11 === "verification" || data11 === "decision" || data11 === "deploy" || data11 === "manual" || data11 === "legal" || data11 === "chore")) {
14904
14904
  const err4 = { instancePath: instancePath + "/items/" + i0 + "/type", schemaPath: "motir://v1/components/ReadyItem/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema60.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
14905
14905
  if (vErrors === null) {
14906
14906
  vErrors = [err4];
@@ -16143,7 +16143,7 @@ function validate36(data, { instancePath = "", parentData, parentDataProperty, r
16143
16143
  }
16144
16144
  errors++;
16145
16145
  }
16146
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
16146
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
16147
16147
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
16148
16148
  if (vErrors === null) {
16149
16149
  vErrors = [err1];
@@ -27808,7 +27808,7 @@ function validate39(data, { instancePath = "", parentData, parentDataProperty, r
27808
27808
  }
27809
27809
  validate39.evaluated = { "props": { "items": true, "nextCursor": true }, "dynamicProps": false, "dynamicItems": false };
27810
27810
  var operation_listProjectWorkItems = validate40;
27811
- var schema75 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "research", "review", "decision", "deploy", "manual", "chore"] }, { "type": "null" }] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "reporterId": { "type": "string" }, "dueDate": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updatedAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "type", "title", "status", "priority", "assigneeId", "reporterId", "dueDate", "estimateMinutes", "storyPoints", "createdAt", "updatedAt", "dependencies"], "additionalProperties": false, "$id": "motir://v1/components/WorkItemSummary" };
27811
+ var schema75 = { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "kind": { "type": "string", "enum": ["epic", "story", "task", "subtask", "bug"] }, "type": { "anyOf": [{ "type": "string", "enum": ["code", "design", "test", "content", "copy", "translate", "research", "review", "verification", "decision", "deploy", "manual", "legal", "chore"] }, { "type": "null" }] }, "title": { "type": "string" }, "status": { "type": "string" }, "priority": { "type": "string", "enum": ["lowest", "low", "medium", "high", "highest"] }, "assigneeId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "reporterId": { "type": "string" }, "dueDate": { "anyOf": [{ "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, { "type": "null" }] }, "estimateMinutes": { "anyOf": [{ "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "null" }] }, "storyPoints": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "updatedAt": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "dependencies": { "type": "object", "properties": { "blockedBy": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } }, "blocks": { "type": "array", "items": { "type": "object", "properties": { "key": { "type": "string", "pattern": "^[A-Z][A-Z0-9]*-\\d+$" }, "title": { "type": "string" }, "status": { "type": "string" } }, "required": ["key", "title", "status"], "additionalProperties": false } } }, "required": ["blockedBy", "blocks"], "additionalProperties": false } }, "required": ["key", "kind", "type", "title", "status", "priority", "assigneeId", "reporterId", "dueDate", "estimateMinutes", "storyPoints", "createdAt", "updatedAt", "dependencies"], "additionalProperties": false, "$id": "motir://v1/components/WorkItemSummary" };
27812
27812
  function validate40(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
27813
27813
  ;
27814
27814
  let vErrors = null;
@@ -27984,7 +27984,7 @@ function validate40(data, { instancePath = "", parentData, parentDataProperty, r
27984
27984
  }
27985
27985
  errors++;
27986
27986
  }
27987
- if (!(data6 === "code" || data6 === "design" || data6 === "test" || data6 === "content" || data6 === "research" || data6 === "review" || data6 === "decision" || data6 === "deploy" || data6 === "manual" || data6 === "chore")) {
27987
+ if (!(data6 === "code" || data6 === "design" || data6 === "test" || data6 === "content" || data6 === "copy" || data6 === "translate" || data6 === "research" || data6 === "review" || data6 === "verification" || data6 === "decision" || data6 === "deploy" || data6 === "manual" || data6 === "legal" || data6 === "chore")) {
27988
27988
  const err4 = { instancePath: instancePath + "/items/" + i0 + "/type", schemaPath: "motir://v1/components/WorkItemSummary/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema75.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
27989
27989
  if (vErrors === null) {
27990
27990
  vErrors = [err4];
@@ -33843,7 +33843,7 @@ function validate52(data, { instancePath = "", parentData, parentDataProperty, r
33843
33843
  }
33844
33844
  errors++;
33845
33845
  }
33846
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
33846
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
33847
33847
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
33848
33848
  if (vErrors === null) {
33849
33849
  vErrors = [err1];
@@ -39046,7 +39046,7 @@ function validate56(data, { instancePath = "", parentData, parentDataProperty, r
39046
39046
  }
39047
39047
  errors++;
39048
39048
  }
39049
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
39049
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
39050
39050
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
39051
39051
  if (vErrors === null) {
39052
39052
  vErrors = [err1];
@@ -44101,7 +44101,7 @@ function validate58(data, { instancePath = "", parentData, parentDataProperty, r
44101
44101
  }
44102
44102
  errors++;
44103
44103
  }
44104
- if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "research" || data2 === "review" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "chore")) {
44104
+ if (!(data2 === "code" || data2 === "design" || data2 === "test" || data2 === "content" || data2 === "copy" || data2 === "translate" || data2 === "research" || data2 === "review" || data2 === "verification" || data2 === "decision" || data2 === "deploy" || data2 === "manual" || data2 === "legal" || data2 === "chore")) {
44105
44105
  const err1 = { instancePath: instancePath + "/type", schemaPath: "motir://v1/components/WorkItemDetail/properties/type/anyOf/0/enum", keyword: "enum", params: { allowedValues: schema34.properties.type.anyOf[0].enum }, message: "must be equal to one of the allowed values" };
44106
44106
  if (vErrors === null) {
44107
44107
  vErrors = [err1];
@@ -48557,8 +48557,15 @@ var CliError = class extends Error {
48557
48557
  exitCode;
48558
48558
  /** An optional one-line hint shown under the error (e.g. how to recover). */
48559
48559
  hint;
48560
+ /**
48561
+ * `cause` is here so a catch that RE-WORDS a failure can keep the original
48562
+ * instead of destroying it. Nothing prints it — `src/index.ts` shows the
48563
+ * message and the hint — but a rewrite that drops the underlying error leaves
48564
+ * no way back to it, and `motir link` proved what that costs (MOTIR-2492).
48565
+ * A catch that must re-word: narrow first, then chain.
48566
+ */
48560
48567
  constructor(message, opts = {}) {
48561
- super(message);
48568
+ super(message, opts.cause === void 0 ? {} : { cause: opts.cause });
48562
48569
  this.name = "CliError";
48563
48570
  this.exitCode = opts.exitCode ?? 1;
48564
48571
  this.hint = opts.hint;
@@ -48570,13 +48577,13 @@ var AuthError = class extends CliError {
48570
48577
  this.name = "AuthError";
48571
48578
  }
48572
48579
  };
48573
- var ScopeError = class extends CliError {
48574
- constructor(scope, operationId) {
48575
- super(`This token lacks the '${scope}' scope required for ${operationId}.`, {
48580
+ var PermissionError = class extends CliError {
48581
+ constructor(permission, operationId) {
48582
+ super(`This token is not granted the '${permission}' permission required for ${operationId}.`, {
48576
48583
  exitCode: 1,
48577
- hint: `Create a token with the '${scope}' scope: Settings \u2192 Account \u2192 API tokens.`
48584
+ hint: `Grant the '${permission}' permission on a token: Settings \u2192 Account \u2192 Tokens.`
48578
48585
  });
48579
- this.name = "ScopeError";
48586
+ this.name = "PermissionError";
48580
48587
  }
48581
48588
  };
48582
48589
  var NotFoundError = class extends CliError {
@@ -48760,7 +48767,7 @@ var V1Transport = class {
48760
48767
  const envelope = readEnvelope(parsed);
48761
48768
  if (response.status === 401) return new AuthError();
48762
48769
  if (response.status === 403) {
48763
- return new ScopeError(V1_OPERATIONS[operationId].scope, operationId);
48770
+ return new PermissionError(V1_OPERATIONS[operationId].permission, operationId);
48764
48771
  }
48765
48772
  if (response.status === 429) {
48766
48773
  const reset = Number(response.headers.get("x-ratelimit-reset"));
@@ -50114,9 +50121,10 @@ async function assertProjectAccessible(client, projectKey) {
50114
50121
  try {
50115
50122
  await client.listReady({ projectKey, limit: 1 });
50116
50123
  } catch (err) {
50117
- if (err instanceof CliError) {
50124
+ if (err instanceof NotFoundError) {
50118
50125
  throw new CliError(`Project "${projectKey}" is not accessible with this token.`, {
50119
- hint: "Check the project key, or your token\u2019s workspace."
50126
+ hint: "Check the project key, or your token\u2019s workspace.",
50127
+ cause: err
50120
50128
  });
50121
50129
  }
50122
50130
  throw err;
@@ -50858,7 +50866,7 @@ function parseItemKey(raw, command) {
50858
50866
  const key = raw.trim().toUpperCase();
50859
50867
  if (!ITEM_KEY.test(key)) {
50860
50868
  throw new CliError(`"${raw.trim()}" is not a work item key.`, {
50861
- hint: `Keys look like PROD-7. Run \`motir ${command} PROD-7\`, or \`motir ready\` to list what you can pick up.`
50869
+ hint: `Keys look like ACME-7. Run \`motir ${command} ACME-7\`, or \`motir ready\` to list what you can pick up.`
50862
50870
  });
50863
50871
  }
50864
50872
  return key;
@@ -50914,7 +50922,7 @@ async function showCommand(key, opts) {
50914
50922
  }
50915
50923
  async function openCommand(key, opts) {
50916
50924
  const trimmed = key.trim();
50917
- if (!trimmed) throw new CliError("A work item key is required, e.g. `motir open PROD-7`.");
50925
+ if (!trimmed) throw new CliError("A work item key is required, e.g. `motir open ACME-7`.");
50918
50926
  const link = requireLink();
50919
50927
  const url = issueUrl(link.config.serverUrl, trimmed);
50920
50928
  out(url);
@@ -52006,7 +52014,7 @@ function notReadyError(detail) {
52006
52014
  }
52007
52015
  async function runCommand(key, opts) {
52008
52016
  const trimmed = key.trim();
52009
- if (!trimmed) throw new CliError("A work item key is required, e.g. `motir run PROD-7`.");
52017
+ if (!trimmed) throw new CliError("A work item key is required, e.g. `motir run ACME-7`.");
52010
52018
  await withProjectSession(async (session) => {
52011
52019
  const { client } = session;
52012
52020
  const detail = await client.getWorkItem(trimmed);
@@ -52051,7 +52059,7 @@ async function doneCommand(key, opts) {
52051
52059
  }
52052
52060
  const trimmed = (key ?? "").trim();
52053
52061
  if (!trimmed) {
52054
- throw new CliError("A work item key is required, e.g. `motir done PROD-7`.", {
52062
+ throw new CliError("A work item key is required, e.g. `motir done ACME-7`.", {
52055
52063
  hint: "Or close out a merged session PR with `motir done --session <branch>`."
52056
52064
  });
52057
52065
  }
@@ -53655,7 +53663,7 @@ function buildProgram() {
53655
53663
  [
53656
53664
  "",
53657
53665
  "This removes the credential from THIS machine only. The server-side kill",
53658
- "switch is revoking the token in Settings \u2192 Account \u2192 API tokens \u2014 a terminal",
53666
+ "switch is revoking the token in Settings \u2192 Account \u2192 Tokens \u2014 a terminal",
53659
53667
  "connected by `motir login` appears there as `CLI \xB7 <hostname>`."
53660
53668
  ].join("\n")
53661
53669
  ).action(authLogout);
@@ -53665,7 +53673,7 @@ function buildProgram() {
53665
53673
  register(auth, "auth logout").option("--server <url>", "Server to log out of (defaults to the linked / single server).").action(authLogout);
53666
53674
  const link = register(program, "link").option("--server <url>", "Server base URL (defaults to the existing link / single server).").option("--workspace <slug>", "Workspace slug (defaults to the token\u2019s active workspace).").option(
53667
53675
  "--project <key>",
53668
- "Project key, e.g. PROD. Omit it and the workspace\u2019s only project is used."
53676
+ "Project key, e.g. ACME. Omit it and the workspace\u2019s only project is used."
53669
53677
  ).option(
53670
53678
  "--repo <name>",
53671
53679
  'Mark THIS directory as a single repo\u2019s checkout (writes a "." override).'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@motir/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Motir CLI — terminal dispatch of the work loop, over Motir's public REST API.",
5
5
  "license": "GPL-3.0-only",
6
6
  "repository": {