clickup-agent-cli 0.4.2 → 0.5.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.
Files changed (50) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/README.md +5 -5
  4. package/dist/clickup.js +1 -1
  5. package/package.json +3 -2
  6. package/skills/clickup/SKILL.md +11 -0
  7. package/skills/clickup/references/gotchas.md +57 -0
  8. package/skills/clickup-blocker-report/SKILL.md +6 -1
  9. package/skills/clickup-blocker-report/assets/report-template.md +16 -0
  10. package/skills/clickup-capacity-check/SKILL.md +6 -1
  11. package/skills/clickup-capacity-check/assets/report-template.md +14 -0
  12. package/skills/clickup-chat/SKILL.md +1 -0
  13. package/skills/clickup-comments/SKILL.md +1 -0
  14. package/skills/clickup-custom-report/SKILL.md +1 -0
  15. package/skills/clickup-docs/SKILL.md +60 -0
  16. package/skills/clickup-fields/SKILL.md +2 -1
  17. package/skills/clickup-goal-progress/SKILL.md +6 -1
  18. package/skills/clickup-goal-progress/assets/report-template.md +13 -0
  19. package/skills/clickup-goals/SKILL.md +1 -0
  20. package/skills/clickup-meeting-notes-to-tasks/SKILL.md +81 -0
  21. package/skills/clickup-my-day/SKILL.md +65 -0
  22. package/skills/clickup-my-day/assets/report-template.md +12 -0
  23. package/skills/clickup-project-setup/SKILL.md +3 -0
  24. package/skills/clickup-release-notes/SKILL.md +62 -0
  25. package/skills/clickup-release-notes/assets/report-template.md +12 -0
  26. package/skills/clickup-rollout/SKILL.md +3 -0
  27. package/skills/clickup-spaces/SKILL.md +1 -0
  28. package/skills/clickup-sprint-closeout/SKILL.md +3 -0
  29. package/skills/clickup-sprint-planning/SKILL.md +3 -0
  30. package/skills/clickup-standup/SKILL.md +3 -14
  31. package/skills/clickup-standup/assets/report-template.md +9 -0
  32. package/skills/clickup-task-triage/SKILL.md +3 -0
  33. package/skills/clickup-tasks/SKILL.md +1 -0
  34. package/skills/clickup-team-report/SKILL.md +4 -1
  35. package/skills/clickup-team-report/assets/report-template.md +24 -0
  36. package/skills/clickup-templates/SKILL.md +1 -0
  37. package/skills/clickup-time/SKILL.md +1 -0
  38. package/skills/clickup-time-audit/SKILL.md +8 -1
  39. package/skills/clickup-time-audit/assets/report-template.md +19 -0
  40. package/skills/clickup-timesheet-export/SKILL.md +65 -0
  41. package/skills/clickup-timesheet-export/assets/report-template.md +9 -0
  42. package/skills/clickup-timesheet-export/scripts/aggregate.mjs +73 -0
  43. package/skills/clickup-users/SKILL.md +1 -0
  44. package/skills/clickup-views/SKILL.md +1 -0
  45. package/skills/clickup-webhooks/SKILL.md +1 -0
  46. package/skills/clickup-weekly-review/SKILL.md +4 -1
  47. package/skills/clickup-weekly-review/assets/report-template.md +26 -0
  48. package/skills/clickup-workspace-audit/SKILL.md +72 -0
  49. package/skills/clickup-workspace-audit/assets/report-template.md +21 -0
  50. package/skills/clickup-workspace-audit/scripts/classify.mjs +72 -0
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: clickup-release-notes
3
+ description: Generates release notes or a changelog from ClickUp tasks completed in a period, grouped by type and written for the chosen audience. Use when the user asks for release notes, a changelog, a "what shipped" summary, or wants completed work written up for customers or stakeholders.
4
+ license: MIT
5
+ disable-model-invocation: true
6
+ context: fork
7
+ agent: general-purpose
8
+ argument-hint: "[period and scope - e.g. 'last sprint for the mobile space', 'June, customer-facing']"
9
+ allowed-tools: Bash(clickup *), Write, Read
10
+ ---
11
+
12
+ # Release Notes
13
+
14
+ Turn completed tasks into a changelog worth reading.
15
+
16
+ ## Understanding the Scope
17
+
18
+ From `$ARGUMENTS` determine: the period (default: since the last tag/release the user mentions, else last 14 days), the scope (workspace, space, or list), and the audience. Audience changes the writing: customer-facing notes describe benefits; internal notes can name tasks and people.
19
+
20
+ ## Workflow
21
+
22
+ ### Step 1: Pull completed tasks
23
+
24
+ ```bash
25
+ clickup task search --workspace-id <id> \
26
+ --include-closed \
27
+ --status "complete" --status "closed" --status "done" \
28
+ --date-updated-gt <period-start-ms> --date-updated-lt <period-end-ms> \
29
+ [--space-id <id>] --format json
30
+ ```
31
+
32
+ `--date-updated-*` filters take Unix ms; compute them from the period.
33
+
34
+ ### Step 2: Classify
35
+
36
+ Group by tags and task names into: **Features**, **Improvements**, **Fixes**, and **Internal** (refactors, chores - omit for customer-facing notes). Tags like `bug`, `feature`, `enhancement` decide the bucket; otherwise judge from the task name and description.
37
+
38
+ ### Step 3: Write the notes
39
+
40
+ Rewrite task names for the audience - "Fix login redirect on Safari" becomes "Fixed an issue where Safari users could be redirected to the wrong page after logging in." Never paste raw task IDs into customer-facing notes.
41
+
42
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-release-notes` prints it). Fill every placeholder; drop sections with no content.
43
+
44
+ For internal notes append task IDs and assignees for traceability.
45
+
46
+ ### Step 4: Deliver
47
+
48
+ Present the notes in chat. Offer to also:
49
+
50
+ ```bash
51
+ # Publish into a ClickUp Doc
52
+ clickup doc page-create --workspace-id <id> --doc-id <id> \
53
+ --name "Release Notes <date>" --content "$(cat notes.md)"
54
+
55
+ # Or save locally
56
+ ```
57
+
58
+ ## Tips
59
+
60
+ - If several statuses mean "done" in this workspace, check `clickup list statuses` conventions first rather than guessing.
61
+ - Exclude subtasks whose parent is already listed to avoid duplicate lines.
62
+ - A count line ("12 improvements shipped by 5 people") makes stakeholder notes land better.
@@ -0,0 +1,12 @@
1
+ # Release Notes - <period>
2
+
3
+ ## New
4
+ - <benefit-focused line for each shipped feature>
5
+
6
+ ## Improved
7
+ - <what got better and for whom>
8
+
9
+ ## Fixed
10
+ - <user-visible bug fixes, written as outcomes>
11
+
12
+ <!-- Internal variant: append task IDs and assignees per line -->
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-rollout
3
3
  description: Rolls out a saved process template in ClickUp by applying it to a target location, then configuring assignees, due dates, and custom fields. Use when the user says "start a new [project/process/sprint/onboarding]" or wants to kick off a repeatable workflow from a template.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
@@ -12,6 +13,8 @@ allowed-tools: Bash(clickup *)
12
13
 
13
14
  Apply a saved ClickUp template and configure the resulting task, list, or folder for a new instance of the process.
14
15
 
16
+ Interpret `$ARGUMENTS` as the scope (workspace, space, list, person, or time period as the sections below expect); when it is empty, ask or fall back to the configured workspace.
17
+
15
18
  ## Workflow
16
19
 
17
20
  ### Step 1: Find the template
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-spaces
3
3
  description: Navigates and manages the ClickUp hierarchy including workspaces, spaces, folders, and lists. Use when the user asks about project structure, wants to create spaces or lists, navigate the hierarchy, or find where tasks live.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup workspace *), Bash(clickup space *), Bash(clickup folder *), Bash(clickup list *), Bash(clickup schema workspace*), Bash(clickup schema space*), Bash(clickup schema folder*), Bash(clickup schema list*)
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-sprint-closeout
3
3
  description: Closes out a sprint by summarizing completion, carrying over incomplete tasks, and preparing retrospective data. Use when the user wants to end a sprint, close out an iteration, move unfinished work, or prepare for a retro.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
@@ -12,6 +13,8 @@ allowed-tools: Bash(clickup *)
12
13
 
13
14
  End a sprint cleanly: summarize what was done, carry over incomplete work, and gather data for a retrospective.
14
15
 
16
+ Interpret `$ARGUMENTS` as the scope (workspace, space, list, person, or time period as the sections below expect); when it is empty, ask or fall back to the configured workspace.
17
+
15
18
  ## Prerequisites
16
19
 
17
20
  - Sprint list ID
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-sprint-planning
3
3
  description: Plans a sprint by selecting tasks from backlog, assigning them, setting dates, and organizing into a sprint list. Use when the user wants to plan a sprint, set up an iteration, or pull work from backlog into a sprint.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
@@ -12,6 +13,8 @@ allowed-tools: Bash(clickup *)
12
13
 
13
14
  Set up a new sprint by pulling tasks from the backlog, estimating, assigning, and organizing.
14
15
 
16
+ Interpret `$ARGUMENTS` as the scope (workspace, space, list, person, or time period as the sections below expect); when it is empty, ask or fall back to the configured workspace.
17
+
15
18
  ## Prerequisites
16
19
 
17
20
  - Workspace and space IDs known
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  name: clickup-standup
3
3
  description: Generates a daily standup summary from ClickUp covering what was done yesterday, what is planned today, and blockers. Use when the user asks for a standup report, daily update, or wants to know what they or their team worked on.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
7
8
  argument-hint: "[scope - e.g. 'my tasks', 'engineering team', user-id]"
8
- allowed-tools: Bash(clickup *)
9
+ allowed-tools: Bash(clickup *), Read
9
10
  ---
10
11
 
11
12
  # Daily Standup
@@ -73,19 +74,7 @@ clickup time running --workspace-id <id> --assignee <user-id> --format json
73
74
 
74
75
  ### Step 6: Compile standup
75
76
 
76
- Format as:
77
-
78
- ```
79
- **Yesterday:**
80
- - Completed: [list of finished tasks with names]
81
-
82
- **Today:**
83
- - Working on: [list of in-progress tasks]
84
- - Due today: [list of tasks due today]
85
-
86
- **Blockers:**
87
- - [list of blocked tasks, if any]
88
- ```
77
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-standup` prints it). Fill every placeholder; drop sections with no content.
89
78
 
90
79
  ## Tips
91
80
 
@@ -0,0 +1,9 @@
1
+ **Yesterday:**
2
+ - Completed: <finished task names>
3
+
4
+ **Today:**
5
+ - Working on: <in-progress tasks>
6
+ - Due today: <tasks due today>
7
+
8
+ **Blockers:**
9
+ - <blocked tasks, or "None">
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-task-triage
3
3
  description: Triages incoming ClickUp tasks by categorizing, prioritizing, assigning, and routing unprocessed tasks. Use when the user wants to triage tasks, sort through a backlog, prioritize incoming work, or clean up an inbox list.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
@@ -12,6 +13,8 @@ allowed-tools: Bash(clickup *)
12
13
 
13
14
  Sort through incoming/unprocessed tasks: prioritize, assign, add tags, and move to the right lists.
14
15
 
16
+ Interpret `$ARGUMENTS` as the scope (workspace, space, list, person, or time period as the sections below expect); when it is empty, ask or fall back to the configured workspace.
17
+
15
18
  ## Prerequisites
16
19
 
17
20
  - Know the inbox/backlog list ID where new tasks land
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-tasks
3
3
  description: Creates, updates, searches, and manages ClickUp tasks, subtasks, checklists, dependencies, and attachments. Use when the user asks about tasks, wants to create or find work items, manage subtasks, add checklists, set dependencies, or upload files to tasks.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup task *), Bash(clickup checklist *), Bash(clickup dependency *), Bash(clickup relation *), Bash(clickup attachment *), Bash(clickup schema task*), Bash(clickup schema checklist*)
5
6
  ---
6
7
 
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  name: clickup-team-report
3
3
  description: Generates a status report for any team, department, or area of the business in ClickUp. Covers task progress, workload distribution, upcoming deadlines, and highlights. Use when the user asks for a department rundown, team status, what marketing is doing, operations update, or any team/department-specific report.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
7
8
  argument-hint: "[team or department name, e.g. 'marketing', 'engineering', 'operations']"
8
- allowed-tools: Bash(clickup *)
9
+ allowed-tools: Bash(clickup *), Read
9
10
  ---
10
11
 
11
12
  # Team / Department Report
@@ -101,6 +102,8 @@ Filter time entries to those related to the team's tasks.
101
102
 
102
103
  ### Step 7: Compile the report
103
104
 
105
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-team-report` prints it). Fill every placeholder; drop sections with no content.
106
+
104
107
  Structure the report as:
105
108
 
106
109
  - **Team/Department**: Name and scope of what is covered
@@ -0,0 +1,24 @@
1
+ # <Team> Status Report (<date>)
2
+
3
+ **Scope:** <spaces/folders/lists covered>
4
+ **Summary:** <2-3 sentences on where things stand>
5
+
6
+ ## By the numbers
7
+ | To do | In progress | Done this week | Overdue |
8
+ |-------|-------------|----------------|---------|
9
+ | <n> | <n> | <n> | <n> |
10
+
11
+ ## Key accomplishments
12
+ - <completed task worth naming> (<assignee>)
13
+
14
+ ## Currently working on
15
+ - <task> - <assignee>, due <date>
16
+
17
+ ## Upcoming deadlines (next 7 days)
18
+ - <task> - due <date>, <assignee>
19
+
20
+ ## Risks and blockers
21
+ - <overdue or blocked item> - <what unblocks it>
22
+
23
+ ## Time invested
24
+ <n> hours logged this period (<top contributors>)
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-templates
3
3
  description: Lists and applies ClickUp templates to create tasks, lists, and folders from saved process templates. Use when the user wants to roll out a repeatable process, create items from a template, or find what templates are available in the workspace.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup template *), Bash(clickup schema template*)
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-time
3
3
  description: Tracks time in ClickUp including logging entries, managing running timers, tagging time, and querying reports. Use when the user asks about time tracking, wants to start or stop a timer, log hours, check who is working on what, or audit time entries.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup time *), Bash(clickup schema time*)
5
6
  ---
6
7
 
@@ -1,17 +1,20 @@
1
1
  ---
2
2
  name: clickup-time-audit
3
3
  description: Audits time tracking entries by checking utilization, finding missing entries, and comparing logged vs. estimated time. Use when the user wants to audit time, check billable hours, find unlogged work, or review team utilization.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
7
8
  argument-hint: "[workspace-id] [start-date] [end-date]"
8
- allowed-tools: Bash(clickup *)
9
+ allowed-tools: Bash(clickup *), Read
9
10
  ---
10
11
 
11
12
  # Time Audit
12
13
 
13
14
  Audit time tracking data for accuracy, utilization, and completeness.
14
15
 
16
+ Interpret `$ARGUMENTS` as the scope (workspace, space, list, person, or time period as the sections below expect); when it is empty, ask or fall back to the configured workspace.
17
+
15
18
  ## Prerequisites
16
19
 
17
20
  - Workspace ID
@@ -78,6 +81,10 @@ Look for:
78
81
  clickup time running --workspace-id <id> --format json
79
82
  ```
80
83
 
84
+ ### Compile the report
85
+
86
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-time-audit` prints it). Fill every placeholder; drop sections with no content.
87
+
81
88
  ## Tips
82
89
 
83
90
  - Duration is in milliseconds. Divide by 3600000 for hours.
@@ -0,0 +1,19 @@
1
+ ## Time Audit: <scope> (<period>)
2
+
3
+ Total logged: <n>h (<m>h billable / <k>h non-billable)
4
+
5
+ ### By person
6
+ | Person | Hours | Billable | Entries |
7
+ |--------|-------|----------|---------|
8
+ | <name> | <n>h | <n>h | <n> |
9
+
10
+ ### Estimate accuracy (actual / estimated)
11
+ - <task>: <actual>h vs <estimated>h (<ratio>)
12
+
13
+ ### Anomalies
14
+ - <entry over 8h - forgot to stop timer?>
15
+ - <entries with no description>
16
+ - <running timers active for days>
17
+
18
+ ### Missing time
19
+ - <tasks that changed status with zero time logged>
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: clickup-timesheet-export
3
+ description: Exports ClickUp time entries for a period into a timesheet - CSV or markdown - with per-person and per-task totals and billable breakdowns. Use when the user asks for a timesheet, billable hours export, invoice backup, or wants hours summed for payroll or a client.
4
+ license: MIT
5
+ disable-model-invocation: true
6
+ context: fork
7
+ agent: general-purpose
8
+ argument-hint: "[period and scope - e.g. 'last week', 'June for Sarah', 'this month billable only']"
9
+ allowed-tools: Bash(clickup *), Bash(node *), Write, Read
10
+ ---
11
+
12
+ # Timesheet Export
13
+
14
+ Turn raw time entries into a clean timesheet with totals.
15
+
16
+ ## Understanding the Scope
17
+
18
+ From `$ARGUMENTS` determine: the period (default: last 7 days), who (default: everyone), and whether to include only billable time. Resolve people via `clickup member list --format json`.
19
+
20
+ ## Workflow
21
+
22
+ ### Step 1: Pull time entries
23
+
24
+ ```bash
25
+ clickup time list --workspace-id <id> \
26
+ --start <period-start> --end <period-end> \
27
+ [--assignee <user-id>] --format json
28
+ ```
29
+
30
+ `--start`/`--end` accept ISO dates (`2026-06-01`), relative forms (`-30d`), or Unix timestamps. Entry durations are milliseconds.
31
+
32
+ ### Step 2: Aggregate deterministically
33
+
34
+ Never sum hours yourself. Pipe the entries through the bundled script; the math comes out exact:
35
+
36
+ ```bash
37
+ SKILL_DIR=$(clickup skill path clickup-timesheet-export)
38
+
39
+ # JSON summary: totals, byPerson, byTask, flagged entries
40
+ clickup time list --workspace-id <id> --start <start> --end <end> --format json \
41
+ | node "$SKILL_DIR/scripts/aggregate.mjs"
42
+
43
+ # CSV rows for the export file
44
+ clickup time list --workspace-id <id> --start <start> --end <end> --format json \
45
+ | node "$SKILL_DIR/scripts/aggregate.mjs" --csv
46
+ ```
47
+
48
+ The summary's `flags` field lists running timers (excluded from totals), entries with no task, and entries over 12h.
49
+
50
+ ### Step 3: Write the export
51
+
52
+ CSV for spreadsheets (default when the user says export/invoice):
53
+
54
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-timesheet-export` prints it). Fill every placeholder; drop sections with no content.
55
+
56
+ Save with the Write tool as `timesheet-<start>-<end>.csv` and tell the user the path. For a chat answer, use a markdown table plus totals instead.
57
+
58
+ ### Step 4: Summarize
59
+
60
+ Use the summary block from the same template.
61
+
62
+ ## Tips
63
+
64
+ - Cross-check suspicious days (over 12h per person) rather than silently exporting them.
65
+ - For a recurring client invoice, filter to the client's space via the task IDs' locations.
@@ -0,0 +1,9 @@
1
+ date,person,task,description,hours,billable
2
+ 2026-06-30,Sarah,Login bug fix,Safari redirect,2.50,true
3
+
4
+ <!-- Summary block to accompany the CSV: -->
5
+ Timesheet <start> to <end>
6
+ - Total: <n> hours (<m> billable / <k> non-billable)
7
+ - By person: <name> <n>h, ...
8
+ - Top tasks: <task> <n>h, ...
9
+ Flagged: <entries with no task, running timers still open>
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ // Deterministic timesheet aggregation. Pipe `clickup time list ... --format json`
3
+ // into this script; totals come out exact so no arithmetic is done by the agent.
4
+ //
5
+ // clickup time list --workspace-id X --start -7d --end today --format json \
6
+ // | node scripts/aggregate.mjs [--csv]
7
+ //
8
+ // Default output: JSON summary (totals, byPerson, byTask, flags).
9
+ // --csv: timesheet rows (date,person,task,description,hours,billable) on stdout.
10
+
11
+ import { readFileSync } from 'node:fs'
12
+
13
+ const wantCsv = process.argv.includes('--csv')
14
+ const raw = readFileSync(0, 'utf-8')
15
+ let entries = JSON.parse(raw)
16
+ if (!Array.isArray(entries)) entries = entries.data ?? [entries]
17
+
18
+ const MS_PER_HOUR = 3_600_000
19
+ const hours = (ms) => Math.round((ms / MS_PER_HOUR) * 100) / 100
20
+ const rows = []
21
+ const flags = { runningTimers: [], noTask: [], over12h: [] }
22
+ const byPerson = {}
23
+ const byTask = {}
24
+ let totalMs = 0
25
+ let billableMs = 0
26
+
27
+ for (const e of entries) {
28
+ const duration = Number(e.duration)
29
+ const person = e.user_name || e.user?.username || 'unknown'
30
+ const task = e.task?.name || e.task_id || e.task?.id || ''
31
+ const desc = e.description || ''
32
+ const billable = e.billable === true || e.billable === 'true'
33
+
34
+ if (!e.end || duration < 0) {
35
+ flags.runningTimers.push({ id: e.id, person, task })
36
+ continue
37
+ }
38
+ if (!task) flags.noTask.push({ id: e.id, person, hours: hours(duration) })
39
+ if (duration > 12 * MS_PER_HOUR) flags.over12h.push({ id: e.id, person, task, hours: hours(duration) })
40
+
41
+ totalMs += duration
42
+ if (billable) billableMs += duration
43
+ byPerson[person] = (byPerson[person] ?? 0) + duration
44
+ byTask[task || '(no task)'] = (byTask[task || '(no task)'] ?? 0) + duration
45
+
46
+ const date = new Date(Number(e.start)).toISOString().slice(0, 10)
47
+ rows.push({ date, person, task, desc, hours: hours(duration), billable })
48
+ }
49
+
50
+ if (wantCsv) {
51
+ const esc = (v) => (/[",\n]/.test(String(v)) ? `"${String(v).replace(/"/g, '""')}"` : String(v))
52
+ process.stdout.write('date,person,task,description,hours,billable\n')
53
+ for (const r of rows.sort((a, b) => a.date.localeCompare(b.date) || a.person.localeCompare(b.person))) {
54
+ process.stdout.write([r.date, r.person, r.task, r.desc, r.hours.toFixed(2), r.billable].map(esc).join(',') + '\n')
55
+ }
56
+ } else {
57
+ const toHours = (o) => Object.fromEntries(Object.entries(o).sort((a, b) => b[1] - a[1]).map(([k, v]) => [k, hours(v)]))
58
+ process.stdout.write(
59
+ JSON.stringify(
60
+ {
61
+ entries: rows.length,
62
+ totalHours: hours(totalMs),
63
+ billableHours: hours(billableMs),
64
+ nonBillableHours: hours(totalMs - billableMs),
65
+ byPerson: toHours(byPerson),
66
+ byTask: toHours(byTask),
67
+ flags,
68
+ },
69
+ null,
70
+ 2,
71
+ ) + '\n',
72
+ )
73
+ }
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-users
3
3
  description: Manages ClickUp workspace users, groups, guests, roles, and members. Use when the user asks about team members, wants to invite users, manage groups, grant guest access, check permissions, resolve names to IDs, or see who is assigned to what.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup user *), Bash(clickup group *), Bash(clickup guest *), Bash(clickup role *), Bash(clickup member *), Bash(clickup workspace members), Bash(clickup schema user*), Bash(clickup schema group*), Bash(clickup schema guest*), Bash(clickup schema member*)
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-views
3
3
  description: Creates and manages ClickUp views including board, list, Gantt, calendar, and workload views. Use when the user asks about views, wants to create a kanban board, see tasks through a specific view, or configure view settings.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup view *), Bash(clickup schema view*)
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: clickup-webhooks
3
3
  description: Registers and manages ClickUp webhooks for real-time event notifications. Use when the user asks about webhooks, wants to set up notifications for task changes, or needs to integrate ClickUp events with external services.
4
+ license: MIT
4
5
  allowed-tools: Bash(clickup webhook *), Bash(clickup schema webhook*)
5
6
  ---
6
7
 
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  name: clickup-weekly-review
3
3
  description: Generates a weekly progress report from ClickUp, scoped to any team, department, space, or workspace. Summarizes completed tasks, in-progress work, blockers, and time logged. Use when the user asks for a weekly update, progress report, team summary, department rundown, or wants to know what happened this week.
4
+ license: MIT
4
5
  disable-model-invocation: true
5
6
  context: fork
6
7
  agent: general-purpose
7
8
  argument-hint: "[scope - e.g. 'marketing team', space-id, or workspace-id]"
8
- allowed-tools: Bash(clickup *)
9
+ allowed-tools: Bash(clickup *), Read
9
10
  ---
10
11
 
11
12
  # Weekly Review
@@ -81,6 +82,8 @@ clickup goal list --workspace-id <id> --format json
81
82
 
82
83
  ### Step 7: Compile the report
83
84
 
85
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-weekly-review` prints it). Fill every placeholder; drop sections with no content.
86
+
84
87
  Summarize the data into a clear report with sections:
85
88
  - **Completed this week**: Count and highlights of finished tasks
86
89
  - **In progress**: Tasks actively being worked on
@@ -0,0 +1,26 @@
1
+ # Weekly Review: <scope> (<week-start> to <week-end>)
2
+
3
+ **Summary:** <2-3 sentences: overall trajectory, the one thing to know>
4
+
5
+ ## By the numbers
6
+ | Metric | This week |
7
+ |--------|-----------|
8
+ | Completed | <n> |
9
+ | In progress | <n> |
10
+ | Overdue | <n> |
11
+ | Hours logged | <n> |
12
+
13
+ ## Completed this week
14
+ - <task name> (<assignee>)
15
+
16
+ ## In progress
17
+ - <task name> - <assignee>, due <date>
18
+
19
+ ## Overdue / Blocked
20
+ - <task name> - due <date>, <why it matters>
21
+
22
+ ## Goal progress
23
+ - <goal>: <current>/<target> (<status>)
24
+
25
+ ## Next week
26
+ - <what is due or planned>
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: clickup-workspace-audit
3
+ description: Runs a hygiene audit over a ClickUp workspace or space finding unassigned tasks, missing due dates, stale in-progress work, overdue items, and overloaded assignees. Use when the user asks to audit, clean up, or health-check their workspace, or asks what is falling through the cracks.
4
+ license: MIT
5
+ disable-model-invocation: true
6
+ context: fork
7
+ agent: general-purpose
8
+ argument-hint: "[scope - workspace, space name, or list name; optionally 'and fix']"
9
+ allowed-tools: Bash(clickup *), Bash(node *), Read
10
+ ---
11
+
12
+ # Workspace Audit
13
+
14
+ Find hygiene problems across active tasks and report them with recommended fixes.
15
+
16
+ ## Understanding the Scope
17
+
18
+ Interpret `$ARGUMENTS`: no scope means the whole workspace; a space or list name narrows the sweep (`--space-id` / `--list-id` filters on `task search`). If the user said "and fix" (or similar), offer to apply the recommended fixes after the report; never modify tasks without that instruction.
19
+
20
+ ## Workflow
21
+
22
+ ### Step 1: Pull the active task set
23
+
24
+ ```bash
25
+ clickup task search --workspace-id <id> --format json
26
+ ```
27
+
28
+ Server-side filters cannot express "no assignee" or "no due date", so fetch active tasks and inspect the JSON client-side. For large workspaces sweep one space at a time (`--space-id`).
29
+
30
+ ### Step 2: Classify deterministically
31
+
32
+ Pipe the tasks through the bundled script so every task is bucketed by rule, not judgment:
33
+
34
+ ```bash
35
+ SKILL_DIR=$(clickup skill path clickup-workspace-audit)
36
+ clickup task search --workspace-id <id> --format json \
37
+ | node "$SKILL_DIR/scripts/classify.mjs" [--stale-days 14]
38
+ ```
39
+
40
+ The output contains `activeTasks`, `flaggedTasks`, per-bucket lists, and per-person `load`. The buckets:
41
+
42
+ | Check | Condition |
43
+ |-------|-----------|
44
+ | Unassigned | `assignees` is empty |
45
+ | No due date | `due_date` is null |
46
+ | Overdue | `due_date` in the past, status not closed |
47
+ | Stale | status is in progress but `date_updated` older than 14 days |
48
+ | Overloaded assignee | one person holds a disproportionate share of open tasks (flag the top offenders) |
49
+
50
+ ### Step 3: Check for blocked chains (optional, if dependencies are used)
51
+
52
+ Tasks with `blocked` or `waiting` status whose blockers are themselves overdue deserve a callout.
53
+
54
+ ### Step 4: Report
55
+
56
+ Copy the exact structure from `assets/report-template.md` in this skill's directory (`clickup skill path clickup-workspace-audit` prints it). Fill every placeholder; drop sections with no content.
57
+
58
+ ### Step 5: Apply fixes (only when asked)
59
+
60
+ ```bash
61
+ clickup task update <id> --assignee-add <user-id> # assign
62
+ clickup task update <id> --due-date friday # set due date
63
+ clickup task update <id> --status "backlog" # demote stale work honestly
64
+ ```
65
+
66
+ Confirm the fix list with the user before running it; report each change as it lands.
67
+
68
+ ## Tips
69
+
70
+ - `--include-closed` stays off: the audit is about active work.
71
+ - Dates accept relative forms (`friday`, `+1w`) so fixes read naturally.
72
+ - Re-run after fixes and show the before/after flagged counts.
@@ -0,0 +1,21 @@
1
+ ## Workspace Audit: <scope> (<date>)
2
+
3
+ Overall: <n> active tasks, <m> flagged (<x>%)
4
+
5
+ ### Overdue (worst first)
6
+ - <task> - due <date>, assignee <name> (<id>)
7
+
8
+ ### Unassigned
9
+ - <task> (<list>)
10
+
11
+ ### No due date
12
+ - <task> (<list>)
13
+
14
+ ### Stale (in progress, untouched 14+ days)
15
+ - <task> - last touched <date>
16
+
17
+ ### Load
18
+ - <name>: <n> open tasks (team median: <m>)
19
+
20
+ ### Recommended fixes
21
+ 1. <specific action with the command to run>