Radish alpha
h
Radicle Heartwood Protocol & Stack
Radicle
Git (anonymous pull)
Log in to clone via SSH
tasks: Add spec for Tasks cob
✗ 0/1 checks passed ade wants to merge 10 commits into master · opened 2 months ago

An initial stab at a spec for task cob to help us (me) organise.

Conceptually broken into:

  • Boards
  • Steps (may rename to status)
  • Tasks

A board is a collection of steps which in turn are a collection of tasks.

Steps and tasks are ordered. Steps can have a defined start and end so as to enable something like a backlog which is the default step for tasks to be added to but may not be rendered.

Tasks are progressively moved from the start step to the end step and eventually archived.

Boards have goals to focus their intent and usage. Only delegates may create and maintain the boards.

There should be enough sorting and filtering to enable different types of views.

Some checks failed — 0 passed, 1 failed View logs ↗
9 files changed +494 -1 7bac1714 478bc5e0
modified Cargo.lock
@@ -3015,6 +3015,10 @@ dependencies = [
]

[[package]]
+
name = "radicle-cob-tasks"
+
version = "0.1.0"
+

+
[[package]]
name = "radicle-core"
version = "0.1.0"
dependencies = [
modified Cargo.toml
@@ -29,7 +29,9 @@ cypheraddr = "0.4.0"
cyphernet = "0.5.2"
dunce = "1.0.5"
fastrand = { version = "2.0.0", default-features = false }
-
git2 = { version = "0.20.4", default-features = false, features = ["vendored-libgit2"] }
+
git2 = { version = "0.20.4", default-features = false, features = [
+
  "vendored-libgit2",
+
] }
gix-hash = { version = "0.22.1", default-features = false, features = ["sha1"] }
gix-packetline = { version = "0.21.1", default-features = false }
human-panic = "2.0.6"
@@ -47,6 +49,7 @@ radicle = { version = "0.21", path = "crates/radicle" }
radicle-cli = { version = "0.18", path = "crates/radicle-cli" }
radicle-cli-test = { path = "crates/radicle-cli-test" }
radicle-cob = { version = "0.18", path = "crates/radicle-cob" }
+
radicle-tasks = { version = "0.1", path = "crates/radicle-tasks" }
radicle-core = { version = "0.1", path = "crates/radicle-core" }
radicle-crypto = { version = "0.15", path = "crates/radicle-crypto" }
radicle-dag = { version = "0.10", path = "crates/radicle-dag" }
added crates/radicle-tasks/Cargo.toml
@@ -0,0 +1,11 @@
+
[package]
+
name = "radicle-tasks"
+
description = "Radicle Tasks COB"
+
homepage.workspace = true
+
repository.workspace = true
+
version = "0.1.0"
+
authors = ["Adrian Duke <adrian.duke@gmail.com>"]
+
edition.workspace = true
+
license.workspace = true
+
keywords = ["radicle", "cob", "cobs", "tasks"]
+
rust-version.workspace = true
added crates/radicle-tasks/README.md
@@ -0,0 +1 @@
+
# Tasks COB
added crates/radicle-tasks/features/board-lord.md
@@ -0,0 +1,315 @@
+
# Persona: Board Leader
+

+
## Goal: Structure boards workflow to the their culture
+

+
## Goal: Maintain the smallest set of boards to manage tasks at hand
+

+
## Goal: Focus boards with a goal
+

+
### Feature and scenario headings:
+

+
> Note that ✗ = unhappy paths and ✓ = happy paths, the order of items below should be shortest to longest path through each feature.
+

+
- Create a board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Empty
+
    - Name
+
  - ✗ Invalid Characters
+
    - Name
+
    - Goal
+
  - ✗ Too Long
+
    - Name
+
    - Goal
+
  - ✗ Non-delegate can't create board
+
  - ✗ Name already exists
+
  - ✓ Delegate creates board
+
    - No Goal
+

+
    ```
+
    $ rad board create --name "Engineering"
+
    ✓ Board 'Engineering' created (b67a123)
+
    ```
+

+
    - With Goal
+

+
    ```
+
    $ rad board create --name "Engineering" --goal "Ship V1"
+
    ✓ Board 'Engineering' created (b67a123)
+
    ```
+

+
- Show board
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Invalid sort
+
  - ✗ Invalid filter
+
  - ✗ Invalid assignee
+
  - ✓ Shown
+
    - Views:
+
      - Board view
+
        - No tasks
+
        - One task
+
        - Many tasks
+

+
        ```
+
        $ rad board show b67a123
+
        ╭──────────────────────────────────────────────────────────────────────────────╮
+
        │ Name     Engineering                                                         │
+
        │ Board    b67a123...                                                          │
+
        │ Goal     Ship V1                                                             │
+
        ├──────────────────────────────────────────────────────────────────────────────┤
+
        │ Todo                     │ Doing                    │ Done                   │
+
        ├──────────────────────────┼──────────────────────────┼────────────────────────┤
+
        │ ● 27d3132                │ ● 91f64c0                │ ● c10ecd2              │
+
        │   Change passphrase      │   Add CLI command for    │   git push: info links │
+
        │   prompt                 │   canonical refs         │   wrong                │
+
        │                          │                          │                        │
+
        │ ● 4e2a36e                │                          │ ● 23fef8f              │
+
        │   refs/heads/* cref      │                          │   Collect errors for   │
+
        │   rule conflicts         │                          │   fetch updates        │
+
        │                          │                          │                        │
+
        ╰──────────────────────────────────────────────────────────────────────────────╯
+
        ```
+

+
      - Table view
+
        - No tasks
+
        - One task
+
        - Many tasks
+

+
        ```
+
        $ rad board show b67a123 --table
+
        ╭─────────────────────────────────────────────────────────────────────────────────────╮
+
        │ ●    ID        Step    Title                  Assignee         Labels               │
+
        ├─────────────────────────────────────────────────────────────────────────────────────┤
+
        │ ●    27d3132   Todo    Change passphrase...   z6MkkPv...       bug                  │
+
        │ ●    91f64c0   Doing   Add CLI command...     z6MkkPv...       enhancement          │
+
        ╰─────────────────────────────────────────────────────────────────────────────────────╯
+
        ```
+

+
    - Filter
+
      - By step
+
        ```
+
        $ rad board show b67a123 --step "Todo"
+
        ...
+
        ```
+
      - By assignee
+
        ```
+
        $ rad board show b67a123 --assignee z6MkkPvad...
+
        ...
+
        ```
+
      - By author
+
        ```
+
        $ rad board show b67a123 --author adrianduke
+
        ...
+
        ```
+
      - By fuzzy search
+
        ```
+
        $ rad board show b67a123 --search "CLI"
+
        ...
+
        ```
+
    - Sort
+
      - By creation
+
        ```
+
        $ rad board show b67a123 --sort created
+
        ...
+
        ```
+
      - By updated
+
        ```
+
        $ rad board show b67a123 --sort updated
+
        ...
+
        ```
+
      - By assignee
+
        ```
+
        $ rad board show b67a123 --sort assignee
+
        ...
+
        ```
+
      - By author
+
        ```
+
        $ rad board show b67a123 --sort author
+
        ...
+
        ```
+
    - Archived
+
      ```
+
      $ rad board show b67a123 --archived
+
      ...
+
      ```
+

+
- Add step(s) to board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Empty
+
    - Label
+
  - ✗ Invalid Characters
+
    - Label
+
  - ✗ Too Long
+
    - Label
+
  - ✗ Label already exists
+
  - ✗ Label not found
+
    - Preceeding
+
    - Proceeding
+
    - Preceeding & Proceeding
+
  - ✓ Start step already exists; adds new start
+
    ```
+
    $ rad board step add b67a123 --label "Inbox" --start
+
    ✓ Step 'Inbox' added to board 'Engineering'
+
    ```
+
  - ✓ End step already exists; adds new end
+
    ```
+
    $ rad board step add b67a123 --label "Deployed" --end
+
    ✓ Step 'Deployed' added to board 'Engineering'
+
    ```
+
  - ✓ Nominate step
+
    - Start
+

+
    ```
+
    $ rad board step add b67a123 --label "Backlog" --start
+
    ✓ Step 'Backlog' added to board 'Engineering'
+
    ```
+

+
    - End
+

+
    ```
+
    $ rad board step add b67a123 --label "Done" --end
+
    ✓ Step 'Done' added to board 'Engineering'
+
    ```
+

+
- Remove step(s) from board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✗ Cannot remove nominated Start/End step (must re-nominate)
+
  - ✓ Empty start step
+
    ```
+
    $ rad board step rm b67a123 --step "Inbox"
+
    ✓ Step 'Inbox' removed from board 'Engineering'
+
    ```
+
  - ✓ Empty end step
+
    ```
+
    $ rad board step rm b67a123 --step "Deployed"
+
    ✓ Step 'Deployed' removed from board 'Engineering'
+
    ```
+
  - ✗ Non-empty step, no migrate
+
  - ✓ Non-empty step, with migrate
+
    ```
+
    $ rad board step rm b67a123 --step "Doing" --migrate-to "Todo"
+
    ✓ Step 'Doing' removed from board 'Engineering'
+
    ```
+
- Rename step(s)
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✗ Empty label
+
  - ✗ Invalid Label Characters
+
  - ✗ Label Too Long
+
  - ✗ New label already exists
+
  - ✓ Renamed
+
    ```
+
    $ rad board step edit b67a123 --step "Todo" --label "To Do"
+
    ✓ Step 'Todo' renamed to 'To Do'
+
    ```
+
- Nominate start and end steps
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✗ Start >= End
+
    - Start after End
+
    - End before Start
+
    - Start and End
+
  - ✓ Nominated
+
    - Start
+

+
    ```
+
    $ rad board step nominate b67a123 --start "Backlog"
+
    ✓ Board 'Engineering' updated
+
    ```
+

+
    - End
+

+
    ```
+
    $ rad board step nominate b67a123 --end "Done"
+
    ✓ Board 'Engineering' updated
+
    ```
+

+
- Reorder steps
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
    - Preceeding
+
    - Proceeding
+
    - Preceeding & Proceeding
+
  - ✗ Start >= End
+
    - Start after End
+
    - End before Start
+
    - Start and End
+
  - ✓ Reordered
+
    - To Start
+

+
    ```
+
    $ rad board step move b67a123 --step "Doing" --after "Backlog"
+
    ✓ Board 'Engineering' updated
+
    ```
+

+
    - To End
+

+
    ```
+
    $ rad board step move b67a123 --step "Review" --before "Done"
+
    ✓ Board 'Engineering' updated
+
    ```
+

+
    - Inbetween
+

+
    ```
+
    $ rad board step move b67a123 --step "Review" --after "Doing"
+
    ✓ Board 'Engineering' updated
+
    ```
+

+
- Add goal to board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Invalid goal characters
+
  - ✗ Goal too Long
+
  - ✗ Goal already exists
+
  - ✓ Added
+
    ```
+
    $ rad board edit b67a123 --goal "Ship V1"
+
    ✓ Board 'Engineering' updated
+
    ```
+
- Update board goal
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Invalid goal characters
+
  - ✗ Goal too Long
+
  - ✗ Goal already exists
+
  - ✓ Updated
+
    ```
+
    $ rad board edit b67a123 --goal "Ship V2"
+
    ✓ Board 'Engineering' updated
+
    ```
+
- Remove board goal
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✗ No existing goals
+
  - ✓ Removed
+
    ```
+
    $ rad board edit b67a123 --goal ""
+
    ✓ Board 'Engineering' updated
+
    ```
+
- Archive board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✓ Archived
+
    ```
+
    $ rad board archive b67a123
+
    ✓ Board 'Engineering' archived
+
    ```
+
- Un-archive board
+
  - ✗ Repo not defined
+
  - ✗ Non-delegate
+
  - ✗ Not found
+
  - ✓ Un-archived
+
    ```
+
    $ rad board unarchive b67a123
+
    ✓ Board 'Engineering' un-archived
+
    ```
added crates/radicle-tasks/features/glossary.md
@@ -0,0 +1,11 @@
+
# Glossary
+

+
- **Board**: A collection of _Tasks_, _Steps_, _Goal(s)_ with a name.
+
- **Step**: A name that describes the state of a _Task_. Is in relation to other _Steps_ linearly.
+
  - **Start Step**: The _Step_ where a _Tasks_ progression commences and the step where a _Tasks_ regression terminates.
+
  - **End Step** The _Step_ where a _Tasks_ progression terminates, the step where a _Tasks_ regression never started.
+
- **Task**: A title and description that belongs to a _Step_. May contain labels.
+
- **Comment**: A comment that belongs to a _Task_ or _Comment_. May contain attachments and/or emoji reactions.
+
- Goal: A framing descriptor for a _Board_.
+
- **Archive**: A state of _Task_ distinct from a _Step_, decides visibility.
+
- **Label**: A name that belongs to one or many _Tasks_
added crates/radicle-tasks/features/radicle.md
@@ -0,0 +1,10 @@
+
# Persona: Radicle
+

+
## Goal: Make delightful and easy user experiences where possible
+

+
### Features:
+

+
- Cross linking other cobs
+
- Implicit linking of known local references
+
- Default board step flow
+
- Short-ID generation for CLI ergonomics
added crates/radicle-tasks/features/task-doer.md
@@ -0,0 +1,138 @@
+
# Persona: Task Doer
+

+
## Goal: Track and progress work items
+

+
### Feature and scenario headings:
+

+
- Add task
+
  - ✗ Repo not defined
+
  - ✗ Empty title
+
  - ✗ Invalid characters
+
  - ✗ Title too long
+
  - ✗ Description too long
+
  - ✓ Added
+
    - Title only
+
    - Title and description
+
- Remove task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✓ Removed
+
- Edit task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Empty title
+
  - ✗ Invalid characters
+
  - ✗ Title too long
+
  - ✓ Updated title
+
  - ✓ Updated description
+
- Attach file
+
  - ✗ Repo not defined
+
  - ✗ Task not found
+
  - ✗ File not found
+
  - ✗ File too large
+
  - ✓ Attached
+
- Remove attachment
+
  - ✗ Repo not defined
+
  - ✗ Task not found
+
  - ✗ Attachment not found
+
  - ✓ Removed
+
- Comment on task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Empty comment
+
  - ✗ Comment too long
+
  - ✓ Commented
+
- React to comment
+
  - ✗ Repo not defined
+
  - ✗ Task not found
+
  - ✗ Comment not found
+
  - ✗ Invalid reaction
+
  - ✓ Reacted
+
- Label task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Empty label
+
  - ✗ Invalid label characters
+
  - ✗ Label too long
+
  - ✗ Label already exists
+
  - ✓ Labeled
+
- Un-label task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Label not found
+
  - ✓ Un-labeled
+
- Progress task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Step not found
+
  - ✗ Already in step
+
  - ✓ Progressed
+
- Assign task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Assignee not found
+
  - ✗ Already assigned
+
  - ✓ Assigned
+
    - Single DID
+
    - Multiple DIDs
+
- Unassign task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Not assigned
+
  - ✓ Unassigned
+
    - Single DID
+
    - Multiple DIDs
+
- Reorder task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Sibling not found
+
  - ✗ Same position
+
  - ✓ Reordered
+
    - To top
+
    - To bottom
+
    - After sibling
+
- View board
+
  - ✗ Repo not defined
+
  - ✗ Board not found
+
  - ✓ Viewed
+
- View task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✓ Viewed
+
    - With Title only
+
    - With Title and Description
+
    - With Single Assignee
+
    - With Multiple Assignees
+
    - With Attachment
+
    - With Attachments
+
    - With Comment
+
    - With Comments
+
- Archive task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Already archived
+
  - ✓ Archived
+
- Un-archive task
+
  - ✗ Repo not defined
+
  - ✗ Not found
+
  - ✗ Not archived
+
  - ✓ Un-archived
+
- Batch progress task
+
  - ✗ Repo not defined
+
  - ✗ Empty list
+
  - ✗ Task not found
+
  - ✗ Step not found
+
  - ✓ Progressed
+
- Batch archive/unarchive task
+
  - ✗ Repo not defined
+
  - ✗ Empty list
+
  - ✗ Task not found
+
  - ✓ Archived
+
  - ✓ Un-archived
+
- Batch label/unlabel task
+
  - ✗ Repo not defined
+
  - ✗ Empty list
+
  - ✗ Task not found
+
  - ✗ Label invalid
+
  - ✓ Labeled
+
  - ✓ Un-labeled
added crates/radicle-tasks/src/lib.rs