@skillcdn/console 0.3.0 → 0.3.2

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 (170) hide show
  1. package/README.md +4 -4
  2. package/dist/api.d.ts +4 -4
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +4 -4
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts +5 -1
  7. package/dist/cli/cli.d.ts.map +1 -1
  8. package/dist/cli/cli.js +290 -46
  9. package/dist/cli/cli.js.map +1 -1
  10. package/dist/cli/credentials.d.ts +5 -0
  11. package/dist/cli/credentials.d.ts.map +1 -1
  12. package/dist/cli/credentials.js +2 -0
  13. package/dist/cli/credentials.js.map +1 -1
  14. package/dist/cli/directory.d.ts +7 -0
  15. package/dist/cli/directory.d.ts.map +1 -1
  16. package/dist/cli/directory.js +7 -0
  17. package/dist/cli/directory.js.map +1 -1
  18. package/dist/cli/format.d.ts +10 -1
  19. package/dist/cli/format.d.ts.map +1 -1
  20. package/dist/cli/format.js +76 -20
  21. package/dist/cli/format.js.map +1 -1
  22. package/dist/cli/help.d.ts.map +1 -1
  23. package/dist/cli/help.js +42 -23
  24. package/dist/cli/help.js.map +1 -1
  25. package/dist/cli/main.js +1 -0
  26. package/dist/cli/main.js.map +1 -1
  27. package/dist/client.d.ts +39 -9
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +24 -3
  30. package/dist/client.js.map +1 -1
  31. package/dist/compat.d.ts +28 -6
  32. package/dist/compat.d.ts.map +1 -1
  33. package/dist/compat.js +55 -14
  34. package/dist/compat.js.map +1 -1
  35. package/dist/components/board.d.ts.map +1 -1
  36. package/dist/components/board.js +6 -4
  37. package/dist/components/board.js.map +1 -1
  38. package/dist/components/calendar.d.ts +18 -8
  39. package/dist/components/calendar.d.ts.map +1 -1
  40. package/dist/components/calendar.js +39 -27
  41. package/dist/components/calendar.js.map +1 -1
  42. package/dist/components/event-feed.d.ts.map +1 -1
  43. package/dist/components/event-feed.js +2 -0
  44. package/dist/components/event-feed.js.map +1 -1
  45. package/dist/components/pack-connect.d.ts +23 -0
  46. package/dist/components/pack-connect.d.ts.map +1 -0
  47. package/dist/components/pack-connect.js +86 -0
  48. package/dist/components/pack-connect.js.map +1 -0
  49. package/dist/components/pack-token.d.ts +27 -0
  50. package/dist/components/pack-token.d.ts.map +1 -0
  51. package/dist/components/pack-token.js +11 -0
  52. package/dist/components/pack-token.js.map +1 -0
  53. package/dist/components/picker.d.ts +39 -0
  54. package/dist/components/picker.d.ts.map +1 -0
  55. package/dist/components/picker.js +155 -0
  56. package/dist/components/picker.js.map +1 -0
  57. package/dist/components/projects.d.ts +13 -0
  58. package/dist/components/projects.d.ts.map +1 -1
  59. package/dist/components/projects.js +37 -5
  60. package/dist/components/projects.js.map +1 -1
  61. package/dist/components/task-form.d.ts +18 -4
  62. package/dist/components/task-form.d.ts.map +1 -1
  63. package/dist/components/task-form.js +56 -13
  64. package/dist/components/task-form.js.map +1 -1
  65. package/dist/components/task-list.js +2 -2
  66. package/dist/components/task-list.js.map +1 -1
  67. package/dist/components/task-view.d.ts +7 -1
  68. package/dist/components/task-view.d.ts.map +1 -1
  69. package/dist/components/task-view.js +6 -5
  70. package/dist/components/task-view.js.map +1 -1
  71. package/dist/components/ui.d.ts +7 -0
  72. package/dist/components/ui.d.ts.map +1 -1
  73. package/dist/components/ui.js +11 -0
  74. package/dist/components/ui.js.map +1 -1
  75. package/dist/components/work.d.ts +3 -1
  76. package/dist/components/work.d.ts.map +1 -1
  77. package/dist/components/work.js +6 -4
  78. package/dist/components/work.js.map +1 -1
  79. package/dist/components/workspace.d.ts +46 -0
  80. package/dist/components/workspace.d.ts.map +1 -0
  81. package/dist/components/workspace.js +124 -0
  82. package/dist/components/workspace.js.map +1 -0
  83. package/dist/console.css +319 -11
  84. package/dist/console.d.ts.map +1 -1
  85. package/dist/console.js +83 -24
  86. package/dist/console.js.map +1 -1
  87. package/dist/data.d.ts +26 -1
  88. package/dist/data.d.ts.map +1 -1
  89. package/dist/data.js +59 -1
  90. package/dist/data.js.map +1 -1
  91. package/dist/dates.d.ts +12 -2
  92. package/dist/dates.d.ts.map +1 -1
  93. package/dist/dates.js +20 -2
  94. package/dist/dates.js.map +1 -1
  95. package/dist/i18n/en.d.ts +64 -3
  96. package/dist/i18n/en.d.ts.map +1 -1
  97. package/dist/i18n/en.js +81 -16
  98. package/dist/i18n/en.js.map +1 -1
  99. package/dist/i18n/ko.d.ts.map +1 -1
  100. package/dist/i18n/ko.js +77 -16
  101. package/dist/i18n/ko.js.map +1 -1
  102. package/dist/index.d.ts +6 -2
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +6 -2
  105. package/dist/index.js.map +1 -1
  106. package/dist/limits.d.ts +2 -0
  107. package/dist/limits.d.ts.map +1 -1
  108. package/dist/limits.js +2 -0
  109. package/dist/limits.js.map +1 -1
  110. package/dist/router.d.ts +4 -4
  111. package/dist/router.d.ts.map +1 -1
  112. package/dist/router.js +11 -2
  113. package/dist/router.js.map +1 -1
  114. package/dist/routes.d.ts +4 -0
  115. package/dist/routes.d.ts.map +1 -1
  116. package/dist/routes.js +4 -0
  117. package/dist/routes.js.map +1 -1
  118. package/dist/schemas.d.ts +194 -13
  119. package/dist/schemas.d.ts.map +1 -1
  120. package/dist/schemas.js +121 -21
  121. package/dist/schemas.js.map +1 -1
  122. package/dist/vocabulary.d.ts +21 -1
  123. package/dist/vocabulary.d.ts.map +1 -1
  124. package/dist/vocabulary.js +18 -0
  125. package/dist/vocabulary.js.map +1 -1
  126. package/docs/specs/cli.md +25 -20
  127. package/docs/specs/rest.md +42 -19
  128. package/package.json +2 -2
  129. package/skills/building-a-console/SKILL.md +6 -6
  130. package/skills/building-a-console/references/the-look-from-a-website.md +39 -0
  131. package/skills/deploying-a-console/SKILL.md +9 -8
  132. package/skills/deploying-a-console/references/resources.md +1 -1
  133. package/skills/working-the-board/SKILL.md +5 -5
  134. package/skills/working-the-board/references/setting-up.md +1 -1
  135. package/skills/working-the-board/references/terms.md +3 -1
  136. package/skills/working-the-board/references/the-sentence.md +1 -1
  137. package/src/api.ts +21 -0
  138. package/src/cli/cli.ts +384 -51
  139. package/src/cli/credentials.ts +7 -0
  140. package/src/cli/directory.ts +9 -0
  141. package/src/cli/format.ts +83 -20
  142. package/src/cli/help.ts +50 -23
  143. package/src/cli/main.ts +1 -0
  144. package/src/client.ts +107 -10
  145. package/src/compat.ts +63 -14
  146. package/src/components/board.tsx +10 -4
  147. package/src/components/calendar.tsx +76 -34
  148. package/src/components/event-feed.tsx +2 -0
  149. package/src/components/pack-connect.tsx +179 -0
  150. package/src/components/pack-token.tsx +74 -0
  151. package/src/components/picker.tsx +297 -0
  152. package/src/components/projects.tsx +108 -9
  153. package/src/components/task-form.tsx +149 -63
  154. package/src/components/task-list.tsx +2 -2
  155. package/src/components/task-view.tsx +23 -9
  156. package/src/components/ui.tsx +25 -0
  157. package/src/components/work.tsx +10 -5
  158. package/src/components/workspace.tsx +298 -0
  159. package/src/console.tsx +202 -32
  160. package/src/data.ts +101 -1
  161. package/src/dates.ts +23 -2
  162. package/src/i18n/en.ts +92 -16
  163. package/src/i18n/ko.ts +84 -16
  164. package/src/index.ts +32 -1
  165. package/src/limits.ts +2 -0
  166. package/src/router.ts +17 -5
  167. package/src/routes.ts +4 -0
  168. package/src/schemas.ts +140 -19
  169. package/src/styles/console.css +319 -11
  170. package/src/vocabulary.ts +28 -0
package/src/i18n/en.ts CHANGED
@@ -3,6 +3,8 @@ import type {
3
3
  CategoryColor,
4
4
  GoalState,
5
5
  MembershipSource,
6
+ PackConnectEnding,
7
+ PeopleVisibility,
6
8
  PersonRole,
7
9
  PersonStatus,
8
10
  ProjectRole,
@@ -12,6 +14,7 @@ import type {
12
14
  SkillsStatus,
13
15
  TaskPriority,
14
16
  TaskState,
17
+ WeekStart,
15
18
  } from "../vocabulary.js";
16
19
 
17
20
  // Every word the default console shows, in English: the source of the keys every other pack
@@ -44,9 +47,18 @@ export const en = {
44
47
  status: { active: "Active", deactivated: "Deactivated" } satisfies Record<PersonStatus, string>,
45
48
  projectRole: { owner: "Owner", member: "Member" } satisfies Record<ProjectRole, string>,
46
49
  visibility: {
47
- workspace: "Everyone of the workspace",
48
- private: "Only those listed",
50
+ workspace: "Open: everyone of the workspace",
51
+ private: "Private: only those listed",
49
52
  } satisfies Record<ProjectVisibility, string>,
53
+ peopleVisibility: {
54
+ everyone: "Everyone of the workspace",
55
+ shared_projects: "Only the people one shares a project with",
56
+ } satisfies Record<PeopleVisibility, string>,
57
+ weekStart: {
58
+ auto: "System default",
59
+ monday: "Monday",
60
+ sunday: "Sunday",
61
+ } satisfies Record<WeekStart, string>,
50
62
  runStatus: {
51
63
  running: "Open",
52
64
  waiting: "Waiting for a decision",
@@ -109,6 +121,11 @@ export const en = {
109
121
  next: "Next page",
110
122
  range: (from: number, to: number, of: number) => `${from}-${to} of ${of}`,
111
123
  },
124
+ picker: {
125
+ nothingFound: "Nothing matches",
126
+ searching: "Searching",
127
+ more: "Show more",
128
+ },
112
129
  },
113
130
 
114
131
  nav: {
@@ -195,6 +212,13 @@ export const en = {
195
212
  chooseSomeone: "Choose someone",
196
213
  as: "As",
197
214
  add: "Add",
215
+ open: "An open project: everyone of the workspace is a member. The owners configure it, and an owner is made from this list.",
216
+ addByLoginAria: "Add a member by login",
217
+ login: "Login",
218
+ addByLogin: "Add by login",
219
+ lookupHint:
220
+ "Someone the list does not show: their login at the git host, or their address, exactly.",
221
+ nobodyCalled: (login: string) => `Nobody of the workspace is called ${login}.`,
198
222
  empty: {
199
223
  title: "Nobody is listed",
200
224
  workspace: "Everyone of the workspace is in; the administrators own it.",
@@ -202,11 +226,33 @@ export const en = {
202
226
  },
203
227
  },
204
228
  packToken: {
205
- aria: "The pack token",
229
+ aria: "The SkillCDN token",
230
+ intro:
231
+ "A private pack is read with a SkillCDN token for its repository; a public one needs none. Connect it with a code approved at SkillCDN, or paste a token made there by hand. The console keeps the token sealed and shows it to nobody. A project that reads the organization's pack may leave this to the workspace's token, on the Settings page.",
232
+ connectTitle: "With a code approved at SkillCDN",
233
+ pasteTitle: "With a token made by hand",
234
+ pasteAria: "Paste a token",
206
235
  label: "Token",
207
- hint: "A token a person made at SkillCDN for the pack's repository, on their account page there. The console keeps it sealed, reads the pack with it for whoever may see the project, and shows it to nobody.",
236
+ hint: "Made on the account page at SkillCDN, for the pack's repository.",
237
+ setSince: "A token has been set since",
208
238
  placeholder: "scdn_repo_…",
239
+ connect: "Connect at SkillCDN",
240
+ connectHint:
241
+ "The console asks SkillCDN for a code. Open the page it gives, signed in there as someone who may open the repository, check the code and approve.",
242
+ connectCode: "Code",
243
+ connectOpen: "Open the page at SkillCDN",
244
+ connectWaiting: "Waiting for the approval at SkillCDN.",
245
+ connectExpires: "The code expires",
246
+ connectCancel: "Stop waiting",
247
+ connectDone: "Connected: the console reads the pack with the token from now on.",
248
+ connectEnded: {
249
+ expired: "The code expired before anyone approved it. Connect again for a new one.",
250
+ declined: "The request was declined at SkillCDN, or the code was spent.",
251
+ refused:
252
+ "SkillCDN refused the request: the repository is not one the person may open, the pack is public and needs no token, or they hold as many tokens as one may.",
253
+ } satisfies Record<PackConnectEnding, string>,
209
254
  set: "Set the token",
255
+ replace: "Replace the token",
210
256
  remove: "Remove the token",
211
257
  },
212
258
  settings: {
@@ -215,10 +261,11 @@ export const en = {
215
261
  edit: "Edit the project",
216
262
  organizationsSkills: (address: string) => `The organization's: ${address}`,
217
263
  noSkills: "None: the console names no address for the organization's.",
218
- packToken: "Pack token",
219
- packTokenNone: "None: a public pack needs none, and a private one is not read.",
264
+ packToken: "SkillCDN token",
265
+ packTokenNone: "None",
220
266
  packTokenSet: "Set",
221
267
  packTokenEdit: "Change it",
268
+ packTokenAdd: "Set one",
222
269
  },
223
270
  },
224
271
 
@@ -262,7 +309,7 @@ export const en = {
262
309
  },
263
310
  partOf: "Part of",
264
311
  owner: "Owner",
265
- assignee: "Assignee",
312
+ workers: "Workers",
266
313
  written: "Written",
267
314
  changed: "Changed",
268
315
  state: "State",
@@ -296,8 +343,11 @@ export const en = {
296
343
  bodyPlaceholder: "What is to be done, in Markdown.",
297
344
  state: "State",
298
345
  priority: "Priority",
299
- assignee: "Assignee",
346
+ workers: "Workers",
347
+ addWorker: "Add a worker",
300
348
  partOf: "Part of",
349
+ searchTasks: "Search by number or title",
350
+ searchGoals: "Search by title",
301
351
  category: "Category",
302
352
  noCategory: "No category",
303
353
  goal: "Goal",
@@ -383,7 +433,7 @@ export const en = {
383
433
  person: "Person",
384
434
  open: "Open",
385
435
  inProgress: "In progress",
386
- dueSoon: "Due in 7 days",
436
+ dueThisWeek: "Due this week",
387
437
  overdue: "Overdue",
388
438
  unassigned: "Nobody's yet",
389
439
  },
@@ -455,8 +505,8 @@ export const en = {
455
505
  loading: "Loading your work",
456
506
  couldNotLoad: "Your work could not be loaded.",
457
507
  empty: {
458
- title: "Nothing is assigned to you",
459
- body: "A task assigned to you in any project you may see shows up here.",
508
+ title: "Nothing is on your plate",
509
+ body: "A task you work on, in any project you may see, shows up here.",
460
510
  },
461
511
  overdue: "Overdue",
462
512
  thisWeek: "Due this week",
@@ -498,6 +548,26 @@ export const en = {
498
548
  noSkillsAddress: "No address: each project names its own, or has none.",
499
549
  skillsFromConfiguration:
500
550
  "Set by whoever runs the console, in its configuration: the deployment the skills are read through, and the organization's address.",
551
+ skillsToken: "SkillCDN token",
552
+ skillsTokenIntro:
553
+ "Every project that names no address of its own, and holds no token of its own, reads the organization's pack with this token; a public pack needs none. Connect it with a code approved at SkillCDN, or paste a token made there by hand. The console keeps the token sealed and shows it to nobody.",
554
+ workspace: {
555
+ title: "Workspace",
556
+ aria: "Workspace settings",
557
+ peopleVisibility: "Member visibility",
558
+ peopleVisibilityHint:
559
+ "Whom a member sees on the People page and in the pickers: everyone of the workspace, or only the people they share a project with. An administrator always sees everyone, and a project open to the workspace has everyone in it.",
560
+ weekStart: "The week begins on",
561
+ weekStartHint:
562
+ "On the calendars and on My work. System default follows the language and region set on each person's device; Monday or Sunday holds for everyone.",
563
+ timeZone: "Time zone",
564
+ timeZoneHint:
565
+ "The console command and the agents print moments in this zone. The pages show them in each device's own. None: the command prints them in UTC.",
566
+ timeZoneNone: "None",
567
+ timeZoneDevice: (zone: string) => `This device: ${zone}`,
568
+ timeZoneUseDevice: (zone: string) => `Use this device's: ${zone}`,
569
+ save: "Save the settings",
570
+ },
501
571
  },
502
572
 
503
573
  rules: {
@@ -547,7 +617,7 @@ export const en = {
547
617
  title: "the title",
548
618
  body: "the body",
549
619
  priority: "the priority",
550
- assigneeId: "the assignee",
620
+ workers: "the workers",
551
621
  parentId: "what it is part of",
552
622
  links: "the links",
553
623
  name: "the name",
@@ -561,9 +631,14 @@ export const en = {
561
631
  dueOn: "the due date",
562
632
  state: "the state",
563
633
  color: "the colour",
634
+ peopleVisibility: "the member visibility",
635
+ weekStart: "the first day of the week",
636
+ timeZone: "the time zone",
637
+ packToken: "the SkillCDN token",
564
638
  } as Readonly<Record<string, string>>,
565
639
  event: {
566
640
  personJoined: () => "joined the board",
641
+ workspaceUpdated: (fields: string) => `changed ${fields} of the workspace`,
567
642
  roleChanged: (login: string, role: string) => `made ${login} ${role}`,
568
643
  personListed: (login: string) => `added ${login}`,
569
644
  personUnlisted: (login: string) => `took ${login} off the list`,
@@ -684,9 +759,9 @@ export const en = {
684
759
  indexing: "SkillCDN is still indexing the repository. Look again in a moment.",
685
760
  failed: "SkillCDN could not index the repository. What it found is on the address's page.",
686
761
  not_found:
687
- "SkillCDN does not serve this address to the console: there is nothing there, or the pack is private and the project holds no pack token for it (Settings).",
762
+ "SkillCDN does not serve this address to the console: there is nothing there, or the pack is private and no SkillCDN token reads it, the project's own or the workspace's. An owner connects one on the Settings page, with a code approved at SkillCDN.",
688
763
  token_invalid:
689
- "The pack token the project holds no longer works at SkillCDN: it expired, was removed, or its maker lost the repository. An owner sets a new one on the Settings page.",
764
+ "The SkillCDN token the pack is read with no longer works at SkillCDN: it expired, was removed, or its maker lost the repository. An owner sets a new one on the Settings page.",
690
765
  unavailable: "SkillCDN could not be reached. The skills are as they were; look again later.",
691
766
  },
692
767
  none: {
@@ -764,6 +839,7 @@ export const en = {
764
839
  people: {
765
840
  title: "People",
766
841
  list: "People",
842
+ narrowed: "The people you share a project with, and the administrators.",
767
843
  roleOf: (name: string) => `Role of ${name}`,
768
844
  letIn: "Add a person",
769
845
  letInAria: "Add a person",
@@ -793,8 +869,8 @@ export const en = {
793
869
  loadingWork: "Loading the work",
794
870
  couldNotLoadWork: "The work could not be loaded.",
795
871
  noWork: {
796
- title: (name: string) => `Nothing is assigned to ${name}`,
797
- body: "An open task assigned to them, in a project you may see, shows up here.",
872
+ title: (name: string) => `Nothing is on ${name}'s plate`,
873
+ body: "An open task they work on, in a project you may see, shows up here.",
798
874
  },
799
875
  notOverseen: {
800
876
  title: "Not yours to see",
package/src/i18n/ko.ts CHANGED
@@ -20,7 +20,12 @@ export const ko: Messages = {
20
20
  role: { admin: "관리자", member: "멤버" },
21
21
  status: { active: "활성", deactivated: "비활성화" },
22
22
  projectRole: { owner: "소유자", member: "멤버" },
23
- visibility: { workspace: "워크스페이스의 모두", private: "목록에 있는 사람만" },
23
+ visibility: { workspace: "공개: 워크스페이스의 모두", private: "비공개: 목록에 있는 사람만" },
24
+ peopleVisibility: {
25
+ everyone: "워크스페이스의 모두",
26
+ shared_projects: "같은 프로젝트에 속한 사람만",
27
+ },
28
+ weekStart: { auto: "시스템 기본", monday: "월요일", sunday: "일요일" },
24
29
  runStatus: {
25
30
  running: "열림",
26
31
  waiting: "결정 대기 중",
@@ -78,6 +83,11 @@ export const ko: Messages = {
78
83
  next: "다음",
79
84
  range: (from, to, of) => `${of}건 중 ${from}-${to}`,
80
85
  },
86
+ picker: {
87
+ nothingFound: "맞는 것이 없습니다",
88
+ searching: "검색 중",
89
+ more: "더 보기",
90
+ },
81
91
  },
82
92
 
83
93
  nav: {
@@ -163,6 +173,12 @@ export const ko: Messages = {
163
173
  chooseSomeone: "선택하세요",
164
174
  as: "역할",
165
175
  add: "추가",
176
+ open: "공개 프로젝트입니다. 워크스페이스의 모든 구성원이 멤버이고, 소유자는 이 목록에서 지정합니다.",
177
+ addByLoginAria: "로그인으로 멤버 추가",
178
+ login: "로그인",
179
+ addByLogin: "로그인으로 추가",
180
+ lookupHint: "목록에 보이지 않는 사람: 깃 호스트의 로그인이나 주소를 정확히 적습니다.",
181
+ nobodyCalled: (login) => `워크스페이스에 ${login}이라는 사람이 없습니다.`,
166
182
  empty: {
167
183
  title: "목록에 아무도 없습니다",
168
184
  workspace: "워크스페이스의 모두가 속해 있고, 관리자가 소유합니다.",
@@ -170,11 +186,33 @@ export const ko: Messages = {
170
186
  },
171
187
  },
172
188
  packToken: {
173
- aria: "팩 토큰",
189
+ aria: "SkillCDN 토큰",
190
+ intro:
191
+ "비공개 팩은 저장소에 대한 SkillCDN 토큰으로 읽습니다. 공개 팩에는 필요 없습니다. SkillCDN에서 승인한 코드로 연결하거나, 거기서 직접 만든 토큰을 붙여 넣으세요. 콘솔은 토큰을 봉인해 보관하고 누구에게도 보여 주지 않습니다. 조직의 팩을 읽는 프로젝트는 워크스페이스 설정의 토큰을 그대로 쓸 수 있습니다.",
192
+ connectTitle: "SkillCDN에서 승인한 코드로",
193
+ pasteTitle: "직접 만든 토큰으로",
194
+ pasteAria: "토큰 붙여넣기",
174
195
  label: "토큰",
175
- hint: "사람이 SkillCDN 계정 페이지에서 팩의 저장소에 대해 만든 토큰입니다. 콘솔이 봉인해 보관하고, 프로젝트를 볼 수 있는 사람을 위해 팩을 읽는 데 쓰며, 누구에게도 보여 주지 않습니다.",
196
+ hint: "SkillCDN 계정 페이지에서 팩의 저장소에 대해 만든 토큰입니다.",
197
+ setSince: "토큰이 설정되어 있습니다:",
176
198
  placeholder: "scdn_repo_…",
199
+ connect: "SkillCDN에서 연결",
200
+ connectHint:
201
+ "콘솔이 SkillCDN에 코드를 요청합니다. 안내된 페이지를 저장소를 볼 수 있는 계정으로 열어, 코드를 확인하고 승인하세요.",
202
+ connectCode: "코드",
203
+ connectOpen: "SkillCDN 페이지 열기",
204
+ connectWaiting: "SkillCDN에서 승인을 기다리는 중입니다.",
205
+ connectExpires: "코드 만료:",
206
+ connectCancel: "기다리기 중단",
207
+ connectDone: "연결되었습니다. 콘솔이 이제 이 토큰으로 팩을 읽습니다.",
208
+ connectEnded: {
209
+ expired: "승인되기 전에 코드가 만료되었습니다. 다시 연결해 새 코드를 받으세요.",
210
+ declined: "SkillCDN에서 요청이 거절되었거나 코드가 이미 쓰였습니다.",
211
+ refused:
212
+ "SkillCDN이 요청을 거부했습니다. 그 사람이 볼 수 없는 저장소이거나, 공개 팩이라 토큰이 필요 없거나, 토큰을 더 만들 수 없습니다.",
213
+ },
177
214
  set: "토큰 넣기",
215
+ replace: "토큰 바꾸기",
178
216
  remove: "토큰 빼기",
179
217
  },
180
218
  settings: {
@@ -183,10 +221,11 @@ export const ko: Messages = {
183
221
  edit: "프로젝트 편집",
184
222
  organizationsSkills: (address) => `조직의 스킬: ${address}`,
185
223
  noSkills: "없음: 콘솔에 조직의 주소가 없습니다.",
186
- packToken: "팩 토큰",
187
- packTokenNone: "없음: 공개 팩은 필요 없고, 비공개 팩은 읽히지 않습니다.",
224
+ packToken: "SkillCDN 토큰",
225
+ packTokenNone: "없음",
188
226
  packTokenSet: "설정됨",
189
227
  packTokenEdit: "바꾸기",
228
+ packTokenAdd: "등록",
190
229
  },
191
230
  },
192
231
 
@@ -230,7 +269,7 @@ export const ko: Messages = {
230
269
  },
231
270
  partOf: "상위 작업:",
232
271
  owner: "담당자",
233
- assignee: "배정",
272
+ workers: "작업자",
234
273
  written: "작성",
235
274
  changed: "변경",
236
275
  state: "상태",
@@ -264,8 +303,11 @@ export const ko: Messages = {
264
303
  bodyPlaceholder: "무엇을 할지, Markdown으로.",
265
304
  state: "상태",
266
305
  priority: "우선순위",
267
- assignee: "배정",
306
+ workers: "작업자",
307
+ addWorker: "작업자 추가",
268
308
  partOf: "상위 작업",
309
+ searchTasks: "번호나 제목으로 검색",
310
+ searchGoals: "제목으로 검색",
269
311
  category: "카테고리",
270
312
  noCategory: "카테고리 없음",
271
313
  goal: "목표",
@@ -351,9 +393,9 @@ export const ko: Messages = {
351
393
  person: "사람",
352
394
  open: "열림",
353
395
  inProgress: "진행 중",
354
- dueSoon: "7일 내 마감",
396
+ dueThisWeek: "이번 주 마감",
355
397
  overdue: "기한 지남",
356
- unassigned: "아직 배정 없음",
398
+ unassigned: "아직 작업자 없음",
357
399
  },
358
400
  },
359
401
 
@@ -422,8 +464,8 @@ export const ko: Messages = {
422
464
  loading: "내 작업을 불러오는 중",
423
465
  couldNotLoad: "내 작업을 불러올 수 없습니다.",
424
466
  empty: {
425
- title: "내게 배정된 작업이 없습니다",
426
- body: "볼 수 있는 어느 프로젝트에서든 내게 배정된 작업이 여기에 나타납니다.",
467
+ title: "내가 맡은 작업이 없습니다",
468
+ body: "볼 수 있는 어느 프로젝트에서든 내가 작업자인 작업이 여기에 나타납니다.",
427
469
  },
428
470
  overdue: "기한 지남",
429
471
  thisWeek: "이번 주 마감",
@@ -464,6 +506,26 @@ export const ko: Messages = {
464
506
  noSkillsAddress: "주소 없음: 프로젝트마다 자기 주소를 두거나, 두지 않습니다.",
465
507
  skillsFromConfiguration:
466
508
  "콘솔을 운영하는 쪽이 설정으로 정합니다. 스킬을 읽어 오는 배포와 조직의 주소.",
509
+ skillsToken: "SkillCDN 토큰",
510
+ skillsTokenIntro:
511
+ "자기 주소도 자기 토큰도 없는 모든 프로젝트가 이 토큰으로 조직의 팩을 읽습니다. 공개 팩에는 필요 없습니다. SkillCDN에서 승인한 코드로 연결하거나, 거기서 직접 만든 토큰을 붙여 넣으세요. 콘솔은 토큰을 봉인해 보관하고 누구에게도 보여 주지 않습니다.",
512
+ workspace: {
513
+ title: "워크스페이스",
514
+ aria: "워크스페이스 설정",
515
+ peopleVisibility: "멤버 공개 범위",
516
+ peopleVisibilityHint:
517
+ "멤버가 사람들 페이지와 선택 목록에서 보는 범위: 워크스페이스의 모두, 또는 같은 프로젝트에 속한 사람만. 관리자는 언제나 모두를 보고, 워크스페이스에 공개된 프로젝트에는 모두가 속합니다.",
518
+ weekStart: "주의 시작 요일",
519
+ weekStartHint:
520
+ "캘린더와 내 작업에서. 시스템 기본은 각 사람의 기기에 설정된 언어와 지역을 따르고, 월요일이나 일요일은 모두에게 같게 적용됩니다.",
521
+ timeZone: "타임존",
522
+ timeZoneHint:
523
+ "콘솔 명령과 에이전트가 시각을 이 타임존으로 찍습니다. 페이지는 각 기기의 타임존으로 보여 줍니다. 없음이면 명령은 UTC로 찍습니다.",
524
+ timeZoneNone: "없음",
525
+ timeZoneDevice: (zone) => `이 기기: ${zone}`,
526
+ timeZoneUseDevice: (zone) => `이 기기의 타임존 쓰기: ${zone}`,
527
+ save: "설정 저장",
528
+ },
467
529
  },
468
530
 
469
531
  rules: {
@@ -513,7 +575,7 @@ export const ko: Messages = {
513
575
  title: "제목",
514
576
  body: "본문",
515
577
  priority: "우선순위",
516
- assigneeId: "배정",
578
+ workers: "작업자",
517
579
  parentId: "상위 작업",
518
580
  links: "링크",
519
581
  name: "이름",
@@ -527,9 +589,14 @@ export const ko: Messages = {
527
589
  dueOn: "기한",
528
590
  state: "상태",
529
591
  color: "색",
592
+ peopleVisibility: "멤버 공개 범위",
593
+ weekStart: "주의 시작 요일",
594
+ timeZone: "타임존",
595
+ packToken: "SkillCDN 토큰",
530
596
  },
531
597
  event: {
532
598
  personJoined: () => "보드에 들어왔습니다",
599
+ workspaceUpdated: (fields) => `워크스페이스의 ${fields}을(를) 바꿨습니다`,
533
600
  roleChanged: (login, role) => `${login}을(를) ${role}(으)로 지정했습니다`,
534
601
  personListed: (login) => `${login}을(를) 추가했습니다`,
535
602
  personUnlisted: (login) => `${login}을(를) 목록에서 뺐습니다`,
@@ -647,9 +714,9 @@ export const ko: Messages = {
647
714
  indexing: "SkillCDN이 아직 저장소를 색인하고 있습니다. 잠시 후 다시 보세요.",
648
715
  failed: "SkillCDN이 저장소를 색인하지 못했습니다. 찾은 내용은 주소의 페이지에 있습니다.",
649
716
  not_found:
650
- "SkillCDN이 이 주소를 콘솔에 제공하지 않습니다. 그곳에 아무것도 없거나, 비공개 팩인데 프로젝트에 팩 토큰이 없습니다(설정).",
717
+ "SkillCDN이 이 주소를 콘솔에 제공하지 않습니다. 그곳에 아무것도 없거나, 비공개 팩인데 읽을 SkillCDN 토큰이 프로젝트에도 워크스페이스에도 없습니다. 소유자가 설정 페이지에서 SkillCDN의 승인 코드로 연결합니다.",
651
718
  token_invalid:
652
- "프로젝트가 가진 팩 토큰이 SkillCDN에서 더 이상 통하지 않습니다. 만료되었거나 지워졌거나, 만든 사람이 저장소 권한을 잃었습니다. 소유자가 설정 페이지에서 새로 넣습니다.",
719
+ "이 팩을 읽는 SkillCDN 토큰이 SkillCDN에서 더 이상 통하지 않습니다. 만료되었거나 지워졌거나, 만든 사람이 저장소 권한을 잃었습니다. 소유자가 설정 페이지에서 새로 넣습니다.",
653
720
  unavailable:
654
721
  "SkillCDN에 연결할 수 없습니다. 스킬은 이전 상태 그대로입니다. 나중에 다시 보세요.",
655
722
  },
@@ -727,6 +794,7 @@ export const ko: Messages = {
727
794
  people: {
728
795
  title: "사람들",
729
796
  list: "사람들",
797
+ narrowed: "같은 프로젝트에 속한 사람들과 관리자입니다.",
730
798
  roleOf: (name) => `${name}의 역할`,
731
799
  letIn: "사람 추가",
732
800
  letInAria: "사람 추가",
@@ -756,8 +824,8 @@ export const ko: Messages = {
756
824
  loadingWork: "작업을 불러오는 중",
757
825
  couldNotLoadWork: "작업을 불러올 수 없습니다.",
758
826
  noWork: {
759
- title: (name) => `${name}에게 배정된 작업이 없습니다`,
760
- body: "내가 볼 수 있는 프로젝트에서 그 사람에게 배정된 열린 작업이 여기에 나타납니다.",
827
+ title: (name) => `${name}에게 맡겨진 작업이 없습니다`,
828
+ body: "내가 볼 수 있는 프로젝트에서 그 사람이 작업자인 열린 작업이 여기에 나타납니다.",
761
829
  },
762
830
  notOverseen: {
763
831
  title: "볼 수 없는 작업입니다",
package/src/index.ts CHANGED
@@ -82,6 +82,12 @@ export {
82
82
  goalMonth,
83
83
  } from "./components/goals.js";
84
84
  export { Markdown, type MarkdownProps } from "./components/markdown.js";
85
+ export {
86
+ PackConnect,
87
+ type PackConnectProps,
88
+ type PackConnectState,
89
+ } from "./components/pack-connect.js";
90
+ export { PackTokenWays, type PackTokenWaysProps } from "./components/pack-token.js";
85
91
  export {
86
92
  PAGE_SIZE,
87
93
  Pager,
@@ -96,6 +102,13 @@ export {
96
102
  PeopleList,
97
103
  type PeopleListProps,
98
104
  } from "./components/people.js";
105
+ export {
106
+ PICKER_PAGE_LIMIT,
107
+ Picker,
108
+ type PickerPage,
109
+ type PickerProps,
110
+ type PickerSearch,
111
+ } from "./components/picker.js";
99
112
  export {
100
113
  clampScale,
101
114
  FITTED,
@@ -162,7 +175,14 @@ export {
162
175
  } from "./components/shell.js";
163
176
  export { SignIn, type SignInProps } from "./components/sign-in.js";
164
177
  export { SkillList, type SkillListProps } from "./components/skills.js";
165
- export { TaskForm, type TaskFormProps } from "./components/task-form.js";
178
+ export {
179
+ type GoalSearch,
180
+ goalLabel,
181
+ TaskForm,
182
+ type TaskFormProps,
183
+ type TaskSearch,
184
+ taskLabel,
185
+ } from "./components/task-form.js";
166
186
  export { TaskList, type TaskListProps } from "./components/task-list.js";
167
187
  export { TaskView, type TaskViewProps } from "./components/task-view.js";
168
188
  export {
@@ -198,8 +218,19 @@ export {
198
218
  STATE_LABELS,
199
219
  StateBadge,
200
220
  Time,
221
+ Workers,
201
222
  } from "./components/ui.js";
202
223
  export { WorkList, type WorkListProps } from "./components/work.js";
224
+ export {
225
+ DEFAULT_PEOPLE_VISIBILITY,
226
+ peopleVisibilityOf,
227
+ timeZoneOf,
228
+ WorkspaceSettingsForm,
229
+ type WorkspaceSettingsFormProps,
230
+ WorkspaceSettingsView,
231
+ type WorkspaceSettingsViewProps,
232
+ weekStartOf,
233
+ } from "./components/workspace.js";
203
234
  export { ConnectPage, type ConnectPageProps } from "./connect-page.js";
204
235
  export {
205
236
  type ConsoleApp,
package/src/limits.ts CHANGED
@@ -9,6 +9,8 @@ export const MAX_QUESTION_LENGTH = 500;
9
9
  export const MAX_BODY_LENGTH = 20_000;
10
10
  /** The links of a task: a repository, a pull request, a document. */
11
11
  export const MAX_LINKS = 20;
12
+ /** How many people may be at work on one task at a time (ADR-0037): a crew, not a mailing list. */
13
+ export const MAX_WORKERS = 20;
12
14
  export const MAX_LINK_LABEL_LENGTH = 120;
13
15
  export const MAX_URL_LENGTH = 2048;
14
16
  /** The options of a decision, and how a person words each. */
package/src/router.ts CHANGED
@@ -83,8 +83,11 @@ export type Route =
83
83
  readonly project: string;
84
84
  readonly form: "edit" | "rules" | "pack-token" | undefined;
85
85
  }
86
- /** The workspace's settings: its rules, its categories, its skills; or the form the rules are written on. */
87
- | { readonly name: "workspace-settings"; readonly form: "rules" | undefined }
86
+ /** The workspace's settings: its own, its rules, its categories, its skills; or the form the rules, or the settings (ADR-0035), are written on. */
87
+ | {
88
+ readonly name: "workspace-settings";
89
+ readonly form: "rules" | "workspace" | "pack-token" | undefined;
90
+ }
88
91
  | { readonly name: "people" }
89
92
  /** The form where an administrator lets someone in by login (ADR-0022). */
90
93
  | { readonly name: "new-listing" }
@@ -252,7 +255,16 @@ export function matchRoute(pathname: string, search = ""): Route {
252
255
  return { name: "categories" };
253
256
  }
254
257
  if (path === PATHS.settings) {
255
- return { name: "workspace-settings", form: params.has("rules") ? "rules" : undefined };
258
+ return {
259
+ name: "workspace-settings",
260
+ form: params.has("workspace")
261
+ ? "workspace"
262
+ : params.has("rules")
263
+ ? "rules"
264
+ : params.has("pack-token")
265
+ ? "pack-token"
266
+ : undefined,
267
+ };
256
268
  }
257
269
  if (path === PATHS.connect) {
258
270
  return { name: "connect", code: undefined };
@@ -423,8 +435,8 @@ export function projectSettingsHref(key: string, form?: "edit" | "rules" | "pack
423
435
  return form === undefined ? base : `${base}?${form}`;
424
436
  }
425
437
 
426
- /** Where the workspace's settings are, or the form its rules are written on. */
427
- export function settingsHref(form?: "rules"): string {
438
+ /** Where the workspace's settings are, or the form its rules, or its own settings, are written on. */
439
+ export function settingsHref(form?: "rules" | "workspace" | "pack-token"): string {
428
440
  return form === undefined ? PATHS.settings : `${PATHS.settings}?${form}`;
429
441
  }
430
442
 
package/src/routes.ts CHANGED
@@ -9,6 +9,10 @@ export const REST_ROUTES = {
9
9
  me: "/api/v1/me",
10
10
  /** The token a request is made with, for it to give itself up. */
11
11
  meToken: "/api/v1/me/token",
12
+ /** The workspace's settings (ADR-0035), changed by an administrator; read through `me`. */
13
+ workspace: "/api/v1/workspace",
14
+ /** The SkillCDN token the organization's pack is read with (ADR-0036), an administrator's; `/connect` under it connects one with a code. */
15
+ workspacePackToken: "/api/v1/workspace/pack-token",
12
16
  /** The people of the workspace: everyone who has signed in, and the logins let in that have not. */
13
17
  people: "/api/v1/people",
14
18
  /** The logins an administrator let in (ADR-0022), made and removed by one. */