tiki/.doc/doki/doc/ideas/plugins.md
2026-04-15 18:32:55 -04:00

8.8 KiB

Customization Examples

Assign to me — global plugin action

Shortcut key that sets the selected task's assignee to the current git user. Defined under views.actions, this shortcut is available in all tiki plugin views.

views:
  actions:
    - key: "a"
      label: "Assign to me"
      action: update where id = id() set assignee=user()

The same format works as a per-plugin action (under a plugin's actions: key) if you only want it in a specific view.

Add tag to task — plugin action

Appends a tag to the selected task's tag list without removing existing tags.

actions:
  - key: "t"
    label: "Tag my_project"
    action: update where id = id() set tags=tags + ["my_project"]

Custom status + reject action

Define a custom "rejected" status, then add a plugin action on the Backlog view to reject tasks.

statuses:
  - key: rejected
    label: Rejected
    emoji: "🚫"
    done: true
- name: Backlog
  key: "F3"
  lanes:
    - name: Backlog
      filter: select where status = "backlog" order by priority
  actions:
    - key: "r"
      label: "Reject"
      action: update where id = id() set status="rejected"

Implement with Claude Code — pipe action

Shortcut key that pipes the selected task's title and description to Claude Code for implementation.

actions:
  - key: "i"
    label: "Implement"
    action: >
      select title, description where id = id()
      | run("claude -p 'Implement this: $1. Details: $2'")      

Search all tikis — single-lane plugin

A plugin with one unfiltered lane shows every task. Press / to search across all of them.

- name: All
  key: "F5"
  lanes:
    - name: All
      columns: 4
      filter: select order by updatedAt desc

Quick assign — lane-based assignment

Three lanes split tasks by assignee. Moving a task into Alice's or Bob's lane auto-assigns it.

- name: Team
  key: "F6"
  lanes:
    - name: Unassigned
      filter: select where assignee is empty order by priority
    - name: Alice
      filter: select where assignee = "alice" order by priority
      action: update where id = id() set assignee="alice"
    - name: Bob
      filter: select where assignee = "bob" order by priority
      action: update where id = id() set assignee="bob"

Stale task detection — time trigger + plugin

A daily trigger tags in-progress tasks that haven't been updated in a week. A dedicated plugin shows all flagged tasks.

triggers:
  - description: flag stale in-progress tasks
    ruki: >
      every 1day
        update where status = "inProgress" and now() - updatedAt > 7day
               and "attention" not in tags
          set tags=tags + ["attention"]      
- name: Attention
  key: "F7"
  lanes:
    - name: Needs Attention
      columns: 4
      filter: select where "attention" in tags order by updatedAt

My tasks — user-scoped plugin

Shows only tasks assigned to the current git user.

- name: My Tasks
  key: "F8"
  lanes:
    - name: My Tasks
      columns: 4
      filter: select where assignee = user() order by priority

Recent ideas — good or trash?

Two-lane plugin to review recent ideas and trash the ones you don't need. Moving to Trash swaps the "idea" tag for "trash".

- name: Recent Ideas
  description: "Review recent"
  key: "F9"
  lanes:
    - name: Recent Ideas
      columns: 3
      filter: select where "idea" in tags and now() - createdAt < 7day order by createdAt desc
    - name: Trash
      columns: 1
      filter: select where "trash" in tags order by updatedAt desc
      action: update where id = id() set tags=tags - ["idea"] + ["trash"]

Auto-delete stale tasks — time trigger

Deletes backlog tasks that were created over 3 months ago and haven't been updated in 2 months.

triggers:
  - description: auto-delete stale backlog tasks
    ruki: >
      every 1day
        delete where status = "backlog"
                     and now() - createdAt > 3month
                     and now() - updatedAt > 2month      

Priority triage — five-lane plugin

One lane per priority level. Moving a task between lanes reassigns its priority.

- name: Priorities
  key: "F10"
  lanes:
    - name: Critical
      filter: select where priority = 1 order by updatedAt desc
      action: update where id = id() set priority=1
    - name: High
      filter: select where priority = 2 order by updatedAt desc
      action: update where id = id() set priority=2
    - name: Medium
      filter: select where priority = 3 order by updatedAt desc
      action: update where id = id() set priority=3
    - name: Low
      filter: select where priority = 4 order by updatedAt desc
      action: update where id = id() set priority=4
    - name: Minimal
      filter: select where priority = 5 order by updatedAt desc
      action: update where id = id() set priority=5

Sprint board — custom enum lanes

Uses a custom sprint enum field. Lanes per sprint; moving a task between lanes reassigns it. The third lane catches unplanned backlog tasks.

Requires:

fields:
  - name: sprint
    type: enum
    values: [sprint-7, sprint-8, sprint-9]
- name: Sprint Board
  key: "F9"
  lanes:
    - name: Current Sprint
      filter: select where sprint = "sprint-7" and status != "done" order by priority
      action: update where id = id() set sprint="sprint-7"
    - name: Next Sprint
      filter: select where sprint = "sprint-8" order by priority
      action: update where id = id() set sprint="sprint-8"
    - name: Unplanned
      filter: select where sprint is empty and status = "backlog" order by priority
      action: update where id = id() set sprint=empty

Severity triage — custom enum filter + action

Lanes per severity level. The last lane combines two values with or. A per-plugin action lets you mark a task as trivial without moving it.

Requires:

fields:
  - name: severity
    type: enum
    values: [critical, major, minor, trivial]
- name: Severity
  key: "F10"
  lanes:
    - name: Critical
      filter: select where severity = "critical" order by updatedAt desc
      action: update where id = id() set severity="critical"
    - name: Major
      filter: select where severity = "major" order by updatedAt desc
      action: update where id = id() set severity="major"
    - name: Minor & Trivial
      columns: 2
      filter: >
        select where severity = "minor" or severity = "trivial"
        order by severity, priority        
      action: update where id = id() set severity="minor"
  actions:
    - key: "t"
      label: "Trivial"
      action: update where id = id() set severity="trivial"

Subtasks in epic — custom taskIdList + quantifier trigger

A subtasks field on parent tasks tracks their children (inverse of dependsOn). A trigger auto-completes the parent when every subtask is done. The plugin shows open vs. completed parents.

Requires:

fields:
  - name: subtasks
    type: taskIdList
triggers:
  - description: close parent when all subtasks are done
    ruki: >
      every 5min
        update where subtasks is not empty
                     and status != "done"
                     and all subtasks where status = "done"
          set status="done"      
- name: Epics
  key: "F11"
  lanes:
    - name: In Progress
      filter: >
        select where subtasks is not empty
                     and status != "done"
        order by priority        
    - name: Completed
      columns: 1
      filter: >
        select where subtasks is not empty
                     and status = "done"
        order by updatedAt desc        

By topic — tag-based lanes

Split tasks into lanes by tag. Useful for viewing work across domains at a glance.

- name: By Topic
  key: "F11"
  lanes:
    - name: Frontend
      columns: 2
      filter: select where "frontend" in tags order by priority
    - name: Backend
      columns: 2
      filter: select where "backend" in tags order by priority