@skillcdn/console 0.3.2 → 0.4.1
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 -3
- package/dist/api.d.ts +2 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +132 -18
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +6 -4
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +72 -21
- package/dist/cli/help.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 +19 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +11 -1
- package/dist/client.js.map +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +2 -2
- package/dist/components/board.d.ts +12 -1
- package/dist/components/board.d.ts.map +1 -1
- package/dist/components/board.js +52 -4
- package/dist/components/board.js.map +1 -1
- package/dist/components/calendar.d.ts +4 -0
- package/dist/components/calendar.d.ts.map +1 -1
- package/dist/components/calendar.js +61 -22
- 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/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +6 -3
- package/dist/components/markdown.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/pack-connect.d.ts +3 -1
- package/dist/components/pack-connect.d.ts.map +1 -1
- package/dist/components/pack-connect.js +4 -4
- package/dist/components/pack-connect.js.map +1 -1
- package/dist/components/pack-token.d.ts +3 -1
- package/dist/components/pack-token.d.ts.map +1 -1
- package/dist/components/pack-token.js +1 -1
- package/dist/components/pack-token.js.map +1 -1
- package/dist/components/people.d.ts.map +1 -1
- package/dist/components/people.js +14 -3
- package/dist/components/people.js.map +1 -1
- 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/remote-pictures.d.ts +6 -0
- package/dist/components/remote-pictures.d.ts.map +1 -0
- package/dist/components/remote-pictures.js +8 -0
- package/dist/components/remote-pictures.js.map +1 -0
- 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/sign-in.d.ts.map +1 -1
- package/dist/components/sign-in.js +49 -2
- package/dist/components/sign-in.js.map +1 -1
- package/dist/components/task-list.js +1 -1
- package/dist/components/task-list.js.map +1 -1
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js +2 -2
- package/dist/components/task-view.js.map +1 -1
- package/dist/components/ui.d.ts +13 -2
- package/dist/components/ui.d.ts.map +1 -1
- package/dist/components/ui.js +21 -14
- package/dist/components/ui.js.map +1 -1
- package/dist/console.css +1686 -425
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +83 -13
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +15 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +18 -19
- package/dist/data.js.map +1 -1
- package/dist/i18n/en.d.ts +48 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +50 -3
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +47 -4
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +14 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +14 -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 +5 -1
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +5 -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 +272 -4
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +33 -8
- package/dist/schemas.js.map +1 -1
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +3 -2
- package/dist/web.js.map +1 -1
- package/docs/specs/cli.md +11 -10
- package/docs/specs/rest.md +33 -17
- package/package.json +2 -2
- package/skills/building-a-console/SKILL.md +5 -5
- 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/working-the-board/SKILL.md +6 -4
- package/skills/working-the-board/references/setting-up.md +1 -1
- package/skills/working-the-board/references/terms.md +1 -1
- package/src/api.ts +10 -0
- package/src/cli/cli.ts +162 -19
- package/src/cli/format.ts +11 -4
- package/src/cli/help.ts +79 -20
- package/src/cli/pack.ts +17 -1
- package/src/client.ts +51 -2
- package/src/compat.ts +2 -2
- package/src/components/board.tsx +114 -21
- package/src/components/calendar.tsx +207 -102
- 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/markdown.tsx +6 -3
- package/src/components/my-decisions.tsx +138 -0
- package/src/components/pack-connect.tsx +10 -7
- package/src/components/pack-token.tsx +4 -1
- package/src/components/people.tsx +20 -8
- package/src/components/projects.tsx +7 -5
- package/src/components/remote-pictures.ts +19 -0
- package/src/components/roadmap.tsx +1 -1
- package/src/components/runs.tsx +5 -1
- package/src/components/shell.tsx +36 -1
- package/src/components/sign-in.tsx +114 -13
- package/src/components/task-list.tsx +1 -1
- package/src/components/task-view.tsx +48 -47
- package/src/components/ui.tsx +70 -14
- package/src/console.tsx +153 -32
- package/src/data.ts +37 -20
- package/src/i18n/en.ts +53 -3
- package/src/i18n/ko.ts +50 -4
- package/src/index.ts +3 -0
- package/src/limits.ts +14 -0
- package/src/router.ts +18 -1
- package/src/routes.ts +5 -1
- package/src/rules.ts +1 -1
- package/src/schemas.ts +37 -8
- package/src/styles/console.css +1686 -425
- package/src/web.ts +3 -2
package/src/i18n/ko.ts
CHANGED
|
@@ -93,6 +93,7 @@ export const ko: Messages = {
|
|
|
93
93
|
nav: {
|
|
94
94
|
projects: "프로젝트",
|
|
95
95
|
work: "내 작업",
|
|
96
|
+
myDecisions: "내 결정",
|
|
96
97
|
people: "사람들",
|
|
97
98
|
agents: "에이전트",
|
|
98
99
|
board: "보드",
|
|
@@ -118,7 +119,13 @@ export const ko: Messages = {
|
|
|
118
119
|
|
|
119
120
|
signIn: {
|
|
120
121
|
lead: "AI 에이전트로 이뤄진 조직에 합류하세요.",
|
|
121
|
-
|
|
122
|
+
signInWith: (provider) => `${provider}로 로그인`,
|
|
123
|
+
going: (provider) => `${provider}로 가는 중…`,
|
|
124
|
+
admits: {
|
|
125
|
+
organization: (name) => `GitHub 조직 ${name}의 멤버가 로그인할 수 있습니다.`,
|
|
126
|
+
domains: (domains) => `${domains} 계정이 로그인할 수 있습니다.`,
|
|
127
|
+
listed: "관리자가 추가한 사람이 로그인할 수 있습니다.",
|
|
128
|
+
},
|
|
122
129
|
nobody: {
|
|
123
130
|
title: "아직 아무도 로그인할 수 없습니다",
|
|
124
131
|
body: "이 콘솔에는 로그인이 설정되어 있지 않습니다. 운영자가 deploy/README.md에 따라 설정합니다.",
|
|
@@ -137,6 +144,8 @@ export const ko: Messages = {
|
|
|
137
144
|
empty: {
|
|
138
145
|
title: "아직 프로젝트가 없습니다",
|
|
139
146
|
body: "첫 프로젝트를 만드세요. 무엇을 위한 것인지, 누가 함께하는지. 또는 소유자에게 추가를 요청하세요.",
|
|
147
|
+
bodyMember:
|
|
148
|
+
"프로젝트는 관리자가 만듭니다. 관리자에게 첫 프로젝트를, 또는 소유자에게 추가를 요청하세요.",
|
|
140
149
|
},
|
|
141
150
|
list: "프로젝트",
|
|
142
151
|
private: "비공개",
|
|
@@ -239,8 +248,11 @@ export const ko: Messages = {
|
|
|
239
248
|
menu: "작업 메뉴",
|
|
240
249
|
decisions: (n) => `결정 ${n}건`,
|
|
241
250
|
decisionsTitle: "사람을 기다리는 결정",
|
|
251
|
+
unfold: (column) => `${column} 펼치기`,
|
|
252
|
+
fold: (column) => `${column} 접기`,
|
|
242
253
|
filters: {
|
|
243
254
|
aria: "보드 좁혀 보기",
|
|
255
|
+
words: "제목, 번호, 사람",
|
|
244
256
|
everyone: "모두",
|
|
245
257
|
mine: "내 작업",
|
|
246
258
|
anyCategory: "모든 카테고리",
|
|
@@ -340,6 +352,8 @@ export const ko: Messages = {
|
|
|
340
352
|
record: "기록",
|
|
341
353
|
openRecord: "열기",
|
|
342
354
|
waitingForPerson: "사람을 기다리는 중입니다.",
|
|
355
|
+
waitingFor: (name) => `${name}의 답을 기다리는 중입니다.`,
|
|
356
|
+
peopleLabel: (asker, decider) => `올린 사람 ${asker}, 답할 사람 ${decider}`,
|
|
343
357
|
options: "선택지",
|
|
344
358
|
notePlaceholder: "덧붙일 말이 있다면",
|
|
345
359
|
own: "직접 입력",
|
|
@@ -362,6 +376,9 @@ export const ko: Messages = {
|
|
|
362
376
|
contextPlaceholder: "답하려면 알아야 할 것, Markdown으로.",
|
|
363
377
|
about: "관련 작업",
|
|
364
378
|
noTask: "특정 작업 없음",
|
|
379
|
+
decider: "결정할 사람",
|
|
380
|
+
deciderPlaceholder: "지정하지 않으면 본인",
|
|
381
|
+
me: "(나)",
|
|
365
382
|
options: "선택지",
|
|
366
383
|
option: (n) => `선택지 ${n}`,
|
|
367
384
|
addOption: "선택지 추가",
|
|
@@ -369,6 +386,23 @@ export const ko: Messages = {
|
|
|
369
386
|
},
|
|
370
387
|
},
|
|
371
388
|
|
|
389
|
+
myDecisions: {
|
|
390
|
+
title: "내 결정",
|
|
391
|
+
loading: "내 결정을 불러오는 중",
|
|
392
|
+
couldNotLoad: "내 결정을 불러올 수 없습니다.",
|
|
393
|
+
empty: {
|
|
394
|
+
title: "내 결정이 없습니다",
|
|
395
|
+
body: "내게 온 결정과 내가 다른 사람에게 올린 결정이 여기에 모입니다. 내가 올린 결정은 내 에이전트가 올린 것을 포함합니다.",
|
|
396
|
+
},
|
|
397
|
+
waiting: "내 답을 기다리는 중",
|
|
398
|
+
noneWaiting: "내 답을 기다리는 결정이 없습니다.",
|
|
399
|
+
raised: "내가 다른 사람에게 올린 결정",
|
|
400
|
+
noneRaised: "다른 사람에게 올린 결정이 없습니다.",
|
|
401
|
+
answered: "답변됨",
|
|
402
|
+
noneAnswered: "아직 답한 결정이 없습니다.",
|
|
403
|
+
more: "더 보기",
|
|
404
|
+
},
|
|
405
|
+
|
|
372
406
|
calendar: {
|
|
373
407
|
title: "캘린더",
|
|
374
408
|
grid: "이 달",
|
|
@@ -381,6 +415,11 @@ export const ko: Messages = {
|
|
|
381
415
|
nothingOverdue: "기한이 지난 작업이 없습니다.",
|
|
382
416
|
unscheduled: "날짜 없음",
|
|
383
417
|
allScheduled: "열린 작업마다 날짜가 있습니다.",
|
|
418
|
+
more: (n) => `${n}개 더`,
|
|
419
|
+
fewer: "접기",
|
|
420
|
+
onDay: (day) => `${day}의 작업`,
|
|
421
|
+
nothingOnDay: "이 날에 잡힌 작업이 없습니다.",
|
|
422
|
+
close: "닫기",
|
|
384
423
|
week: {
|
|
385
424
|
title: "이 주",
|
|
386
425
|
previous: "이전 주",
|
|
@@ -389,7 +428,7 @@ export const ko: Messages = {
|
|
|
389
428
|
nothing: "이 주에 잡힌 작업이 없습니다.",
|
|
390
429
|
},
|
|
391
430
|
workload: {
|
|
392
|
-
title: "
|
|
431
|
+
title: "담당자별 작업 현황",
|
|
393
432
|
person: "사람",
|
|
394
433
|
open: "열림",
|
|
395
434
|
inProgress: "진행 중",
|
|
@@ -471,8 +510,8 @@ export const ko: Messages = {
|
|
|
471
510
|
thisWeek: "이번 주 마감",
|
|
472
511
|
later: "그 뒤",
|
|
473
512
|
noDay: "날짜 없음",
|
|
474
|
-
decisions: "
|
|
475
|
-
noDecisions: "기다리는 결정이 없습니다.",
|
|
513
|
+
decisions: "내 답을 기다리는 결정",
|
|
514
|
+
noDecisions: "내 답을 기다리는 결정이 없습니다.",
|
|
476
515
|
inProject: (project) => `${project}에서`,
|
|
477
516
|
},
|
|
478
517
|
|
|
@@ -632,6 +671,8 @@ export const ko: Messages = {
|
|
|
632
671
|
runFinished: (task) => `${task}을(를) 끝냈습니다`,
|
|
633
672
|
runFailed: (task) => `${task}에 실패했습니다`,
|
|
634
673
|
runAbandoned: (task) => `${task}을(를) 포기했습니다`,
|
|
674
|
+
runUnheard: (task, agent) =>
|
|
675
|
+
`${task}의 ${agent} 런을 끝냈습니다. 너무 오래 소식이 없었습니다`,
|
|
635
676
|
documentWritten: (page, version) =>
|
|
636
677
|
`${page}을(를) 썼습니다${version === undefined ? "" : `, 버전 ${version}`}`,
|
|
637
678
|
documentArchived: (page) => `${page}을(를) 보관했습니다`,
|
|
@@ -757,6 +798,7 @@ export const ko: Messages = {
|
|
|
757
798
|
version: (n) => `v${n}`,
|
|
758
799
|
versionWord: "버전",
|
|
759
800
|
writtenBy: "작성:",
|
|
801
|
+
author: "작성",
|
|
760
802
|
versionOf: (n, of) => `버전 ${n} / ${of}`,
|
|
761
803
|
showLatest: "최신 버전 보기",
|
|
762
804
|
archivedNotice: "이 페이지는 보관됐습니다. 폴더와 검색에서 빠지고, 쓸 수 없습니다.",
|
|
@@ -769,6 +811,8 @@ export const ko: Messages = {
|
|
|
769
811
|
decisionPrefix: "결정: ",
|
|
770
812
|
files: "파일",
|
|
771
813
|
fileToAttach: "첨부할 파일",
|
|
814
|
+
chooseFile: "파일 선택",
|
|
815
|
+
noFileChosen: "선택된 파일 없음",
|
|
772
816
|
labelPlaceholder: "파일 이름 대신 부를 이름",
|
|
773
817
|
attach: "첨부",
|
|
774
818
|
by: "첨부:",
|
|
@@ -808,6 +852,8 @@ export const ko: Messages = {
|
|
|
808
852
|
domain: "도메인의 계정",
|
|
809
853
|
listed: "관리자가 추가함",
|
|
810
854
|
},
|
|
855
|
+
ofOrganization: (name) => `${name} 조직의 구성원`,
|
|
856
|
+
ofDomain: (domain) => `${domain} 도메인의 계정`,
|
|
811
857
|
at: { gh: "GitHub", google: "Google" },
|
|
812
858
|
organization: (name) => `GitHub 조직 ${name}이(가) 구성원을 정합니다.`,
|
|
813
859
|
organizationRead: "마지막으로 읽음",
|
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,
|
|
@@ -207,6 +209,7 @@ export {
|
|
|
207
209
|
formatBytes,
|
|
208
210
|
formatInstant,
|
|
209
211
|
GoalStateBadge,
|
|
212
|
+
LinkButton,
|
|
210
213
|
PersonChip,
|
|
211
214
|
PRIORITY_LABELS,
|
|
212
215
|
PriorityBadge,
|
package/src/limits.ts
CHANGED
|
@@ -79,3 +79,17 @@ export const MAX_PROJECT_SYMBOL_LENGTH = 8;
|
|
|
79
79
|
export const MAX_PROJECT_ICON_BYTES = 512 * 1024;
|
|
80
80
|
/** How many items a listing answers with when none is asked for, and the most one may ask for. */
|
|
81
81
|
export const DEFAULT_PAGE_LIMIT = 50;
|
|
82
|
+
/**
|
|
83
|
+
* How many projects one workspace holds, how many tasks, goals, decisions and pages one project
|
|
84
|
+
* holds, and how many runs one task carries, those put away included: bounds a runaway script
|
|
85
|
+
* meets and real work does not.
|
|
86
|
+
*/
|
|
87
|
+
export const MAX_PROJECTS_PER_WORKSPACE = 500;
|
|
88
|
+
export const MAX_TASKS_PER_PROJECT = 20_000;
|
|
89
|
+
export const MAX_GOALS_PER_PROJECT = 1_000;
|
|
90
|
+
export const MAX_DECISIONS_PER_PROJECT = 20_000;
|
|
91
|
+
export const MAX_DOCUMENTS_PER_PROJECT = 5_000;
|
|
92
|
+
export const MAX_RUNS_PER_TASK = 500;
|
|
93
|
+
/** How many streams of the live feed one person holds at once, across their tabs, and how many one process of the console holds for everyone. */
|
|
94
|
+
export const MAX_STREAMS_PER_PERSON = 20;
|
|
95
|
+
export const MAX_STREAMS = 1_000;
|
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
|
@@ -9,6 +9,8 @@ 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
|
+
/** A picture from elsewhere, fetched by the console for a page (ADR-0048); `?src=` names it. */
|
|
13
|
+
pictures: "/api/v1/pictures",
|
|
12
14
|
/** The workspace's settings (ADR-0035), changed by an administrator; read through `me`. */
|
|
13
15
|
workspace: "/api/v1/workspace",
|
|
14
16
|
/** The SkillCDN token the organization's pack is read with (ADR-0036), an administrator's; `/connect` under it connects one with a code. */
|
|
@@ -27,8 +29,10 @@ export const REST_ROUTES = {
|
|
|
27
29
|
connect: "/api/v1/connect",
|
|
28
30
|
/** The categories tasks are sorted into (ADR-0019): the workspace's vocabulary, kept by an administrator. */
|
|
29
31
|
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. */
|
|
32
|
+
/** What is on the asker's plate across the projects they may see: their open tasks, and the decisions waiting for them. */
|
|
31
33
|
work: "/api/v1/work",
|
|
34
|
+
/** The decisions addressed to the asker (ADR-0042) across the projects they may see: the waiting first, then the record. */
|
|
35
|
+
decisions: "/api/v1/decisions",
|
|
32
36
|
/** The rules of the board (ADR-0023): the console's own until an administrator writes the organization's. */
|
|
33
37
|
rules: "/api/v1/rules",
|
|
34
38
|
} 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
|
@@ -167,6 +167,18 @@ export const restProviderSchema = z.object({
|
|
|
167
167
|
key: z.enum(PROVIDER_KEYS),
|
|
168
168
|
/** What people read on the button. */
|
|
169
169
|
label: z.string(),
|
|
170
|
+
/**
|
|
171
|
+
* Who this way in lets in, for the line under the button: the organization at the git host
|
|
172
|
+
* whose members are in, the Workspace domains whose accounts are, or neither, where only the
|
|
173
|
+
* logins an administrator listed get in. Answered from 0.4.1; read as optional, so that a
|
|
174
|
+
* console built on this package reads an older console's answer.
|
|
175
|
+
*/
|
|
176
|
+
admits: z.optional(
|
|
177
|
+
z.object({
|
|
178
|
+
organization: z.nullable(z.string()),
|
|
179
|
+
domains: z.array(z.string()),
|
|
180
|
+
}),
|
|
181
|
+
),
|
|
170
182
|
});
|
|
171
183
|
export type RestProvider = z.infer<typeof restProviderSchema>;
|
|
172
184
|
|
|
@@ -652,6 +664,8 @@ export const restDecisionSchema = z.object({
|
|
|
652
664
|
/** The task's number, when there is a task, or `null`. */
|
|
653
665
|
taskNumber: z.nullable(z.int()),
|
|
654
666
|
raisedBy: restPersonSchema,
|
|
667
|
+
/** Who is to answer (ADR-0042): the raiser, unless another person of the project was named. */
|
|
668
|
+
decider: restPersonSchema,
|
|
655
669
|
/** The run that raised it, as the agent asked, or `null` when a person did. */
|
|
656
670
|
run: z.nullable(z.object({ id: uuid, agent: z.string() })),
|
|
657
671
|
/** The answer, with who gave it and when; `null` while the decision waits. */
|
|
@@ -690,9 +704,9 @@ const projectRef = z.object({
|
|
|
690
704
|
|
|
691
705
|
/**
|
|
692
706
|
* `GET /api/v1/work`: what is on the asker's plate across the projects they may see (ADR-0019):
|
|
693
|
-
* the open tasks they work on, and the decisions that wait for
|
|
694
|
-
* project; and, for the week on the plate, `closed`, the tasks they work on that are
|
|
695
|
-
* or dropped and not yet put away. Left out by a console older than it.
|
|
707
|
+
* the open tasks they work on, and the decisions that wait for their answer (ADR-0042), each
|
|
708
|
+
* with its project; and, for the week on the plate, `closed`, the tasks they work on that are
|
|
709
|
+
* done or dropped and not yet put away. Left out by a console older than it.
|
|
696
710
|
*/
|
|
697
711
|
export const restWorkSchema = z.object({
|
|
698
712
|
tasks: z.array(z.object({ project: projectRef, task: restTaskSchema })),
|
|
@@ -701,6 +715,17 @@ export const restWorkSchema = z.object({
|
|
|
701
715
|
});
|
|
702
716
|
export type RestWork = z.infer<typeof restWorkSchema>;
|
|
703
717
|
|
|
718
|
+
/**
|
|
719
|
+
* `GET /api/v1/decisions`: a page of the decisions addressed to the asker (ADR-0042) across the
|
|
720
|
+
* projects they may see, each with its project: the ones that wait first, oldest first among
|
|
721
|
+
* them, then the answered, newest first; and whether there is more.
|
|
722
|
+
*/
|
|
723
|
+
export const restMyDecisionsSchema = z.object({
|
|
724
|
+
items: z.array(z.object({ project: projectRef, decision: restDecisionSchema })),
|
|
725
|
+
more: z.boolean(),
|
|
726
|
+
});
|
|
727
|
+
export type RestMyDecisions = z.infer<typeof restMyDecisionsSchema>;
|
|
728
|
+
|
|
704
729
|
/**
|
|
705
730
|
* What `GET /api/v1/people/<id>/work` answers: another person's open tasks, and their closed
|
|
706
731
|
* ones for the week, within the projects the asker may see, for whoever oversees them. No
|
|
@@ -722,6 +747,8 @@ export const restDecisionInputSchema = z.object({
|
|
|
722
747
|
taskId: z.optional(z.nullable(uuid)),
|
|
723
748
|
/** The run that asks, when an agent does: the decision is about its task, and it waits for the answer. */
|
|
724
749
|
runId: z.optional(z.nullable(uuid)),
|
|
750
|
+
/** Who is to answer (ADR-0042): a person who may work in the project; the asker when left out. */
|
|
751
|
+
deciderId: z.optional(uuid),
|
|
725
752
|
});
|
|
726
753
|
export type RestDecisionInput = z.infer<typeof restDecisionInputSchema>;
|
|
727
754
|
|
|
@@ -779,8 +806,9 @@ export const restEventDataSchema = z.object({
|
|
|
779
806
|
name: z.optional(z.string()),
|
|
780
807
|
/** For what an agent did: what it calls itself. */
|
|
781
808
|
agent: z.optional(z.string()),
|
|
782
|
-
/** For `run.ended`: how. */
|
|
809
|
+
/** For `run.ended`: how, and, when the console ended the run itself, why (ADR-0041). */
|
|
783
810
|
status: z.optional(z.enum(RUN_STATUSES)),
|
|
811
|
+
reason: z.optional(z.literal("unheard")),
|
|
784
812
|
/** For `run.handed_in`: what the artifact is called. */
|
|
785
813
|
label: z.optional(z.string()),
|
|
786
814
|
/** For `run.reported` and `task.commented`: the first words of what was written. */
|
|
@@ -1079,9 +1107,10 @@ export const restPackConnectStartedSchema = z.object({
|
|
|
1079
1107
|
export type RestPackConnectStarted = z.infer<typeof restPackConnectStartedSchema>;
|
|
1080
1108
|
|
|
1081
1109
|
/**
|
|
1082
|
-
* `GET .../pack-token/connect`: how the connection
|
|
1083
|
-
* person, with what they were shown; connected,
|
|
1084
|
-
*
|
|
1110
|
+
* `GET .../pack-token/connect` and `POST .../pack-token/connect/claim`: how the connection
|
|
1111
|
+
* stands. Nothing asked; waiting for the person, with what they were shown; connected, which
|
|
1112
|
+
* only the claim answers (ADR-0046), the token kept and the project as it stands; or ended
|
|
1113
|
+
* short of a token, and why.
|
|
1085
1114
|
*/
|
|
1086
1115
|
const packConnectNone = z.object({ status: z.literal("none") });
|
|
1087
1116
|
const packConnectPending = z.object({
|
|
@@ -1103,7 +1132,7 @@ export const restPackConnectSchema = z.union([
|
|
|
1103
1132
|
]);
|
|
1104
1133
|
export type RestPackConnect = z.infer<typeof restPackConnectSchema>;
|
|
1105
1134
|
|
|
1106
|
-
/** `GET /api/v1/workspace/pack-token/connect`: the same, for the workspace's token, with the workspace as it stands once connected. */
|
|
1135
|
+
/** `GET /api/v1/workspace/pack-token/connect` and `POST .../connect/claim`: the same, for the workspace's token, with the workspace as it stands once connected. */
|
|
1107
1136
|
export const restWorkspacePackConnectSchema = z.union([
|
|
1108
1137
|
packConnectNone,
|
|
1109
1138
|
packConnectPending,
|