@skillcdn/console 0.1.9 → 0.1.11
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 +6 -6
- package/dist/api.d.ts +6 -5
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +5 -4
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +303 -18
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts +11 -1
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +87 -6
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +70 -14
- package/dist/cli/help.js.map +1 -1
- package/dist/client.d.ts +44 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -4
- package/dist/client.js.map +1 -1
- package/dist/components/board.d.ts +24 -1
- package/dist/components/board.d.ts.map +1 -1
- package/dist/components/board.js +66 -5
- package/dist/components/board.js.map +1 -1
- package/dist/components/calendar.d.ts +54 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +156 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/categories.d.ts +13 -0
- package/dist/components/categories.d.ts.map +1 -0
- package/dist/components/categories.js +52 -0
- package/dist/components/categories.js.map +1 -0
- package/dist/components/decision-list.d.ts +10 -0
- package/dist/components/decision-list.d.ts.map +1 -1
- package/dist/components/decision-list.js +16 -1
- package/dist/components/decision-list.js.map +1 -1
- package/dist/components/event-feed.d.ts.map +1 -1
- package/dist/components/event-feed.js +23 -7
- package/dist/components/event-feed.js.map +1 -1
- package/dist/components/goals.d.ts +35 -0
- package/dist/components/goals.d.ts.map +1 -0
- package/dist/components/goals.js +45 -0
- package/dist/components/goals.js.map +1 -0
- package/dist/components/paged.d.ts +14 -0
- package/dist/components/paged.d.ts.map +1 -0
- package/dist/components/paged.js +28 -0
- package/dist/components/paged.js.map +1 -0
- package/dist/components/projects.d.ts +22 -2
- package/dist/components/projects.d.ts.map +1 -1
- package/dist/components/projects.js +35 -7
- package/dist/components/projects.js.map +1 -1
- package/dist/components/runs.d.ts.map +1 -1
- package/dist/components/runs.js +2 -2
- package/dist/components/runs.js.map +1 -1
- package/dist/components/shell.d.ts +2 -1
- package/dist/components/shell.d.ts.map +1 -1
- package/dist/components/shell.js +1 -1
- package/dist/components/shell.js.map +1 -1
- package/dist/components/task-form.d.ts +5 -1
- package/dist/components/task-form.d.ts.map +1 -1
- package/dist/components/task-form.js +13 -1
- package/dist/components/task-form.js.map +1 -1
- package/dist/components/task-list.d.ts +16 -0
- package/dist/components/task-list.d.ts.map +1 -0
- package/dist/components/task-list.js +16 -0
- package/dist/components/task-list.js.map +1 -0
- package/dist/components/task-view.d.ts +9 -1
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js +10 -4
- package/dist/components/task-view.js.map +1 -1
- package/dist/components/ui.d.ts +30 -1
- package/dist/components/ui.d.ts.map +1 -1
- package/dist/components/ui.js +60 -0
- package/dist/components/ui.js.map +1 -1
- package/dist/components/work.d.ts +10 -0
- package/dist/components/work.d.ts.map +1 -0
- package/dist/components/work.js +33 -0
- package/dist/components/work.js.map +1 -0
- package/dist/console.css +658 -0
- package/dist/console.d.ts +8 -0
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +145 -13
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +19 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +51 -4
- package/dist/data.js.map +1 -1
- package/dist/dates.d.ts +39 -0
- package/dist/dates.d.ts.map +1 -0
- package/dist/dates.js +120 -0
- package/dist/dates.js.map +1 -0
- package/dist/i18n/en.d.ts +172 -5
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +183 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +178 -6
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +11 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +11 -0
- package/dist/limits.js.map +1 -1
- package/dist/marks.d.ts +12 -0
- package/dist/marks.d.ts.map +1 -0
- package/dist/marks.js +31 -0
- package/dist/marks.js.map +1 -0
- package/dist/router.d.ts +51 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +80 -1
- package/dist/router.js.map +1 -1
- package/dist/routes.d.ts +14 -1
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +17 -0
- package/dist/routes.js.map +1 -1
- package/dist/schemas.d.ts +489 -3
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +150 -9
- package/dist/schemas.js.map +1 -1
- package/dist/vocabulary.d.ts +21 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +31 -0
- package/dist/vocabulary.js.map +1 -1
- package/docs/specs/cli.md +17 -8
- package/docs/specs/rest.md +48 -17
- package/package.json +1 -1
- package/skills/working-the-board/SKILL.md +7 -6
- package/src/api.ts +42 -0
- package/src/cli/cli.ts +362 -18
- package/src/cli/format.ts +96 -6
- package/src/cli/help.ts +77 -15
- package/src/client.ts +98 -7
- package/src/components/board.tsx +173 -13
- package/src/components/calendar.tsx +367 -0
- package/src/components/categories.tsx +209 -0
- package/src/components/decision-list.tsx +67 -5
- package/src/components/event-feed.tsx +46 -27
- package/src/components/goals.tsx +264 -0
- package/src/components/paged.tsx +39 -0
- package/src/components/projects.tsx +128 -10
- package/src/components/runs.tsx +7 -1
- package/src/components/shell.tsx +5 -2
- package/src/components/task-form.tsx +78 -1
- package/src/components/task-list.tsx +64 -0
- package/src/components/task-view.tsx +75 -4
- package/src/components/ui.tsx +116 -1
- package/src/components/work.tsx +93 -0
- package/src/console.tsx +376 -9
- package/src/data.ts +83 -12
- package/src/dates.ts +143 -0
- package/src/i18n/en.ts +193 -6
- package/src/i18n/ko.ts +184 -6
- package/src/index.ts +62 -1
- package/src/limits.ts +11 -0
- package/src/marks.ts +40 -0
- package/src/router.ts +131 -6
- package/src/routes.ts +19 -0
- package/src/schemas.ts +187 -7
- package/src/styles/console.css +658 -0
- package/src/vocabulary.ts +43 -0
package/docs/specs/cli.md
CHANGED
|
@@ -22,19 +22,26 @@ The board is a project's ([ADR-0008](../adr/0008-a-workspace-holds-projects-and-
|
|
|
22
22
|
| `whoami` | `GET /api/v1/me` | the login, the role, the workspace, the address, and the project this directory works in |
|
|
23
23
|
| `projects` | `GET /api/v1/projects` | one line per project: key, name, what the person is in it, what waits in it |
|
|
24
24
|
| `use <key>` | `GET /api/v1/projects/<key>` | that the directory works in the project from now on; writes `.skillcdn-console.json` |
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `task
|
|
25
|
+
| `work` | `GET /api/v1/work` | what is on the person's plate across their projects: the open tasks assigned to them, the sooner due first, each with its project; and the decisions waiting. Needs no project |
|
|
26
|
+
| `tasks [--state <state>] [--open] [--mine] [--category <key>] [--goal <id>] [--due <day\|today\|week\|overdue>] [--limit <n>] [--offset <n>]` | `GET .../tasks` with the filters and the page | one line per task: number, state, priority, title, owner, assignee, category, due day, what waits on it; a page at a time |
|
|
27
|
+
| `task <number\|id>` | `GET .../tasks/<ref>`, the decisions about it, the runs on it | the task in full, with its plan and its moments |
|
|
28
|
+
| `task new <title> [--body <markdown>\|--file <path>] [--state <state>] [--priority <priority>] [--category <key>] [--goal <id>] [--starts <day>] [--due <day>] [--assignee <login\|me>] [--parent <number\|id>]` | `POST .../tasks` | the number and the id |
|
|
29
|
+
| `task edit <number\|id> [--title <title>] [--body ...] [the same flags; `none` clears a field]` | `GET .../tasks/<ref>`, then `PATCH .../tasks/<id>` | the task in full, as it is now |
|
|
30
|
+
| `goals` | `GET .../goals` | one line per goal of the roadmap: id, state, title, target day, how far it is |
|
|
31
|
+
| `goal <id>` | `GET .../goals/<id>`, `GET .../tasks?goal=` | the goal in full, with the tasks that work towards it |
|
|
32
|
+
| `goal new <title> [--body <markdown>\|--file <path>] [--state <state>] [--due <day>]` | `POST .../goals` | the title and the id; for an owner of the project |
|
|
33
|
+
| `goal edit <id> [--title <title>] [--body ...] [--state <state>] [--due <day\|none>]` | `PATCH .../goals/<id>` | the goal in full, as it is now |
|
|
34
|
+
| `categories` | `GET /api/v1/categories` | one line per category: key, name, colour |
|
|
28
35
|
| `skills` | `GET .../skills` | the project's skills, or the organization's: each with its description and the URI an agent loads it by through its own SkillCDN connection; or why there are none to show |
|
|
29
|
-
| `take <number\|id> [--agent <name>]` | `GET .../tasks/<ref>`, then `POST .../runs` | the run that began, the task in full, and what to do next |
|
|
36
|
+
| `take <number\|id> [--agent <name>]` | `GET .../tasks/<ref>`, then `POST .../runs` | the run that began, the task in full, and what to do next; a run open on the task is taken over ([ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)) |
|
|
30
37
|
| `report <markdown>`, `report --file <path>`, `report -` | `POST .../runs/<id>/reports` | how many reports the run carries |
|
|
31
38
|
| `hand-in <https url \| file path> [--label <words>]` | `POST .../runs/<id>/artifacts` for a link; `POST .../runs/<id>/files` for a file, sent as a form with its name and its media type by extension | how many artifacts |
|
|
32
39
|
| `ask "<question>" --option "<label>" ... [--body <markdown>\|--file <path>] [--wait <seconds>]` | `POST .../decisions` with `runId`, then `GET .../decisions/<id>?wait=` | the decision raised, its options; then the answer, or that it still waits |
|
|
33
40
|
| `decision <id> [--wait <seconds>]` | `GET .../decisions/<id>`, with `?wait=` while waiting | the decision; with a wait, the answer or that it still waits |
|
|
34
|
-
| `decisions [--open]` | `GET .../decisions` | one line per decision |
|
|
41
|
+
| `decisions [--open] [--limit <n>] [--offset <n>]` | `GET .../decisions` | one line per decision; a page at a time |
|
|
35
42
|
| `finish [--summary <markdown>\|--file <path>]`, `fail [...]` | `POST .../runs/<id>/end` | how the run ended |
|
|
36
43
|
| `abandon [<run id>] [--summary <markdown>]` | `POST .../runs/<id>/end`, as `abandoned` | the same |
|
|
37
|
-
| `runs [--task <number\|id>] [--open] [--mine]` | `GET .../runs` | one line per run |
|
|
44
|
+
| `runs [--task <number\|id>] [--open] [--mine] [--limit <n>] [--offset <n>]` | `GET .../runs` | one line per run, with when an open one was last heard from; a page at a time |
|
|
38
45
|
| `run <id>` | `GET .../runs/<id>` | the run in full, with its reports, what it handed in and where each file is read |
|
|
39
46
|
| `decision <id> --outcome <markdown>\|--file <path>` | `PATCH .../decisions/<id>` | the decision as a record, with what followed written down |
|
|
40
47
|
| `docs [<folder>] [--search <words>] [--archived]` | `GET .../docs?folder=` or `?q=` | the folders and the pages of a folder, or the pages found by words: one line per page |
|
|
@@ -46,7 +53,7 @@ The board is a project's ([ADR-0008](../adr/0008-a-workspace-holds-projects-and-
|
|
|
46
53
|
| `help [<command>]` | nothing | the usage, written for an agent that meets the command for the first time |
|
|
47
54
|
| `--version` (also `version`, `-v`) | nothing | which version of the command this is |
|
|
48
55
|
|
|
49
|
-
`...` is `/api/v1/projects/<key>`, the project the command works in. Everywhere: `--json` prints the console's own answer as JSON, in the shapes of `@skillcdn/console/api`; `--url <origin>` names another console for this one command; `--project <key>` the project. A Markdown body given as `-` is read from standard input. Every argument is bounded and checked by the console, as the REST API's schemas say; the command sends it as it was given.
|
|
56
|
+
`...` is `/api/v1/projects/<key>`, the project the command works in. Everywhere: `--json` prints the console's own answer as JSON, in the shapes of `@skillcdn/console/api`; `--url <origin>` names another console for this one command; `--project <key>` the project. A Markdown body given as `-` is read from standard input. A day is given as `2026-10-24`, `today`, `tomorrow` or `+7` (days from today by this machine's clock); `--due overdue` keeps the open tasks past their day, `--due week` those due within seven days. Every argument is bounded and checked by the console, as the REST API's schemas say; the command sends it as it was given.
|
|
50
57
|
|
|
51
58
|
## The documents
|
|
52
59
|
|
|
@@ -56,6 +63,8 @@ A project's pages of Markdown ([ADR-0009](../adr/0009-documents-are-pages-of-mar
|
|
|
56
63
|
|
|
57
64
|
`report`, `hand-in`, `ask`, `finish` and `fail` act on a run. Named with `--run <id>`, that one; else the one open run begun with this token in the project (`GET .../runs?open=true&mine=true`). None open, or several: the command exits with `1` and says so, listing the open ones, so that an agent working two tasks at once says which.
|
|
58
65
|
|
|
66
|
+
`tasks`, `decisions` and `runs` show a page at a time: `DEFAULT_PAGE_LIMIT` lines unless `--limit <n>` says otherwise (up to `LIST_LIMIT`), from `--offset <n>` on, and a last line, `... more: --offset <n>`, says how to ask for the next page when there is one; with `--json`, the console's answer as it is, `more` included. An agent reads the first page and asks for the next only when what it looks for is not on it.
|
|
67
|
+
|
|
59
68
|
## Waiting for a decision
|
|
60
69
|
|
|
61
70
|
`ask` waits 60 seconds for the answer unless `--wait` says otherwise, within what an agent's shell gives one command; `decision <id> --wait <seconds>` waits as long as it is told, a day at most. The command asks the console to hold each request for up to 50 seconds (`?wait=`), the server's own bound, and repeats while the time lasts, with a breath between requests; the answer arrives as soon as a person gives it, since the console is woken through the database's own channel. A decision that still waits when the time is up is exit code `3`: the run waits with it, so the agent keeps waiting with `console decision <id> --wait 100`, within what its shell gives one command, and goes on meanwhile only with work that does not depend on the answer. `ask` prints the decision's id as soon as it is raised, before any waiting, so that a wait cut short loses nothing; with `--json` it prints the decision then, and again with its answer when that comes.
|
|
@@ -66,7 +75,7 @@ A project's pages of Markdown ([ADR-0009](../adr/0009-documents-are-pages-of-mar
|
|
|
66
75
|
|
|
67
76
|
## Output and exit codes
|
|
68
77
|
|
|
69
|
-
Plain text on standard output: one line per thing in a list, a few lines for one thing in full, with ids given, since the commands take them, and the vocabulary's own words (`in_progress`, `waiting`), since the options take them. What went wrong goes to standard error as the console's stable code and its words (`run.
|
|
78
|
+
Plain text on standard output: one line per thing in a list, a few lines for one thing in full, with ids given, since the commands take them, and the vocabulary's own words (`in_progress`, `waiting`), since the options take them. What went wrong goes to standard error as the console's stable code and its words (`run.task_closed: the task is done or dropped`), with a hint when there is something to do about it.
|
|
70
79
|
|
|
71
80
|
| Exit code | Meaning |
|
|
72
81
|
|---|---|
|
package/docs/specs/rest.md
CHANGED
|
@@ -20,9 +20,14 @@ The API is the board as its members see it: the people, the projects, and in eac
|
|
|
20
20
|
|---|---|---|
|
|
21
21
|
| 400 | `request.invalid` | A query parameter or the body does not parse; the message names the first field at fault. |
|
|
22
22
|
| 400 | `project.invalid_address` | The skills address is not one, as the standard spells them. |
|
|
23
|
+
| 400 | `project.invalid_icon` | The image for the mark is not a PNG, a JPEG, a GIF or a WebP, by its first bytes. |
|
|
24
|
+
| 404 | `project.no_icon` | The project has no image for its mark. |
|
|
23
25
|
| 400 | `member.invalid_person` | The person to list is not one of the workspace. |
|
|
24
26
|
| 400 | `task.invalid_assignee` | The assignee is not a person who may work in the project. |
|
|
25
27
|
| 400 | `task.invalid_parent` | The parent is not a task of the project, is the task itself, or would make a loop. |
|
|
28
|
+
| 400 | `task.invalid_category` | No category of the workspace has that key. |
|
|
29
|
+
| 400 | `task.invalid_goal` | The goal is not one of the project's. |
|
|
30
|
+
| 400 | `task.invalid_dates` | The due day is before the start. |
|
|
26
31
|
| 400 | `decision.invalid_task` | The decision is about a task that is not one of the project's. |
|
|
27
32
|
| 400 | `decision.no_such_option` | The answer names an option the decision does not have. |
|
|
28
33
|
| 400 | `decision.invalid_run` | A decision raised from a run that is not the asker's, or is over. |
|
|
@@ -35,13 +40,15 @@ The API is the board as its members see it: the people, the projects, and in eac
|
|
|
35
40
|
| 403 | `auth.session_required` | A token asked for what only a person signed in may do: the tokens themselves, and configuring. |
|
|
36
41
|
| 403 | `run.not_yours` | The run is another person's. |
|
|
37
42
|
| 404 | `project.not_found` | No project has that key, or it is not the asker's to see: the two are one answer. The key is checked before anything is asked. |
|
|
38
|
-
| 404 | `task.not_found`, `decision.not_found`, `token.not_found`, `person.not_found`, `run.not_found`, `run.task_not_found`, `member.not_found` | No such id in the project (or in the workspace, for a token, a person); for a token, none of the asker's. An id that is not a UUID is not found either, except a task's number. |
|
|
43
|
+
| 404 | `task.not_found`, `decision.not_found`, `goal.not_found`, `token.not_found`, `person.not_found`, `run.not_found`, `run.task_not_found`, `member.not_found` | No such id in the project (or in the workspace, for a token, a person); for a token, none of the asker's. An id that is not a UUID is not found either, except a task's number. |
|
|
44
|
+
| 404 | `category.not_found` | No category of the workspace has that key; a key that is not one is not found either. |
|
|
39
45
|
| 404 | `file.not_found` | No file handed in, or attached to the page, has that id in the project; a link handed in is not a file. |
|
|
40
46
|
| 404 | `document.not_found`, `document.version_not_found` | No page has that path in the project, or the page has no such version. A path that is not one is not found either. |
|
|
41
47
|
| 404 | `connect.not_found` | No agent asks to connect under this code or secret: it was never asked, it expired, the person said no, or the token was handed over already. |
|
|
42
48
|
| 404 | `not_found` | Nothing at this path. |
|
|
43
49
|
| 409 | `project.key_taken` | A project of the workspace has that key already. |
|
|
44
50
|
| 409 | `member.exists` | The person is listed in the project already. |
|
|
51
|
+
| 409 | `category.key_taken`, `category.in_use`, `category.too_many` | A category of the workspace has that key already; tasks are sorted into the category, so it stays until they are moved; the workspace has as many categories as one may (`MAX_CATEGORIES`). |
|
|
45
52
|
| 409 | `decision.answered` | The decision has an answer already. |
|
|
46
53
|
| 409 | `document.conflict` | The page has moved on since the version the write started from (`baseVersion`), or was written at that path by someone else first. |
|
|
47
54
|
| 409 | `document.archived` | The page is archived: restore it before writing to it or attaching to it. |
|
|
@@ -50,7 +57,7 @@ The API is the board as its members see it: the people, the projects, and in eac
|
|
|
50
57
|
| 409 | `connect.approved` | The connection was approved already; the command claims its token. |
|
|
51
58
|
| 429 | `connect.too_many` | As many agents ask to connect as the console holds at once; try again in a few minutes. |
|
|
52
59
|
| 409 | `person.last_admin` | The change would leave the board without an administrator. |
|
|
53
|
-
| 409 | `run.over`, `run.
|
|
60
|
+
| 409 | `run.over`, `run.task_closed` | The run has ended already; the task is done or dropped. A run open on a task is no refusal: a new run takes it over ([ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)). |
|
|
54
61
|
| 413 | `request.too_large` | The body is over the limit; for a file handed in or attached, the file is over `MAX_FILE_BYTES`. |
|
|
55
62
|
| 503 | `file.store_unavailable` | The bytes of files are kept in a bucket, and it did not answer or refused the console; `retry-after` says when to try again. Nothing was written on the run or the page. |
|
|
56
63
|
|
|
@@ -70,20 +77,32 @@ Takes `role` and answers the person. For an administrator signed in on the conso
|
|
|
70
77
|
|
|
71
78
|
### `GET /api/v1/projects`
|
|
72
79
|
|
|
73
|
-
`{ "items": [project, ...] }`: the projects the asker may see, by name. A project carries its `key` (what paths and the command say; lowercase letters, digits and hyphens; immutable), `name`, `description`, `visibility` (`workspace`: everyone of the workspace is a member; `private`: only those listed), `skillsAddress` (canonical, or `null` for the organization's), `role` (what the asker is in it: `owner`, who configures it, or `member`, who works in it), `openDecisions` and `openRuns` (
|
|
80
|
+
`{ "items": [project, ...] }`: the projects the asker may see, by name. A project carries its `key` (what paths and the command say; lowercase letters, digits and hyphens; immutable), `name`, `description`, `visibility` (`workspace`: everyone of the workspace is a member; `private`: only those listed), `skillsAddress` (canonical, or `null` for the organization's), its mark, `color` (one of `COLOR_NAMES`, or `null`) and `symbol` (up to `MAX_PROJECT_SYMBOL_LENGTH` characters with no whitespace, or `null`; where either is `null` the pages choose one from the key and the name, `projectColorOf` and `projectSymbolOf`, so that projects are told apart either way), `icon` (the project's own image for its mark, shown in place of the symbol: its `sha256` and its `contentType`, one of `PROJECT_ICON_TYPES`; or `null`), `role` (what the asker is in it: `owner`, who configures it, or `member`, who works in it), `openDecisions` (the decisions waiting in it) and `openRuns` (the runs open in it: begun and not ended, which says nothing of whether an agent is still at them, [ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)), `createdAt` and `updatedAt`. A workspace administrator sees every project, as its owner; a member sees those open to the workspace, as a member, and those they are listed in, as what they are listed.
|
|
74
81
|
|
|
75
82
|
### `POST /api/v1/projects`
|
|
76
83
|
|
|
77
|
-
Takes `key` and `name`, and optionally `description`, `visibility` (default `private`)
|
|
84
|
+
Takes `key` and `name`, and optionally `description`, `visibility` (default `private`), `skillsAddress` (checked as the standard spells one, kept canonical; `project.invalid_address`), `color` and `symbol`. For whoever is signed in on the console's own pages, never with a token; they become the project's owner. Answers `201` with the project and writes a `project.created` event in it, with `key` and `name`. A key taken is `project.key_taken`.
|
|
78
85
|
|
|
79
86
|
### `GET /api/v1/events?after=&limit=`
|
|
80
87
|
|
|
81
|
-
The workspace's own events, the ones about no project: who joined (`person.joined`), who was made what (`person.role_changed`). The same shape and parameters as a project's feed below, without the filters.
|
|
88
|
+
The workspace's own events, the ones about no project: who joined (`person.joined`), who was made what (`person.role_changed`), and what became of the categories (`category.created`, `category.updated`, `category.removed`, each with the `key` and the `name`). The same shape and parameters as a project's feed below, without the filters.
|
|
82
89
|
|
|
83
90
|
### `PATCH /api/v1/me`
|
|
84
91
|
|
|
85
92
|
Keeps the person's own choice of language for the pages ([ADR-0012](../adr/0012-the-pages-speak-the-persons-language-from-packs-that-ship-with-the-package.md)): `{ "language": "ko" }`, a language tag as a browser sends one, or `null` to choose none and let the browser's languages decide; answers what `GET` answers. A person's own doing, from the console's own pages: never with a token.
|
|
86
93
|
|
|
94
|
+
### `GET /api/v1/categories`
|
|
95
|
+
|
|
96
|
+
`{ "items": [category, ...] }`: the kinds of work tasks are sorted into ([ADR-0019](../adr/0019-a-task-is-planned-in-days-the-board-keeps-its-moments-and-goals-and-categories-give-the-work-its-shape.md)), by name, for whoever is signed in or presents a token. A category carries its `key` (what the command and the filters say; lowercase letters, digits and hyphens; immutable), `name`, `color` (one of `CATEGORY_COLORS`, a name the pages paint and never a value typed), `createdAt` and `updatedAt`. Every workspace starts with `engineering`, `product`, `design`, `marketing` and `operations`.
|
|
97
|
+
|
|
98
|
+
### `POST /api/v1/categories`, `PATCH /api/v1/categories/<key>` and `DELETE /api/v1/categories/<key>`
|
|
99
|
+
|
|
100
|
+
Kept by an administrator signed in on the console's own pages, never with a token, as the rest of configuring is. `POST` takes `key`, `name` and optionally `color` (default `gray`), answers `201` with the category and writes a `category.created` event in the workspace's own feed with `key` and `name`; a key taken is `category.key_taken`, and the workspace holds at most `MAX_CATEGORIES` (`category.too_many`). `PATCH` takes any of `name` and `color`, answers the category and writes `category.updated` naming the `fields`; what is already so writes nothing; the key does not change. `DELETE` answers `204` and writes `category.removed`; a category tasks are sorted into is `category.in_use` until they are moved out of it.
|
|
101
|
+
|
|
102
|
+
### `GET /api/v1/work`
|
|
103
|
+
|
|
104
|
+
`{ "tasks": [{ "project": { "key", "name", "color", "symbol", "icon" }, "task" }, ...], "decisions": [{ "project", "decision" }, ...] }`: what is on the asker's plate across the projects they may see ([ADR-0019](../adr/0019-a-task-is-planned-in-days-the-board-keeps-its-moments-and-goals-and-categories-give-the-work-its-shape.md)): the open tasks assigned to them, the sooner due first and those with no day last, and the decisions that wait for a person, the longest waiting first; each with the project it belongs to, so that a page says and links it. At most `LIST_LIMIT` of each.
|
|
105
|
+
|
|
87
106
|
### `GET /api/v1/tokens` and `POST /api/v1/tokens`
|
|
88
107
|
|
|
89
108
|
The tokens of whoever is signed in, for their agents, scripts and consoles of their own: managed by a person signed in on the console's own pages, never with a token, so that a token which leaks cannot outlive its removal through tokens of its own. `GET` answers `{ "items": [token, ...] }`, the live ones newest first: `id`, `name`, `createdAt`, `expiresAt` (or `null` for a token that does not expire), `lastUsedAt` (or `null`; noted at most hourly), and never a secret. `POST` takes `name` (what the person calls it: the agent it is for, where it runs; what the board shows at work unless the agent says otherwise, and what an event names as the agent) and optionally `expiresInDays` (`1` to `MAX_TOKEN_DAYS`; `DEFAULT_TOKEN_DAYS` when left out; `null` for a token that does not expire, where the organization allows one; `token.expiry_at_most` otherwise) and answers `201` with `{ "token": token, "secret": "cns_t_..." }`: the secret this once, which the server keeps only as a hash.
|
|
@@ -112,7 +131,11 @@ Everything below is under `/api/v1/projects/<key>`, for whoever may see the proj
|
|
|
112
131
|
|
|
113
132
|
### `GET /api/v1/projects/<key>` and `PATCH /api/v1/projects/<key>`
|
|
114
133
|
|
|
115
|
-
The project, as the asker sees it. A patch, for an owner signed in, takes any of `name`, `description`, `visibility
|
|
134
|
+
The project, as the asker sees it. A patch, for an owner signed in, takes any of `name`, `description`, `visibility`, `skillsAddress` (`null` for the organization's), `color` and `symbol` (`null` for none), and writes a `project.updated` event naming the `fields`; what is already so writes nothing. The key does not change.
|
|
135
|
+
|
|
136
|
+
### `POST /api/v1/projects/<key>/icon`, `DELETE .../icon` and `GET .../icon`
|
|
137
|
+
|
|
138
|
+
The project's own image for its mark, in place of the symbol on the colour. `POST`, for an owner signed in on the console's own pages, takes a form with a part called `file`: a PNG, a JPEG, a GIF or a WebP of at most `MAX_PROJECT_ICON_BYTES`, known by its first bytes and never by what the form says of it (`project.invalid_icon`; `request.too_large`). The bytes are kept by their hash, the project is answered with its `icon`, and the board hears `project.updated` with `fields: ["icon"]`; the same image again writes nothing. `DELETE` takes the image away and answers the project. `GET`, for whoever may see the project, answers the bytes with their type, the hash as `ETag` and `Cache-Control: private, max-age=86400`, or `304` to a matching `If-None-Match`; a project without an image is `project.no_icon`. The pages read it at `projectIconPath(key, icon)`, which carries the hash as a version.
|
|
116
139
|
|
|
117
140
|
### `GET /api/v1/projects/<key>/members` and `POST /api/v1/projects/<key>/members`
|
|
118
141
|
|
|
@@ -122,21 +145,21 @@ The project, as the asker sees it. A patch, for an owner signed in, takes any of
|
|
|
122
145
|
|
|
123
146
|
For an owner signed in. The patch takes `role` and writes `project.member_changed`; the removal answers `204` and writes `project.member_removed`. A person not listed is `member.not_found`. A project may be left without an owner listed; the administrators own it then.
|
|
124
147
|
|
|
125
|
-
### `GET /api/v1/projects/<key>/tasks?state=`
|
|
148
|
+
### `GET /api/v1/projects/<key>/tasks?state=&open=&category=&goal=&assignee=&dueBy=&limit=&offset=`
|
|
126
149
|
|
|
127
|
-
`{ "items": [task, ...] }`: the project's board, newest first, at
|
|
150
|
+
`{ "items": [task, ...], "more": boolean }`: the project's board, newest first, a page at a time: `limit` (1 to `LIST_LIMIT`, the default) and `offset` (from 0) say which page, and `more` whether there is one after it; a `limit` or an `offset` that is not a number in range is `request.invalid`. `state` keeps one state of it; `open=true` the tasks not done or dropped, `open=false` the rest; `category=<key>` those sorted into a category; `goal=<id>` those that work towards a goal; `assignee=<person id>` those assigned to one person; `dueBy=<day>` (`2026-10-24`) those due on that day or before it. A task carries its `number` (the one people say out loud, numbered per project), `title`, `body` (Markdown, to be shown as text or rendered to elements, never as HTML), `state`, `priority`, `owner`, `assignee` (a person, or `null`), `parentId`, `category` (its `key`, `name` and `color` as the workspace keeps it, or `null`), `goalId` (or `null`), its plan ([ADR-0019](../adr/0019-a-task-is-planned-in-days-the-board-keeps-its-moments-and-goals-and-categories-give-the-work-its-shape.md)): `startsOn` and `dueOn`, each a day (`2026-10-24`) or `null`; its moments, which the board keeps itself: `startedAt`, when it was first moved past `ready`, and `doneAt`, when it was moved to `done`, each an instant or `null`; `links` (`url` and `label`), `openDecisions` (how many decisions about it wait for a person), `openRuns` (how many runs on it are open: begun and not ended, which says nothing of whether an agent is still at it, [ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)), `createdAt` and `updatedAt`.
|
|
128
151
|
|
|
129
152
|
### `POST /api/v1/projects/<key>/tasks`
|
|
130
153
|
|
|
131
|
-
Takes `title`, and optionally `body`, `state` (default `idea`), `priority` (default `normal`), `assigneeId` (a person who may work in the project: everyone of the workspace for a project open to it, those listed for a private one, an administrator anywhere; `task.invalid_assignee`), `parentId` (a task of the project) and `links`. The owner is whoever writes it. Answers `201` with the task, numbered after the project's last, and writes a `task.created` event.
|
|
154
|
+
Takes `title`, and optionally `body`, `state` (default `idea`), `priority` (default `normal`), `assigneeId` (a person who may work in the project: everyone of the workspace for a project open to it, those listed for a private one, an administrator anywhere; `task.invalid_assignee`), `parentId` (a task of the project), `category` (the key of a category of the workspace, or `null`; `task.invalid_category`), `goalId` (a goal of the project, or `null`; `task.invalid_goal`), `startsOn` and `dueOn` (days; the due day not before the start, `task.invalid_dates`) and `links`. The owner is whoever writes it. Answers `201` with the task, numbered after the project's last, and writes a `task.created` event. A task written past `ready` has its `startedAt`; one written `done` has its `doneAt` too.
|
|
132
155
|
|
|
133
156
|
### `GET /api/v1/projects/<key>/tasks/<id or number>` and `PATCH .../tasks/<id>`
|
|
134
157
|
|
|
135
|
-
One task, by its id or by its number in the project (`/tasks/7`): the pages hold ids, people and their agents say numbers. A patch takes the id and names only what changes, with the same fields as a creation; a field set to `null` clears it. A change of `state` is a `task.moved` event with `from` and `to`; any other change is one `task.updated` event naming the `fields
|
|
158
|
+
One task, by its id or by its number in the project (`/tasks/7`): the pages hold ids, people and their agents say numbers. A patch takes the id and names only what changes, with the same fields as a creation; a field set to `null` clears it. A change of `state` is a `task.moved` event with `from` and `to`; any other change is one `task.updated` event naming the `fields` (`category`, `goalId`, `startsOn` and `dueOn` among them, as the input names them). A patch that changes nothing writes nothing and answers the task as it is. The moments follow the moves: the first move past `ready` sets `startedAt`, a move to `done` sets `doneAt`, and a move back out of `done` clears it.
|
|
136
159
|
|
|
137
|
-
### `GET /api/v1/projects/<key>/decisions?open=&task=`
|
|
160
|
+
### `GET /api/v1/projects/<key>/decisions?open=&task=&limit=&offset=`
|
|
138
161
|
|
|
139
|
-
`{ "items": [decision, ...] }`: the project's, the ones that wait first, newest first within each; `open=true` keeps only those that wait, `task=<id>` only those about one task. A decision carries its `question`, `body` (Markdown: the context it rests on), `options` (each an `id` and a `label`), `taskId` and `taskNumber` (or `null`), `raisedBy`, `run` (the `id` and `agent` of the run that raised it, when an agent asked, or `null`), `answer`: `null` while it waits, else the chosen `option`, a `note` or `null` (the rationale given with it), `by` and `at`; and `outcome`, what followed, in Markdown, or `null` until someone writes it. Context, rationale and outcome make the decision a record ([ADR-0009](../adr/0009-documents-are-pages-of-markdown-in-a-project-addressed-by-path-versioned-and-linked-both-ways.md)); a link in any of them to a document's path is kept both ways, so that the document says the decision refers to it.
|
|
162
|
+
`{ "items": [decision, ...], "more": boolean }`: the project's, the ones that wait first, newest first within each, a page at a time as the tasks are (`limit`, `offset`, `more`); `open=true` keeps only those that wait, `task=<id>` only those about one task. A decision carries its `question`, `body` (Markdown: the context it rests on), `options` (each an `id` and a `label`), `taskId` and `taskNumber` (or `null`), `raisedBy`, `run` (the `id` and `agent` of the run that raised it, when an agent asked, or `null`), `answer`: `null` while it waits, else the chosen `option`, a `note` or `null` (the rationale given with it), `by` and `at`; and `outcome`, what followed, in Markdown, or `null` until someone writes it. Context, rationale and outcome make the decision a record ([ADR-0009](../adr/0009-documents-are-pages-of-markdown-in-a-project-addressed-by-path-versioned-and-linked-both-ways.md)); a link in any of them to a document's path is kept both ways, so that the document says the decision refers to it.
|
|
140
163
|
|
|
141
164
|
### `POST /api/v1/projects/<key>/decisions`
|
|
142
165
|
|
|
@@ -152,13 +175,21 @@ The answer takes `option` (the id of one of its options) and optionally a `note`
|
|
|
152
175
|
|
|
153
176
|
Grows the record: takes any of `body` (the context) and `outcome` (what followed; empty clears it), for anyone who may work in the project, with a session from the console's own pages or a token, answered or not. Writes a `decision.updated` event naming the `fields`; a patch that changes nothing writes nothing.
|
|
154
177
|
|
|
155
|
-
### `GET /api/v1/projects/<key>/
|
|
178
|
+
### `GET /api/v1/projects/<key>/goals` and `POST /api/v1/projects/<key>/goals`
|
|
179
|
+
|
|
180
|
+
The roadmap ([ADR-0019](../adr/0019-a-task-is-planned-in-days-the-board-keeps-its-moments-and-goals-and-categories-give-the-work-its-shape.md)). `GET`, for whoever may see the project, answers `{ "items": [goal, ...] }`: the active goals first, then the planned, the reached and the dropped, the sooner due first within each and the older first among those with no day; at most `LIST_LIMIT`. A goal carries its `title`, `body` (Markdown: what reaching it means), `state` (`planned`, `active`, `done`, `dropped`), `dueOn` (the day it is meant to be reached by, or `null`), `createdBy`, `taskCounts` (the tasks that work towards it, counted by state: `idea`, `ready`, `in_progress`, `in_review`, `done`, `dropped`; read from the board as it stands, never written down), `createdAt` and `updatedAt`. `POST`, for an owner of the project, from the console's own pages or with a token, takes `title` and optionally `body`, `state` (default `planned`) and `dueOn`, answers `201` with the goal and writes a `goal.created` event with its `title`; a member is `auth.forbidden`.
|
|
181
|
+
|
|
182
|
+
### `GET .../goals/<id>` and `PATCH .../goals/<id>`
|
|
183
|
+
|
|
184
|
+
One goal, for whoever may see the project. The patch, for an owner, takes any of `title`, `body`, `state` and `dueOn` (`null` for none), answers the goal and writes `goal.updated` naming the `fields`; a patch that changes nothing writes nothing. A goal is never deleted: one let go is `dropped`. A task works towards a goal through its `goalId`; the goal's events are read from the project's feed with `goal=<id>`.
|
|
185
|
+
|
|
186
|
+
### `GET /api/v1/projects/<key>/runs?task=&open=&mine=&limit=&offset=` and `GET .../runs/<id>`
|
|
156
187
|
|
|
157
|
-
`{ "items": [run, ...] }`: the project's runs, newest first, at
|
|
188
|
+
`{ "items": [run, ...], "more": boolean }`: the project's runs, newest first, a page at a time as the tasks are (`limit`, `offset`, `more`); `task=<id>` keeps those on one task, `open=true` those not over (`running` or `waiting`) and `open=false` those over, `mine=true` the asker's own: with a token, the runs begun with that token, which is one agent's; on a session, the runs for the person. A run is one agent's work on one task for one person: `taskId` and `taskNumber` (the one people say), `person` (whom the agent acts for), `agent` (what it calls itself), `status` (`running`, that is open, `waiting` for a decision, `finished`, `failed`, `abandoned`), `startedAt`, `endedAt` or `null`, `lastHeardAt` (when the agent was last heard from through the run: its start, then its latest report, hand-in or question; the console knows nothing of an agent but what it sends, and claims nothing more, [ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)), `summary` (Markdown, what the agent said at the end, or `null`), `reports` (each `id`, `body` in Markdown, `createdAt`; oldest first), `artifacts` (each `id`, `kind`, `url` for a link or `null`, `label` or `null`, `file` for a file or `null`, and `createdAt`; a file is its `name`, `size` in bytes, `contentType` and `sha256`), and `waitingFor`, the id of the decision the run waits for, or `null`.
|
|
158
189
|
|
|
159
190
|
### `POST /api/v1/projects/<key>/runs`
|
|
160
191
|
|
|
161
|
-
Takes `taskId` (a task of the project; `run.task_not_found` otherwise), and optionally `agent` (what people see
|
|
192
|
+
Takes `taskId` (a task of the project; `run.task_not_found` otherwise), and optionally `agent` (what people see on the run, `MAX_AGENT_LENGTH`; left out, the name of the token presented, or the person's login on a session). The run begins: the task becomes the asker's and `in_progress`, and the board is told (`run.started`). A run open on the task is taken over ([ADR-0020](../adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)): it ends as `abandoned`, with a summary that says who took over, and the board is told (`run.taken_over`, by the one who took over, with the `agent` that was at it), since the console cannot tell a run still at work from one whose agent is gone. A task that is `done` or `dropped` cannot be taken (`run.task_closed`). Answers `201` with the run, whose `id` the rest take.
|
|
162
193
|
|
|
163
194
|
### `POST .../runs/<id>/reports` and `POST .../runs/<id>/artifacts`
|
|
164
195
|
|
|
@@ -206,9 +237,9 @@ Put the page away, and bring it back: archived, it is kept out of the folders an
|
|
|
206
237
|
|
|
207
238
|
A file attached to the page, sent and read back exactly as a run hands one in ([above](#post-runsidfiles-and-get-apiv1projectskeyfilesid)): the parts `file` and `label` of a form, kept under the SHA-256 of the bytes, at most `MAX_FILE_BYTES`, at most `MAX_FILES_PER_DOCUMENT` on one page (`document.too_many_files`), and none on an archived page. Answers `201` with the page and writes `document.file_attached` with the label or the file's name. The bytes are read back at the file's `id`, with the same headers and the same policy as a run's file.
|
|
208
239
|
|
|
209
|
-
### `GET /api/v1/projects/<key>/events?after=&limit=&task=&run=&decision=&document=`
|
|
240
|
+
### `GET /api/v1/projects/<key>/events?after=&limit=&task=&run=&decision=&document=&goal=`
|
|
210
241
|
|
|
211
|
-
`{ "items": [event, ...], "more": boolean }`: what happened in the project after event number `after` (`0` for the beginning), oldest first, at most `limit` (default and maximum `EVENTS_PAGE_LIMIT`); `more` says whether there is more after the last item. `task=<id>`, `run=<id>`, `decision=<id>` or `
|
|
242
|
+
`{ "items": [event, ...], "more": boolean }`: what happened in the project after event number `after` (`0` for the beginning), oldest first, at most `limit` (default and maximum `EVENTS_PAGE_LIMIT`); `more` says whether there is more after the last item. `task=<id>`, `run=<id>`, `decision=<id>`, `document=<id>` or `goal=<id>` keeps the events about one of them: how a page shows everything that happened to a task, a run, a decision, a document or a goal. An event carries its `id` (the number), `kind` (one of `EVENT_KINDS`), the `actor` (a person, or, for what an agent did, the person it acts for), `agent` (what the person acted through: the run's agent for what a run did, else the name of the token presented; `null` when a person acted themselves), `projectId`, `taskId`, `decisionId`, `runId`, `documentId` and `goalId` (or `null`), `data` (what a feed shows without asking for the subject: `number`, `title`, `fields`, `from`, `to`, `question`, `option`, `login`, `role`, `key`, `name`, `agent`, `status`, `label`, `excerpt`, `path`, `version`, each only when the kind has it), and `createdAt`.
|
|
212
243
|
|
|
213
244
|
### `GET /api/v1/projects/<key>/events/stream?after=`
|
|
214
245
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillcdn/console",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"description": "What a custom SkillCDN console is built from: the API client and schemas, the components, the composition of the default console, and the console command agents work the board with.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/skillcdn/console#readme",
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: Needs a shell with the console command on the PATH (npm install -g @skillcdn/console, Node.js 24 or newer), signed in by a person. Nothing else; the command needs no key of its own and the agent never sees a token.
|
|
6
6
|
metadata:
|
|
7
7
|
author: skillcdn
|
|
8
|
-
version: "1.
|
|
8
|
+
version: "1.2"
|
|
9
9
|
skillcdn:
|
|
10
10
|
translations:
|
|
11
11
|
ko:
|
|
@@ -37,8 +37,8 @@ The full contract is the [specification of the command line](/docs/specs/cli.md)
|
|
|
37
37
|
|
|
38
38
|
| Input | Source |
|
|
39
39
|
|---|---|
|
|
40
|
-
| The task | Its number (`#7`) or its id, from what the person said. Told to pick one, `console tasks --state ready`
|
|
41
|
-
| The work | The task's body, read with `console task <number>`: what to make, where, the milestones, what to ask. The pages it links to (`console doc <path>`) and the project's skills (`console skills`, each loaded through the agent's own SkillCDN connection) say the rest. |
|
|
40
|
+
| The task | Its number (`#7`) or its id, from what the person said. Told to pick one, `console work` lists what is on the person's plate across their projects, the sooner due first, and `console tasks --state ready --mine` what is ready and theirs in this one (`--due overdue`, `--due week`, `--category <key>` and `--goal <id>` narrow it further); a task is never taken without being told which, or that any ready one may be. |
|
|
41
|
+
| The work | The task's body, read with `console task <number>`: what to make, where, the milestones, what to ask; with its plan, the category, the goal it works towards (`console goal <id>` says what reaching it means) and the days it starts and is due, which the reports and the summary keep to. The pages it links to (`console doc <path>`) and the project's skills (`console skills`, each loaded through the agent's own SkillCDN connection) say the rest. |
|
|
42
42
|
| The organization's way | Its own skill for its console, when it has one, adds which tasks to take, what to report and when to ask; it comes through the same kind of address as its other skills. |
|
|
43
43
|
|
|
44
44
|
## Workflow
|
|
@@ -47,7 +47,7 @@ Each phase ends with something on the board. Only phase 4 waits for a person.
|
|
|
47
47
|
|
|
48
48
|
### Phase 1: Read
|
|
49
49
|
|
|
50
|
-
`console task <number>` shows the task in full, the decisions about it and the runs on it. A run open on it
|
|
50
|
+
`console task <number>` shows the task in full, with its plan, the decisions about it and the runs on it. A run open on it means another agent was at it, and may still be: the console cannot tell ([ADR-0020](/docs/adr/0020-the-console-does-not-claim-an-agent-is-at-work-a-run-says-when-it-was-last-heard-from-and-a-new-run-takes-over.md)), so read its reports and when it was last heard from, and take the task only when the person said to, since taking it ends that run as taken over; otherwise say so and stop. A task that is past its due day is still the task; the first report says so, and what the day was for is kept in mind. Read what the body links to, with `console doc <path>` for the project's pages and `console skills` for the organization's skills, before anything is made.
|
|
51
51
|
|
|
52
52
|
### Phase 2: Take
|
|
53
53
|
|
|
@@ -77,10 +77,11 @@ After the last report, `console finish --summary "<what was done, and what is le
|
|
|
77
77
|
|
|
78
78
|
- Never look for, read, print or send a token. The rules of the repository say the rest.
|
|
79
79
|
- One run at a time: a command on a run acts on the one open run of this token in the project; working two tasks at once, say which with `--run <id>`.
|
|
80
|
-
- The board's words are the vocabulary's own: states `idea`, `ready`, `in_progress`, `in_review`, `done` and `dropped`; priorities `low`, `normal`, `high` and `urgent`. Taking a task moves it, finishing moves it; it is not moved by hand around a run.
|
|
80
|
+
- The board's words are the vocabulary's own: states `idea`, `ready`, `in_progress`, `in_review`, `done` and `dropped`; priorities `low`, `normal`, `high` and `urgent`; a day is `2026-10-24`. Taking a task moves it, finishing moves it; it is not moved by hand around a run. When a task is started and when it is done, the board writes down itself: never typed.
|
|
81
|
+
- The plan is the person's: a task's days, its category and its goal are changed (`console task edit`) only when the task says so or a person asks, and a goal is set or moved (`console goal new`, `console goal edit`) only when the person is an owner and said to.
|
|
81
82
|
- Exit codes: `0` done; `1` refused or unreachable, the reason on standard error as a code and words, which `console help <command>` names; `2` not understood; `3` a decision still waits.
|
|
82
83
|
- Everything sent is held to limits the console states (`console help <command>`); a refusal `request.invalid` names the field.
|
|
83
84
|
|
|
84
85
|
## Terms
|
|
85
86
|
|
|
86
|
-
- **Task**: what is to be done, numbered per project. **Run**: one agent at work on one task for one person, with its reports, what it handed in, and what it waits for. **Decision**: a question with options, which a person answers on the board. **Page**: a document of the project, Markdown at a path that does not change. **Project**: a board of its own, with its members and its skills address.
|
|
87
|
+
- **Task**: what is to be done, numbered per project, with its plan (a category, a goal, the days it starts and is due) and its moments (when it was started and done, which the board keeps). **Goal**: what the project works towards, on its roadmap, with the day it is meant to be reached by; its progress is its tasks. **Category**: a kind of work, the workspace's word for it, by key. **Run**: one agent at work on one task for one person, with its reports, what it handed in, and what it waits for. **Decision**: a question with options, which a person answers on the board. **Page**: a document of the project, Markdown at a path that does not change. **Project**: a board of its own, with its members and its skills address.
|
package/src/api.ts
CHANGED
|
@@ -12,7 +12,9 @@ export {
|
|
|
12
12
|
type EventFilter,
|
|
13
13
|
type FetchLike,
|
|
14
14
|
type FileUpload,
|
|
15
|
+
type Page,
|
|
15
16
|
type ProjectClient,
|
|
17
|
+
type TaskFilter,
|
|
16
18
|
} from "./client.js";
|
|
17
19
|
export {
|
|
18
20
|
CONNECT_CODE_ALPHABET,
|
|
@@ -30,12 +32,16 @@ export {
|
|
|
30
32
|
nameOf,
|
|
31
33
|
} from "./documents.js";
|
|
32
34
|
export {
|
|
35
|
+
DEFAULT_PAGE_LIMIT,
|
|
33
36
|
DEFAULT_TOKEN_DAYS,
|
|
34
37
|
EVENTS_PAGE_LIMIT,
|
|
35
38
|
LIST_LIMIT,
|
|
36
39
|
MAX_AGENT_LENGTH,
|
|
37
40
|
MAX_ARTIFACTS_PER_RUN,
|
|
38
41
|
MAX_BODY_LENGTH,
|
|
42
|
+
MAX_CATEGORIES,
|
|
43
|
+
MAX_CATEGORY_KEY_LENGTH,
|
|
44
|
+
MAX_CATEGORY_NAME_LENGTH,
|
|
39
45
|
MAX_DOCUMENT_LENGTH,
|
|
40
46
|
MAX_DOCUMENT_PATH_LENGTH,
|
|
41
47
|
MAX_DOCUMENT_SEGMENT_LENGTH,
|
|
@@ -49,8 +55,10 @@ export {
|
|
|
49
55
|
MAX_OPTION_LABEL_LENGTH,
|
|
50
56
|
MAX_OPTIONS,
|
|
51
57
|
MAX_PROJECT_DESCRIPTION_LENGTH,
|
|
58
|
+
MAX_PROJECT_ICON_BYTES,
|
|
52
59
|
MAX_PROJECT_KEY_LENGTH,
|
|
53
60
|
MAX_PROJECT_NAME_LENGTH,
|
|
61
|
+
MAX_PROJECT_SYMBOL_LENGTH,
|
|
54
62
|
MAX_QUESTION_LENGTH,
|
|
55
63
|
MAX_REPORTS_PER_RUN,
|
|
56
64
|
MAX_SEARCH_LENGTH,
|
|
@@ -65,15 +73,18 @@ export {
|
|
|
65
73
|
MAX_VERSIONS_PER_DOCUMENT,
|
|
66
74
|
MIN_OPTIONS,
|
|
67
75
|
} from "./limits.js";
|
|
76
|
+
export { projectColorOf, projectSymbolOf } from "./marks.js";
|
|
68
77
|
export {
|
|
69
78
|
AUTH_ROUTES,
|
|
70
79
|
CLAIM_PATH,
|
|
80
|
+
categoryPath,
|
|
71
81
|
connectPath,
|
|
72
82
|
isSignInFailure,
|
|
73
83
|
loginPath,
|
|
74
84
|
PROJECT_COLLECTIONS,
|
|
75
85
|
type ProjectCollection,
|
|
76
86
|
personTokensPath,
|
|
87
|
+
projectIconPath,
|
|
77
88
|
projectPath,
|
|
78
89
|
REST_ROUTES,
|
|
79
90
|
RETURN_TO_PARAM,
|
|
@@ -88,6 +99,10 @@ export {
|
|
|
88
99
|
type RestArtifact,
|
|
89
100
|
type RestArtifactInput,
|
|
90
101
|
type RestBacklink,
|
|
102
|
+
type RestCategories,
|
|
103
|
+
type RestCategory,
|
|
104
|
+
type RestCategoryInput,
|
|
105
|
+
type RestCategoryPatch,
|
|
91
106
|
type RestClaim,
|
|
92
107
|
type RestClaimInput,
|
|
93
108
|
type RestConnectInput,
|
|
@@ -110,6 +125,10 @@ export {
|
|
|
110
125
|
type RestEvents,
|
|
111
126
|
type RestFile,
|
|
112
127
|
type RestFileInput,
|
|
128
|
+
type RestGoal,
|
|
129
|
+
type RestGoalInput,
|
|
130
|
+
type RestGoalPatch,
|
|
131
|
+
type RestGoals,
|
|
113
132
|
type RestMe,
|
|
114
133
|
type RestMember,
|
|
115
134
|
type RestMemberInput,
|
|
@@ -120,6 +139,7 @@ export {
|
|
|
120
139
|
type RestPerson,
|
|
121
140
|
type RestPersonPatch,
|
|
122
141
|
type RestProject,
|
|
142
|
+
type RestProjectIcon,
|
|
123
143
|
type RestProjectInput,
|
|
124
144
|
type RestProjectPatch,
|
|
125
145
|
type RestProjects,
|
|
@@ -133,6 +153,7 @@ export {
|
|
|
133
153
|
type RestSkill,
|
|
134
154
|
type RestSkills,
|
|
135
155
|
type RestTask,
|
|
156
|
+
type RestTaskCounts,
|
|
136
157
|
type RestTaskInput,
|
|
137
158
|
type RestTaskLink,
|
|
138
159
|
type RestTaskPatch,
|
|
@@ -144,10 +165,15 @@ export {
|
|
|
144
165
|
type RestVersion,
|
|
145
166
|
type RestVersionSummary,
|
|
146
167
|
type RestVersions,
|
|
168
|
+
type RestWork,
|
|
147
169
|
restAnswerInputSchema,
|
|
148
170
|
restArtifactInputSchema,
|
|
149
171
|
restArtifactSchema,
|
|
150
172
|
restBacklinkSchema,
|
|
173
|
+
restCategoriesSchema,
|
|
174
|
+
restCategoryInputSchema,
|
|
175
|
+
restCategoryPatchSchema,
|
|
176
|
+
restCategorySchema,
|
|
151
177
|
restClaimInputSchema,
|
|
152
178
|
restClaimSchema,
|
|
153
179
|
restConnectInputSchema,
|
|
@@ -170,6 +196,10 @@ export {
|
|
|
170
196
|
restEventsSchema,
|
|
171
197
|
restFileInputSchema,
|
|
172
198
|
restFileSchema,
|
|
199
|
+
restGoalInputSchema,
|
|
200
|
+
restGoalPatchSchema,
|
|
201
|
+
restGoalSchema,
|
|
202
|
+
restGoalsSchema,
|
|
173
203
|
restMemberInputSchema,
|
|
174
204
|
restMemberPatchSchema,
|
|
175
205
|
restMemberSchema,
|
|
@@ -179,6 +209,7 @@ export {
|
|
|
179
209
|
restPeopleSchema,
|
|
180
210
|
restPersonPatchSchema,
|
|
181
211
|
restPersonSchema,
|
|
212
|
+
restProjectIconSchema,
|
|
182
213
|
restProjectInputSchema,
|
|
183
214
|
restProjectPatchSchema,
|
|
184
215
|
restProjectSchema,
|
|
@@ -192,6 +223,7 @@ export {
|
|
|
192
223
|
restRunsSchema,
|
|
193
224
|
restSkillSchema,
|
|
194
225
|
restSkillsSchema,
|
|
226
|
+
restTaskCountsSchema,
|
|
195
227
|
restTaskInputSchema,
|
|
196
228
|
restTaskLinkSchema,
|
|
197
229
|
restTaskPatchSchema,
|
|
@@ -204,21 +236,31 @@ export {
|
|
|
204
236
|
restVersionSchema,
|
|
205
237
|
restVersionSummarySchema,
|
|
206
238
|
restVersionsSchema,
|
|
239
|
+
restWorkSchema,
|
|
207
240
|
} from "./schemas.js";
|
|
208
241
|
export { hasForbiddenCodePoint } from "./text.js";
|
|
209
242
|
export {
|
|
210
243
|
ARTIFACT_KINDS,
|
|
211
244
|
type ArtifactKind,
|
|
245
|
+
CATEGORY_COLORS,
|
|
246
|
+
type CategoryColor,
|
|
247
|
+
COLOR_NAMES,
|
|
248
|
+
type ColorName,
|
|
212
249
|
EVENT_KINDS,
|
|
213
250
|
type EventKind,
|
|
251
|
+
GOAL_STATES,
|
|
252
|
+
type GoalState,
|
|
214
253
|
isProviderKey,
|
|
215
254
|
LINK_SOURCES,
|
|
216
255
|
type LinkSource,
|
|
256
|
+
OPEN_TASK_STATES,
|
|
217
257
|
PERSON_ROLES,
|
|
218
258
|
type PersonRole,
|
|
259
|
+
PROJECT_ICON_TYPES,
|
|
219
260
|
PROJECT_ROLES,
|
|
220
261
|
PROJECT_VISIBILITIES,
|
|
221
262
|
PROVIDER_KEYS,
|
|
263
|
+
type ProjectIconType,
|
|
222
264
|
type ProjectRole,
|
|
223
265
|
type ProjectVisibility,
|
|
224
266
|
type ProviderKey,
|