@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.
- package/README.md +4 -4
- package/dist/api.d.ts +4 -4
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +4 -4
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +201 -25
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +15 -11
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +59 -26
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +1 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/pack.d.ts +7 -2
- package/dist/cli/pack.d.ts.map +1 -1
- package/dist/cli/pack.js +16 -2
- package/dist/cli/pack.js.map +1 -1
- package/dist/client.d.ts +20 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +17 -3
- package/dist/client.js.map +1 -1
- package/dist/compat.d.ts +28 -6
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +55 -14
- package/dist/compat.js.map +1 -1
- package/dist/components/board.d.ts +12 -1
- package/dist/components/board.d.ts.map +1 -1
- package/dist/components/board.js +57 -7
- package/dist/components/board.js.map +1 -1
- package/dist/components/calendar.d.ts +17 -7
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +89 -38
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/decision-form.d.ts +12 -4
- package/dist/components/decision-form.d.ts.map +1 -1
- package/dist/components/decision-form.js +24 -6
- package/dist/components/decision-form.js.map +1 -1
- package/dist/components/decision-list.d.ts +4 -0
- package/dist/components/decision-list.d.ts.map +1 -1
- package/dist/components/decision-list.js +9 -6
- package/dist/components/decision-list.js.map +1 -1
- package/dist/components/documents.d.ts.map +1 -1
- package/dist/components/documents.js +3 -3
- package/dist/components/documents.js.map +1 -1
- package/dist/components/event-feed.d.ts.map +1 -1
- package/dist/components/event-feed.js +63 -8
- package/dist/components/event-feed.js.map +1 -1
- package/dist/components/my-decisions.d.ts +20 -0
- package/dist/components/my-decisions.d.ts.map +1 -0
- package/dist/components/my-decisions.js +36 -0
- package/dist/components/my-decisions.js.map +1 -0
- package/dist/components/people.d.ts.map +1 -1
- package/dist/components/people.js +1 -1
- package/dist/components/people.js.map +1 -1
- package/dist/components/picker.d.ts +39 -0
- package/dist/components/picker.d.ts.map +1 -0
- package/dist/components/picker.js +155 -0
- package/dist/components/picker.js.map +1 -0
- package/dist/components/projects.d.ts.map +1 -1
- package/dist/components/projects.js +3 -3
- package/dist/components/projects.js.map +1 -1
- package/dist/components/roadmap.js +1 -1
- package/dist/components/roadmap.js.map +1 -1
- package/dist/components/runs.d.ts.map +1 -1
- package/dist/components/runs.js +1 -1
- package/dist/components/runs.js.map +1 -1
- package/dist/components/shell.d.ts.map +1 -1
- package/dist/components/shell.js +36 -1
- package/dist/components/shell.js.map +1 -1
- package/dist/components/task-form.d.ts +18 -4
- package/dist/components/task-form.d.ts.map +1 -1
- package/dist/components/task-form.js +56 -13
- package/dist/components/task-form.js.map +1 -1
- package/dist/components/task-list.js +2 -2
- package/dist/components/task-list.js.map +1 -1
- package/dist/components/task-view.d.ts +7 -1
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js +7 -6
- package/dist/components/task-view.js.map +1 -1
- package/dist/components/ui.d.ts +17 -0
- package/dist/components/ui.d.ts.map +1 -1
- package/dist/components/ui.js +26 -11
- package/dist/components/ui.js.map +1 -1
- package/dist/components/work.d.ts.map +1 -1
- package/dist/components/work.js +5 -3
- package/dist/components/work.js.map +1 -1
- package/dist/console.css +1794 -433
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +93 -10
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +21 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +24 -1
- package/dist/data.js.map +1 -1
- package/dist/i18n/en.d.ts +45 -3
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +52 -10
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +54 -12
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +2 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +2 -0
- package/dist/limits.js.map +1 -1
- package/dist/router.d.ts +9 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +12 -0
- package/dist/router.js.map +1 -1
- package/dist/routes.d.ts +3 -1
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +3 -1
- package/dist/routes.js.map +1 -1
- package/dist/rules.js +1 -1
- package/dist/rules.js.map +1 -1
- package/dist/schemas.d.ts +252 -12
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +27 -10
- package/dist/schemas.js.map +1 -1
- package/dist/vocabulary.d.ts +2 -0
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +2 -0
- package/dist/vocabulary.js.map +1 -1
- package/docs/specs/cli.md +14 -13
- package/docs/specs/rest.md +24 -19
- package/package.json +2 -2
- package/skills/building-a-console/SKILL.md +4 -4
- package/skills/building-a-console/references/the-default-console.md +4 -4
- package/skills/building-a-console/references/the-look-from-a-website.md +5 -5
- package/skills/deploying-a-console/SKILL.md +2 -2
- package/skills/deploying-a-console/references/resources.md +1 -1
- package/skills/working-the-board/SKILL.md +8 -6
- package/skills/working-the-board/references/terms.md +3 -3
- package/src/api.ts +7 -0
- package/src/cli/cli.ts +254 -25
- package/src/cli/format.ts +22 -11
- package/src/cli/help.ts +63 -26
- package/src/cli/main.ts +1 -0
- package/src/cli/pack.ts +17 -1
- package/src/client.ts +44 -11
- package/src/compat.ts +63 -14
- package/src/components/board.tsx +124 -25
- package/src/components/calendar.tsx +258 -117
- package/src/components/decision-form.tsx +71 -23
- package/src/components/decision-list.tsx +30 -3
- package/src/components/documents.tsx +27 -11
- package/src/components/event-feed.tsx +116 -33
- package/src/components/my-decisions.tsx +138 -0
- package/src/components/people.tsx +3 -1
- package/src/components/picker.tsx +297 -0
- package/src/components/projects.tsx +7 -5
- package/src/components/roadmap.tsx +1 -1
- package/src/components/runs.tsx +5 -1
- package/src/components/shell.tsx +36 -1
- package/src/components/task-form.tsx +149 -63
- package/src/components/task-list.tsx +3 -3
- package/src/components/task-view.tsx +71 -56
- package/src/components/ui.tsx +89 -11
- package/src/components/work.tsx +6 -4
- package/src/console.tsx +157 -29
- package/src/data.ts +61 -1
- package/src/i18n/en.ts +54 -10
- package/src/i18n/ko.ts +56 -12
- package/src/index.ts +19 -1
- package/src/limits.ts +2 -0
- package/src/router.ts +18 -1
- package/src/routes.ts +3 -1
- package/src/rules.ts +1 -1
- package/src/schemas.ts +29 -9
- package/src/styles/console.css +1794 -433
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
501
|
-
body: "A task
|
|
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
|
|
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
|
-
|
|
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
|
|
865
|
-
body: "An open task
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
690
|
-
* project; and, for the week on the plate, `closed`, the tasks
|
|
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. */
|