@skillcdn/console 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) 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 +4 -0
  7. package/dist/cli/cli.d.ts.map +1 -1
  8. package/dist/cli/cli.js +201 -25
  9. package/dist/cli/cli.js.map +1 -1
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +15 -11
  12. package/dist/cli/format.js.map +1 -1
  13. package/dist/cli/help.d.ts.map +1 -1
  14. package/dist/cli/help.js +59 -26
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/main.js +1 -0
  17. package/dist/cli/main.js.map +1 -1
  18. package/dist/cli/pack.d.ts +7 -2
  19. package/dist/cli/pack.d.ts.map +1 -1
  20. package/dist/cli/pack.js +16 -2
  21. package/dist/cli/pack.js.map +1 -1
  22. package/dist/client.d.ts +20 -10
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +17 -3
  25. package/dist/client.js.map +1 -1
  26. package/dist/compat.d.ts +28 -6
  27. package/dist/compat.d.ts.map +1 -1
  28. package/dist/compat.js +55 -14
  29. package/dist/compat.js.map +1 -1
  30. package/dist/components/board.d.ts +12 -1
  31. package/dist/components/board.d.ts.map +1 -1
  32. package/dist/components/board.js +57 -7
  33. package/dist/components/board.js.map +1 -1
  34. package/dist/components/calendar.d.ts +17 -7
  35. package/dist/components/calendar.d.ts.map +1 -1
  36. package/dist/components/calendar.js +89 -38
  37. package/dist/components/calendar.js.map +1 -1
  38. package/dist/components/decision-form.d.ts +12 -4
  39. package/dist/components/decision-form.d.ts.map +1 -1
  40. package/dist/components/decision-form.js +24 -6
  41. package/dist/components/decision-form.js.map +1 -1
  42. package/dist/components/decision-list.d.ts +4 -0
  43. package/dist/components/decision-list.d.ts.map +1 -1
  44. package/dist/components/decision-list.js +9 -6
  45. package/dist/components/decision-list.js.map +1 -1
  46. package/dist/components/documents.d.ts.map +1 -1
  47. package/dist/components/documents.js +3 -3
  48. package/dist/components/documents.js.map +1 -1
  49. package/dist/components/event-feed.d.ts.map +1 -1
  50. package/dist/components/event-feed.js +63 -8
  51. package/dist/components/event-feed.js.map +1 -1
  52. package/dist/components/my-decisions.d.ts +20 -0
  53. package/dist/components/my-decisions.d.ts.map +1 -0
  54. package/dist/components/my-decisions.js +36 -0
  55. package/dist/components/my-decisions.js.map +1 -0
  56. package/dist/components/people.d.ts.map +1 -1
  57. package/dist/components/people.js +1 -1
  58. package/dist/components/people.js.map +1 -1
  59. package/dist/components/picker.d.ts +39 -0
  60. package/dist/components/picker.d.ts.map +1 -0
  61. package/dist/components/picker.js +155 -0
  62. package/dist/components/picker.js.map +1 -0
  63. package/dist/components/projects.d.ts.map +1 -1
  64. package/dist/components/projects.js +3 -3
  65. package/dist/components/projects.js.map +1 -1
  66. package/dist/components/roadmap.js +1 -1
  67. package/dist/components/roadmap.js.map +1 -1
  68. package/dist/components/runs.d.ts.map +1 -1
  69. package/dist/components/runs.js +1 -1
  70. package/dist/components/runs.js.map +1 -1
  71. package/dist/components/shell.d.ts.map +1 -1
  72. package/dist/components/shell.js +36 -1
  73. package/dist/components/shell.js.map +1 -1
  74. package/dist/components/task-form.d.ts +18 -4
  75. package/dist/components/task-form.d.ts.map +1 -1
  76. package/dist/components/task-form.js +56 -13
  77. package/dist/components/task-form.js.map +1 -1
  78. package/dist/components/task-list.js +2 -2
  79. package/dist/components/task-list.js.map +1 -1
  80. package/dist/components/task-view.d.ts +7 -1
  81. package/dist/components/task-view.d.ts.map +1 -1
  82. package/dist/components/task-view.js +7 -6
  83. package/dist/components/task-view.js.map +1 -1
  84. package/dist/components/ui.d.ts +17 -0
  85. package/dist/components/ui.d.ts.map +1 -1
  86. package/dist/components/ui.js +26 -11
  87. package/dist/components/ui.js.map +1 -1
  88. package/dist/components/work.d.ts.map +1 -1
  89. package/dist/components/work.js +5 -3
  90. package/dist/components/work.js.map +1 -1
  91. package/dist/console.css +1794 -433
  92. package/dist/console.d.ts.map +1 -1
  93. package/dist/console.js +93 -10
  94. package/dist/console.js.map +1 -1
  95. package/dist/data.d.ts +21 -1
  96. package/dist/data.d.ts.map +1 -1
  97. package/dist/data.js +24 -1
  98. package/dist/data.js.map +1 -1
  99. package/dist/i18n/en.d.ts +45 -3
  100. package/dist/i18n/en.d.ts.map +1 -1
  101. package/dist/i18n/en.js +52 -10
  102. package/dist/i18n/en.js.map +1 -1
  103. package/dist/i18n/ko.d.ts.map +1 -1
  104. package/dist/i18n/ko.js +54 -12
  105. package/dist/i18n/ko.js.map +1 -1
  106. package/dist/index.d.ts +5 -3
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +5 -3
  109. package/dist/index.js.map +1 -1
  110. package/dist/limits.d.ts +2 -0
  111. package/dist/limits.d.ts.map +1 -1
  112. package/dist/limits.js +2 -0
  113. package/dist/limits.js.map +1 -1
  114. package/dist/router.d.ts +9 -1
  115. package/dist/router.d.ts.map +1 -1
  116. package/dist/router.js +12 -0
  117. package/dist/router.js.map +1 -1
  118. package/dist/routes.d.ts +3 -1
  119. package/dist/routes.d.ts.map +1 -1
  120. package/dist/routes.js +3 -1
  121. package/dist/routes.js.map +1 -1
  122. package/dist/rules.js +1 -1
  123. package/dist/rules.js.map +1 -1
  124. package/dist/schemas.d.ts +252 -12
  125. package/dist/schemas.d.ts.map +1 -1
  126. package/dist/schemas.js +27 -10
  127. package/dist/schemas.js.map +1 -1
  128. package/dist/vocabulary.d.ts +2 -0
  129. package/dist/vocabulary.d.ts.map +1 -1
  130. package/dist/vocabulary.js +2 -0
  131. package/dist/vocabulary.js.map +1 -1
  132. package/docs/specs/cli.md +14 -13
  133. package/docs/specs/rest.md +24 -19
  134. package/package.json +2 -2
  135. package/skills/building-a-console/SKILL.md +4 -4
  136. package/skills/building-a-console/references/the-default-console.md +4 -4
  137. package/skills/building-a-console/references/the-look-from-a-website.md +5 -5
  138. package/skills/deploying-a-console/SKILL.md +2 -2
  139. package/skills/deploying-a-console/references/resources.md +1 -1
  140. package/skills/working-the-board/SKILL.md +8 -6
  141. package/skills/working-the-board/references/terms.md +3 -3
  142. package/src/api.ts +7 -0
  143. package/src/cli/cli.ts +254 -25
  144. package/src/cli/format.ts +22 -11
  145. package/src/cli/help.ts +63 -26
  146. package/src/cli/main.ts +1 -0
  147. package/src/cli/pack.ts +17 -1
  148. package/src/client.ts +44 -11
  149. package/src/compat.ts +63 -14
  150. package/src/components/board.tsx +124 -25
  151. package/src/components/calendar.tsx +258 -117
  152. package/src/components/decision-form.tsx +71 -23
  153. package/src/components/decision-list.tsx +30 -3
  154. package/src/components/documents.tsx +27 -11
  155. package/src/components/event-feed.tsx +116 -33
  156. package/src/components/my-decisions.tsx +138 -0
  157. package/src/components/people.tsx +3 -1
  158. package/src/components/picker.tsx +297 -0
  159. package/src/components/projects.tsx +7 -5
  160. package/src/components/roadmap.tsx +1 -1
  161. package/src/components/runs.tsx +5 -1
  162. package/src/components/shell.tsx +36 -1
  163. package/src/components/task-form.tsx +149 -63
  164. package/src/components/task-list.tsx +3 -3
  165. package/src/components/task-view.tsx +71 -56
  166. package/src/components/ui.tsx +89 -11
  167. package/src/components/work.tsx +6 -4
  168. package/src/console.tsx +157 -29
  169. package/src/data.ts +61 -1
  170. package/src/i18n/en.ts +54 -10
  171. package/src/i18n/ko.ts +56 -12
  172. package/src/index.ts +19 -1
  173. package/src/limits.ts +2 -0
  174. package/src/router.ts +18 -1
  175. package/src/routes.ts +3 -1
  176. package/src/rules.ts +1 -1
  177. package/src/schemas.ts +29 -9
  178. package/src/styles/console.css +1794 -433
  179. package/src/vocabulary.ts +3 -0
package/src/i18n/en.ts CHANGED
@@ -121,11 +121,17 @@ export const en = {
121
121
  next: "Next page",
122
122
  range: (from: number, to: number, of: number) => `${from}-${to} of ${of}`,
123
123
  },
124
+ picker: {
125
+ nothingFound: "Nothing matches",
126
+ searching: "Searching",
127
+ more: "Show more",
128
+ },
124
129
  },
125
130
 
126
131
  nav: {
127
132
  projects: "Projects",
128
133
  work: "My work",
134
+ myDecisions: "My decisions",
129
135
  people: "People",
130
136
  agents: "Agents",
131
137
  board: "Board",
@@ -274,8 +280,11 @@ export const en = {
274
280
  menu: "Task menu",
275
281
  decisions: (n: number) => count(n, "decision", "decisions"),
276
282
  decisionsTitle: "Decisions waiting for a person",
283
+ unfold: (column: string) => `Open ${column}`,
284
+ fold: (column: string) => `Fold ${column}`,
277
285
  filters: {
278
286
  aria: "Narrow the board",
287
+ words: "Title, number or person",
279
288
  everyone: "Everyone",
280
289
  mine: "Mine",
281
290
  anyCategory: "Any category",
@@ -304,7 +313,7 @@ export const en = {
304
313
  },
305
314
  partOf: "Part of",
306
315
  owner: "Owner",
307
- assignee: "Assignee",
316
+ workers: "Workers",
308
317
  written: "Written",
309
318
  changed: "Changed",
310
319
  state: "State",
@@ -338,8 +347,11 @@ export const en = {
338
347
  bodyPlaceholder: "What is to be done, in Markdown.",
339
348
  state: "State",
340
349
  priority: "Priority",
341
- assignee: "Assignee",
350
+ workers: "Workers",
351
+ addWorker: "Add a worker",
342
352
  partOf: "Part of",
353
+ searchTasks: "Search by number or title",
354
+ searchGoals: "Search by title",
343
355
  category: "Category",
344
356
  noCategory: "No category",
345
357
  goal: "Goal",
@@ -372,6 +384,8 @@ export const en = {
372
384
  record: "The record",
373
385
  openRecord: "Open",
374
386
  waitingForPerson: "Waiting for a person.",
387
+ waitingFor: (name: string) => `Waiting for ${name}.`,
388
+ peopleLabel: (asker: string, decider: string) => `asked by ${asker}, for ${decider}`,
375
389
  options: "Options",
376
390
  notePlaceholder: "A word about it, if any",
377
391
  own: "Something else",
@@ -394,6 +408,9 @@ export const en = {
394
408
  contextPlaceholder: "What a person needs to know to answer, in Markdown.",
395
409
  about: "About",
396
410
  noTask: "No task in particular",
411
+ decider: "Who decides",
412
+ deciderPlaceholder: "You, unless you name someone",
413
+ me: "(you)",
397
414
  options: "Options",
398
415
  option: (n: number) => `Option ${n}`,
399
416
  addOption: "Add an option",
@@ -401,6 +418,23 @@ export const en = {
401
418
  },
402
419
  },
403
420
 
421
+ myDecisions: {
422
+ title: "My decisions",
423
+ loading: "Loading your decisions",
424
+ couldNotLoad: "Your decisions could not be loaded.",
425
+ empty: {
426
+ title: "No decision is yours",
427
+ body: "A decision for you, by you or your agent or by someone who named you, and one you asked of someone else, show up here.",
428
+ },
429
+ waiting: "Waiting for you",
430
+ noneWaiting: "Nothing waits for your answer.",
431
+ raised: "Asked of others",
432
+ noneRaised: "You have asked nothing of others.",
433
+ answered: "Answered",
434
+ noneAnswered: "Nothing answered yet.",
435
+ more: "Show more",
436
+ },
437
+
404
438
  calendar: {
405
439
  title: "Calendar",
406
440
  grid: "The month",
@@ -413,6 +447,11 @@ export const en = {
413
447
  nothingOverdue: "Nothing is overdue.",
414
448
  unscheduled: "No day set",
415
449
  allScheduled: "Every open task has a day.",
450
+ more: (n: number) => `${n} more`,
451
+ fewer: "Fewer",
452
+ onDay: (day: string) => `Tasks on ${day}`,
453
+ nothingOnDay: "Nothing is on this day.",
454
+ close: "Close",
416
455
  week: {
417
456
  title: "The week",
418
457
  previous: "The week before",
@@ -425,7 +464,7 @@ export const en = {
425
464
  person: "Person",
426
465
  open: "Open",
427
466
  inProgress: "In progress",
428
- dueSoon: "Due in 7 days",
467
+ dueThisWeek: "Due this week",
429
468
  overdue: "Overdue",
430
469
  unassigned: "Nobody's yet",
431
470
  },
@@ -497,15 +536,15 @@ export const en = {
497
536
  loading: "Loading your work",
498
537
  couldNotLoad: "Your work could not be loaded.",
499
538
  empty: {
500
- title: "Nothing is assigned to you",
501
- body: "A task assigned to you in any project you may see shows up here.",
539
+ title: "Nothing is on your plate",
540
+ body: "A task you work on, in any project you may see, shows up here.",
502
541
  },
503
542
  overdue: "Overdue",
504
543
  thisWeek: "Due this week",
505
544
  later: "Later",
506
545
  noDay: "No day set",
507
- decisions: "Decisions waiting for a person",
508
- noDecisions: "No decision waits.",
546
+ decisions: "Decisions waiting for you",
547
+ noDecisions: "No decision waits for your answer.",
509
548
  inProject: (project: string) => `in ${project}`,
510
549
  },
511
550
 
@@ -609,7 +648,7 @@ export const en = {
609
648
  title: "the title",
610
649
  body: "the body",
611
650
  priority: "the priority",
612
- assigneeId: "the assignee",
651
+ workers: "the workers",
613
652
  parentId: "what it is part of",
614
653
  links: "the links",
615
654
  name: "the name",
@@ -669,6 +708,8 @@ export const en = {
669
708
  runFinished: (task: string) => `finished ${task}`,
670
709
  runFailed: (task: string) => `failed on ${task}`,
671
710
  runAbandoned: (task: string) => `gave up on ${task}`,
711
+ runUnheard: (task: string, agent: string) =>
712
+ `ended the run of ${agent} on ${task}, not heard from for too long`,
672
713
  documentWritten: (page: string, version: number | undefined) =>
673
714
  `wrote ${page}${version === undefined ? "" : `, version ${version}`}`,
674
715
  documentArchived: (page: string) => `archived ${page}`,
@@ -793,6 +834,7 @@ export const en = {
793
834
  version: (n: number) => `v${n}`,
794
835
  versionWord: "version",
795
836
  writtenBy: "written by",
837
+ author: "Written by",
796
838
  versionOf: (n: number, of: number) => `Version ${n} of ${of}`,
797
839
  showLatest: "Show the latest",
798
840
  archivedNotice: "This page is archived: out of the folders and the search, and not written to.",
@@ -805,6 +847,8 @@ export const en = {
805
847
  decisionPrefix: "Decision: ",
806
848
  files: "Files",
807
849
  fileToAttach: "A file to attach",
850
+ chooseFile: "Choose a file",
851
+ noFileChosen: "No file chosen",
808
852
  labelPlaceholder: "What to call it, if not its name",
809
853
  attach: "Attach",
810
854
  by: "by",
@@ -861,8 +905,8 @@ export const en = {
861
905
  loadingWork: "Loading the work",
862
906
  couldNotLoadWork: "The work could not be loaded.",
863
907
  noWork: {
864
- title: (name: string) => `Nothing is assigned to ${name}`,
865
- body: "An open task assigned to them, in a project you may see, shows up here.",
908
+ title: (name: string) => `Nothing is on ${name}'s plate`,
909
+ body: "An open task they work on, in a project you may see, shows up here.",
866
910
  },
867
911
  notOverseen: {
868
912
  title: "Not yours to see",
package/src/i18n/ko.ts CHANGED
@@ -83,11 +83,17 @@ export const ko: Messages = {
83
83
  next: "다음",
84
84
  range: (from, to, of) => `${of}건 중 ${from}-${to}`,
85
85
  },
86
+ picker: {
87
+ nothingFound: "맞는 것이 없습니다",
88
+ searching: "검색 중",
89
+ more: "더 보기",
90
+ },
86
91
  },
87
92
 
88
93
  nav: {
89
94
  projects: "프로젝트",
90
95
  work: "내 작업",
96
+ myDecisions: "내 결정",
91
97
  people: "사람들",
92
98
  agents: "에이전트",
93
99
  board: "보드",
@@ -234,8 +240,11 @@ export const ko: Messages = {
234
240
  menu: "작업 메뉴",
235
241
  decisions: (n) => `결정 ${n}건`,
236
242
  decisionsTitle: "사람을 기다리는 결정",
243
+ unfold: (column) => `${column} 펼치기`,
244
+ fold: (column) => `${column} 접기`,
237
245
  filters: {
238
246
  aria: "보드 좁혀 보기",
247
+ words: "제목, 번호, 사람",
239
248
  everyone: "모두",
240
249
  mine: "내 작업",
241
250
  anyCategory: "모든 카테고리",
@@ -264,7 +273,7 @@ export const ko: Messages = {
264
273
  },
265
274
  partOf: "상위 작업:",
266
275
  owner: "담당자",
267
- assignee: "배정",
276
+ workers: "작업자",
268
277
  written: "작성",
269
278
  changed: "변경",
270
279
  state: "상태",
@@ -298,8 +307,11 @@ export const ko: Messages = {
298
307
  bodyPlaceholder: "무엇을 할지, Markdown으로.",
299
308
  state: "상태",
300
309
  priority: "우선순위",
301
- assignee: "배정",
310
+ workers: "작업자",
311
+ addWorker: "작업자 추가",
302
312
  partOf: "상위 작업",
313
+ searchTasks: "번호나 제목으로 검색",
314
+ searchGoals: "제목으로 검색",
303
315
  category: "카테고리",
304
316
  noCategory: "카테고리 없음",
305
317
  goal: "목표",
@@ -332,6 +344,8 @@ export const ko: Messages = {
332
344
  record: "기록",
333
345
  openRecord: "열기",
334
346
  waitingForPerson: "사람을 기다리는 중입니다.",
347
+ waitingFor: (name) => `${name}의 답을 기다리는 중입니다.`,
348
+ peopleLabel: (asker, decider) => `올린 사람 ${asker}, 답할 사람 ${decider}`,
335
349
  options: "선택지",
336
350
  notePlaceholder: "덧붙일 말이 있다면",
337
351
  own: "직접 입력",
@@ -354,6 +368,9 @@ export const ko: Messages = {
354
368
  contextPlaceholder: "답하려면 알아야 할 것, Markdown으로.",
355
369
  about: "관련 작업",
356
370
  noTask: "특정 작업 없음",
371
+ decider: "결정할 사람",
372
+ deciderPlaceholder: "지정하지 않으면 본인",
373
+ me: "(나)",
357
374
  options: "선택지",
358
375
  option: (n) => `선택지 ${n}`,
359
376
  addOption: "선택지 추가",
@@ -361,6 +378,23 @@ export const ko: Messages = {
361
378
  },
362
379
  },
363
380
 
381
+ myDecisions: {
382
+ title: "내 결정",
383
+ loading: "내 결정을 불러오는 중",
384
+ couldNotLoad: "내 결정을 불러올 수 없습니다.",
385
+ empty: {
386
+ title: "내 결정이 없습니다",
387
+ body: "내게 온 결정과 내가 다른 사람에게 올린 결정이 여기에 모입니다. 내가 올린 결정은 내 에이전트가 올린 것을 포함합니다.",
388
+ },
389
+ waiting: "내 답을 기다리는 중",
390
+ noneWaiting: "내 답을 기다리는 결정이 없습니다.",
391
+ raised: "내가 다른 사람에게 올린 결정",
392
+ noneRaised: "다른 사람에게 올린 결정이 없습니다.",
393
+ answered: "답변됨",
394
+ noneAnswered: "아직 답한 결정이 없습니다.",
395
+ more: "더 보기",
396
+ },
397
+
364
398
  calendar: {
365
399
  title: "캘린더",
366
400
  grid: "이 달",
@@ -373,6 +407,11 @@ export const ko: Messages = {
373
407
  nothingOverdue: "기한이 지난 작업이 없습니다.",
374
408
  unscheduled: "날짜 없음",
375
409
  allScheduled: "열린 작업마다 날짜가 있습니다.",
410
+ more: (n) => `${n}개 더`,
411
+ fewer: "접기",
412
+ onDay: (day) => `${day}의 작업`,
413
+ nothingOnDay: "이 날에 잡힌 작업이 없습니다.",
414
+ close: "닫기",
376
415
  week: {
377
416
  title: "이 주",
378
417
  previous: "이전 주",
@@ -381,13 +420,13 @@ export const ko: Messages = {
381
420
  nothing: "이 주에 잡힌 작업이 없습니다.",
382
421
  },
383
422
  workload: {
384
- title: "누가 무엇을",
423
+ title: "담당자별 작업 현황",
385
424
  person: "사람",
386
425
  open: "열림",
387
426
  inProgress: "진행 중",
388
- dueSoon: "7일 내 마감",
427
+ dueThisWeek: "이번 주 마감",
389
428
  overdue: "기한 지남",
390
- unassigned: "아직 배정 없음",
429
+ unassigned: "아직 작업자 없음",
391
430
  },
392
431
  },
393
432
 
@@ -456,15 +495,15 @@ export const ko: Messages = {
456
495
  loading: "내 작업을 불러오는 중",
457
496
  couldNotLoad: "내 작업을 불러올 수 없습니다.",
458
497
  empty: {
459
- title: "내게 배정된 작업이 없습니다",
460
- body: "볼 수 있는 어느 프로젝트에서든 내게 배정된 작업이 여기에 나타납니다.",
498
+ title: "내가 맡은 작업이 없습니다",
499
+ body: "볼 수 있는 어느 프로젝트에서든 내가 작업자인 작업이 여기에 나타납니다.",
461
500
  },
462
501
  overdue: "기한 지남",
463
502
  thisWeek: "이번 주 마감",
464
503
  later: "그 뒤",
465
504
  noDay: "날짜 없음",
466
- decisions: "사람을 기다리는 결정",
467
- noDecisions: "기다리는 결정이 없습니다.",
505
+ decisions: "내 답을 기다리는 결정",
506
+ noDecisions: "내 답을 기다리는 결정이 없습니다.",
468
507
  inProject: (project) => `${project}에서`,
469
508
  },
470
509
 
@@ -567,7 +606,7 @@ export const ko: Messages = {
567
606
  title: "제목",
568
607
  body: "본문",
569
608
  priority: "우선순위",
570
- assigneeId: "배정",
609
+ workers: "작업자",
571
610
  parentId: "상위 작업",
572
611
  links: "링크",
573
612
  name: "이름",
@@ -624,6 +663,8 @@ export const ko: Messages = {
624
663
  runFinished: (task) => `${task}을(를) 끝냈습니다`,
625
664
  runFailed: (task) => `${task}에 실패했습니다`,
626
665
  runAbandoned: (task) => `${task}을(를) 포기했습니다`,
666
+ runUnheard: (task, agent) =>
667
+ `${task}의 ${agent} 런을 끝냈습니다. 너무 오래 소식이 없었습니다`,
627
668
  documentWritten: (page, version) =>
628
669
  `${page}을(를) 썼습니다${version === undefined ? "" : `, 버전 ${version}`}`,
629
670
  documentArchived: (page) => `${page}을(를) 보관했습니다`,
@@ -749,6 +790,7 @@ export const ko: Messages = {
749
790
  version: (n) => `v${n}`,
750
791
  versionWord: "버전",
751
792
  writtenBy: "작성:",
793
+ author: "작성",
752
794
  versionOf: (n, of) => `버전 ${n} / ${of}`,
753
795
  showLatest: "최신 버전 보기",
754
796
  archivedNotice: "이 페이지는 보관됐습니다. 폴더와 검색에서 빠지고, 쓸 수 없습니다.",
@@ -761,6 +803,8 @@ export const ko: Messages = {
761
803
  decisionPrefix: "결정: ",
762
804
  files: "파일",
763
805
  fileToAttach: "첨부할 파일",
806
+ chooseFile: "파일 선택",
807
+ noFileChosen: "선택된 파일 없음",
764
808
  labelPlaceholder: "파일 이름 대신 부를 이름",
765
809
  attach: "첨부",
766
810
  by: "첨부:",
@@ -816,8 +860,8 @@ export const ko: Messages = {
816
860
  loadingWork: "작업을 불러오는 중",
817
861
  couldNotLoadWork: "작업을 불러올 수 없습니다.",
818
862
  noWork: {
819
- title: (name) => `${name}에게 배정된 작업이 없습니다`,
820
- body: "내가 볼 수 있는 프로젝트에서 그 사람에게 배정된 열린 작업이 여기에 나타납니다.",
863
+ title: (name) => `${name}에게 맡겨진 작업이 없습니다`,
864
+ body: "내가 볼 수 있는 프로젝트에서 그 사람이 작업자인 열린 작업이 여기에 나타납니다.",
821
865
  },
822
866
  notOverseen: {
823
867
  title: "볼 수 없는 작업입니다",
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export {
11
11
  type BoardProps,
12
12
  byDue,
13
13
  columnStateOf,
14
+ FOLDED_STATES,
14
15
  filterTasks,
15
16
  TaskCard,
16
17
  } from "./components/board.js";
@@ -82,6 +83,7 @@ export {
82
83
  goalMonth,
83
84
  } from "./components/goals.js";
84
85
  export { Markdown, type MarkdownProps } from "./components/markdown.js";
86
+ export { MyDecisions, type MyDecisionsProps } from "./components/my-decisions.js";
85
87
  export {
86
88
  PackConnect,
87
89
  type PackConnectProps,
@@ -102,6 +104,13 @@ export {
102
104
  PeopleList,
103
105
  type PeopleListProps,
104
106
  } from "./components/people.js";
107
+ export {
108
+ PICKER_PAGE_LIMIT,
109
+ Picker,
110
+ type PickerPage,
111
+ type PickerProps,
112
+ type PickerSearch,
113
+ } from "./components/picker.js";
105
114
  export {
106
115
  clampScale,
107
116
  FITTED,
@@ -168,7 +177,14 @@ export {
168
177
  } from "./components/shell.js";
169
178
  export { SignIn, type SignInProps } from "./components/sign-in.js";
170
179
  export { SkillList, type SkillListProps } from "./components/skills.js";
171
- export { TaskForm, type TaskFormProps } from "./components/task-form.js";
180
+ export {
181
+ type GoalSearch,
182
+ goalLabel,
183
+ TaskForm,
184
+ type TaskFormProps,
185
+ type TaskSearch,
186
+ taskLabel,
187
+ } from "./components/task-form.js";
172
188
  export { TaskList, type TaskListProps } from "./components/task-list.js";
173
189
  export { TaskView, type TaskViewProps } from "./components/task-view.js";
174
190
  export {
@@ -193,6 +209,7 @@ export {
193
209
  formatBytes,
194
210
  formatInstant,
195
211
  GoalStateBadge,
212
+ LinkButton,
196
213
  PersonChip,
197
214
  PRIORITY_LABELS,
198
215
  PriorityBadge,
@@ -204,6 +221,7 @@ export {
204
221
  STATE_LABELS,
205
222
  StateBadge,
206
223
  Time,
224
+ Workers,
207
225
  } from "./components/ui.js";
208
226
  export { WorkList, type WorkListProps } from "./components/work.js";
209
227
  export {
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
@@ -21,15 +21,20 @@ export type DocsView =
21
21
  /**
22
22
  * What the board is narrowed to (ADR-0019), from the query: a category by its key (`""` for
23
23
  * the tasks with none), a goal by its id (`""` for the tasks with none), a person by their id,
24
- * or the person's own.
24
+ * the person's own, or words (`q`), as they are typed, each of which a task's title, number,
25
+ * owner, worker or category must contain.
25
26
  */
26
27
  export interface BoardFilter {
27
28
  readonly category?: string | undefined;
28
29
  readonly goal?: string | undefined;
29
30
  readonly person?: string | undefined;
30
31
  readonly mine?: boolean | undefined;
32
+ readonly words?: string | undefined;
31
33
  }
32
34
 
35
+ /** As much of the words as the address keeps: enough for any search, bounded as every input is. */
36
+ const BOARD_WORDS_LENGTH = 200;
37
+
33
38
  export type Route =
34
39
  | { readonly name: "projects" }
35
40
  | { readonly name: "new-project" }
@@ -100,6 +105,8 @@ export type Route =
100
105
  /** What is on the person's plate across their projects. */
101
106
  /** What is on the person's plate: a day of the week shown at the top, or today's when the address names none. */
102
107
  | { readonly name: "work"; readonly week: string | undefined }
108
+ /** The decisions addressed to the person (ADR-0042), across the projects they may see. */
109
+ | { readonly name: "my-decisions" }
103
110
  /** The categories tasks are sorted into; an administrator keeps them here. */
104
111
  | { readonly name: "categories" }
105
112
  /** Where a person approves an agent's connection, by the code it showed, or types one. */
@@ -136,6 +143,8 @@ export const PATHS = {
136
143
  newProject: "/projects/new",
137
144
  /** What is on the person's plate, across the projects they may see. */
138
145
  work: "/work",
146
+ /** The decisions addressed to the person (ADR-0042), across the projects they may see. */
147
+ decisions: "/decisions",
139
148
  people: "/people",
140
149
  /** The form where an administrator lets someone in by login. */
141
150
  newListing: "/people/new",
@@ -187,11 +196,13 @@ const boardFilterOf = (params: URLSearchParams): BoardFilter => {
187
196
  const category = params.get("category");
188
197
  const goal = params.get("goal");
189
198
  const person = params.get("person");
199
+ const q = params.get("q");
190
200
  return {
191
201
  ...(category !== null && (category === "" || PROJECT_KEY.test(category)) ? { category } : {}),
192
202
  ...(goal !== null && (goal === "" || UUID.test(goal)) ? { goal } : {}),
193
203
  ...(person !== null && UUID.test(person) ? { person } : {}),
194
204
  ...(params.has("mine") ? { mine: true } : {}),
205
+ ...(q !== null && q.trim() !== "" ? { words: q.slice(0, BOARD_WORDS_LENGTH) } : {}),
195
206
  };
196
207
  };
197
208
 
@@ -239,6 +250,9 @@ export function matchRoute(pathname: string, search = ""): Route {
239
250
  const shown = weekShown(params);
240
251
  return shown === undefined ? NOT_FOUND : { name: "work", ...shown };
241
252
  }
253
+ if (path === PATHS.decisions) {
254
+ return { name: "my-decisions" };
255
+ }
242
256
  if (path === PATHS.people) {
243
257
  return { name: "people" };
244
258
  }
@@ -462,6 +476,9 @@ function filterParts(filter: BoardFilter): string[] {
462
476
  if (filter.mine === true) {
463
477
  parts.push("mine");
464
478
  }
479
+ if (filter.words !== undefined) {
480
+ parts.push(`q=${encodeURIComponent(filter.words)}`);
481
+ }
465
482
  return parts;
466
483
  }
467
484
 
package/src/routes.ts CHANGED
@@ -27,8 +27,10 @@ export const REST_ROUTES = {
27
27
  connect: "/api/v1/connect",
28
28
  /** The categories tasks are sorted into (ADR-0019): the workspace's vocabulary, kept by an administrator. */
29
29
  categories: "/api/v1/categories",
30
- /** What is on the asker's plate across the projects they may see: their open tasks, and the decisions waiting. */
30
+ /** What is on the asker's plate across the projects they may see: their open tasks, and the decisions waiting for them. */
31
31
  work: "/api/v1/work",
32
+ /** The decisions addressed to the asker (ADR-0042) across the projects they may see: the waiting first, then the record. */
33
+ decisions: "/api/v1/decisions",
32
34
  /** The rules of the board (ADR-0023): the console's own until an administrator writes the organization's. */
33
35
  rules: "/api/v1/rules",
34
36
  } as const;
package/src/rules.ts CHANGED
@@ -41,7 +41,7 @@ export const REFERENCE_RULES = [
41
41
  "",
42
42
  "## Decide alone, or ask",
43
43
  "",
44
- "Alone: how to do what the task settles, which skill to load, what to write on pages, and a commit or a push where the repository's agreement allows it. On the board, with `console ask`: a trade-off the task leaves open, a change of scope or of the plan, anything that costs money, anything that deletes. Answered once, never asked again.",
44
+ "Alone: how to do what the task settles, which skill to load, what to write on pages, and a commit or a push where the repository's agreement allows it. On the board, with `console ask`: a trade-off the task leaves open, a change of scope or of the plan, anything that costs money, anything that deletes. Answered once, never asked again. A decision is the record of a choice that is a person's to make, wherever they make it: an answer given to you in chat, in a meeting or by changing the task is written on the decision in the person's name (`console answer`), with where it was said, so that the board shows as waiting only what is still open and a run waits on the record, not on memory. Asked what is on a person's plate, or for a briefing, start from the decisions waiting for their answer (`console work`), each with what waits on it and since when, before the tasks.",
45
45
  "",
46
46
  "## Reports",
47
47
  "",
package/src/schemas.ts CHANGED
@@ -39,6 +39,7 @@ import {
39
39
  MAX_TOKEN_DAYS,
40
40
  MAX_TOKEN_NAME_LENGTH,
41
41
  MAX_URL_LENGTH,
42
+ MAX_WORKERS,
42
43
  MIN_OPTIONS,
43
44
  } from "./limits.js";
44
45
  import { hasForbiddenCodePoint } from "./text.js";
@@ -480,8 +481,10 @@ export const restTaskSchema = z.object({
480
481
  body: z.string(),
481
482
  state: z.enum(TASK_STATES),
482
483
  priority: z.enum(TASK_PRIORITIES),
484
+ /** Whose task it is: one person, whoever wrote it. */
483
485
  owner: restPersonSchema,
484
- assignee: z.nullable(restPersonSchema),
486
+ /** The people at work on it (ADR-0037), in the order they came to it; `[]` while nobody is. */
487
+ workers: z.array(restPersonSchema),
485
488
  /** The task this one is part of, or `null`. */
486
489
  parentId: z.nullable(uuid),
487
490
  /** The category the task is sorted into, as the workspace keeps it, or `null`. */
@@ -530,7 +533,8 @@ export const restTaskInputSchema = z.object({
530
533
  body: z.optional(body),
531
534
  state: z.optional(z.enum(TASK_STATES)),
532
535
  priority: z.optional(z.enum(TASK_PRIORITIES)),
533
- assigneeId: z.optional(z.nullable(uuid)),
536
+ /** The people to be at work on it, each one who may work in the project, in place of those there were; `[]` for nobody. */
537
+ workerIds: z.optional(z.array(uuid).check(z.maxLength(MAX_WORKERS))),
534
538
  parentId: z.optional(z.nullable(uuid)),
535
539
  /** The key of a category of the workspace, or `null` for none. */
536
540
  category: z.optional(z.nullable(categoryKey)),
@@ -549,7 +553,7 @@ export const restTaskPatchSchema = z.object({
549
553
  body: z.optional(body),
550
554
  state: z.optional(z.enum(TASK_STATES)),
551
555
  priority: z.optional(z.enum(TASK_PRIORITIES)),
552
- assigneeId: z.optional(z.nullable(uuid)),
556
+ workerIds: z.optional(z.array(uuid).check(z.maxLength(MAX_WORKERS))),
553
557
  parentId: z.optional(z.nullable(uuid)),
554
558
  category: z.optional(z.nullable(categoryKey)),
555
559
  goalId: z.optional(z.nullable(uuid)),
@@ -596,8 +600,8 @@ export const restGoalSchema = z.object({
596
600
  });
597
601
  export type RestGoal = z.infer<typeof restGoalSchema>;
598
602
 
599
- /** `GET /api/v1/projects/<key>/goals`: the roadmap, the active goals first. */
600
- export const restGoalsSchema = z.object({ items: z.array(restGoalSchema) });
603
+ /** `GET /api/v1/projects/<key>/goals`: a page of the roadmap, the active goals first, and whether there is more after it. */
604
+ export const restGoalsSchema = z.object({ items: z.array(restGoalSchema), more: z.boolean() });
601
605
  export type RestGoals = z.infer<typeof restGoalsSchema>;
602
606
 
603
607
  /** What `POST /api/v1/projects/<key>/goals` is sent: the title, and the rest with defaults. */
@@ -648,6 +652,8 @@ export const restDecisionSchema = z.object({
648
652
  /** The task's number, when there is a task, or `null`. */
649
653
  taskNumber: z.nullable(z.int()),
650
654
  raisedBy: restPersonSchema,
655
+ /** Who is to answer (ADR-0042): the raiser, unless another person of the project was named. */
656
+ decider: restPersonSchema,
651
657
  /** The run that raised it, as the agent asked, or `null` when a person did. */
652
658
  run: z.nullable(z.object({ id: uuid, agent: z.string() })),
653
659
  /** The answer, with who gave it and when; `null` while the decision waits. */
@@ -686,9 +692,9 @@ const projectRef = z.object({
686
692
 
687
693
  /**
688
694
  * `GET /api/v1/work`: what is on the asker's plate across the projects they may see (ADR-0019):
689
- * the open tasks assigned to them, and the decisions that wait for a person, each with its
690
- * project; and, for the week on the plate, `closed`, the tasks assigned to them that are done
691
- * or dropped and not yet put away. Left out by a console older than it.
695
+ * the open tasks they work on, and the decisions that wait for their answer (ADR-0042), each
696
+ * with its project; and, for the week on the plate, `closed`, the tasks they work on that are
697
+ * done or dropped and not yet put away. Left out by a console older than it.
692
698
  */
693
699
  export const restWorkSchema = z.object({
694
700
  tasks: z.array(z.object({ project: projectRef, task: restTaskSchema })),
@@ -697,6 +703,17 @@ export const restWorkSchema = z.object({
697
703
  });
698
704
  export type RestWork = z.infer<typeof restWorkSchema>;
699
705
 
706
+ /**
707
+ * `GET /api/v1/decisions`: a page of the decisions addressed to the asker (ADR-0042) across the
708
+ * projects they may see, each with its project: the ones that wait first, oldest first among
709
+ * them, then the answered, newest first; and whether there is more.
710
+ */
711
+ export const restMyDecisionsSchema = z.object({
712
+ items: z.array(z.object({ project: projectRef, decision: restDecisionSchema })),
713
+ more: z.boolean(),
714
+ });
715
+ export type RestMyDecisions = z.infer<typeof restMyDecisionsSchema>;
716
+
700
717
  /**
701
718
  * What `GET /api/v1/people/<id>/work` answers: another person's open tasks, and their closed
702
719
  * ones for the week, within the projects the asker may see, for whoever oversees them. No
@@ -718,6 +735,8 @@ export const restDecisionInputSchema = z.object({
718
735
  taskId: z.optional(z.nullable(uuid)),
719
736
  /** The run that asks, when an agent does: the decision is about its task, and it waits for the answer. */
720
737
  runId: z.optional(z.nullable(uuid)),
738
+ /** Who is to answer (ADR-0042): a person who may work in the project; the asker when left out. */
739
+ deciderId: z.optional(uuid),
721
740
  });
722
741
  export type RestDecisionInput = z.infer<typeof restDecisionInputSchema>;
723
742
 
@@ -775,8 +794,9 @@ export const restEventDataSchema = z.object({
775
794
  name: z.optional(z.string()),
776
795
  /** For what an agent did: what it calls itself. */
777
796
  agent: z.optional(z.string()),
778
- /** For `run.ended`: how. */
797
+ /** For `run.ended`: how, and, when the console ended the run itself, why (ADR-0041). */
779
798
  status: z.optional(z.enum(RUN_STATUSES)),
799
+ reason: z.optional(z.literal("unheard")),
780
800
  /** For `run.handed_in`: what the artifact is called. */
781
801
  label: z.optional(z.string()),
782
802
  /** For `run.reported` and `task.commented`: the first words of what was written. */