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,72 @@
1
+ #!/usr/bin/env node
2
+ // Deterministic hygiene classification. Pipe `clickup task search ... --format json`
3
+ // into this script; every task is bucketed by rule, not judgment.
4
+ //
5
+ // clickup task search --workspace-id X --format json | node scripts/classify.mjs
6
+ //
7
+ // Output: JSON buckets (overdue, unassigned, noDueDate, stale, load) plus counts.
8
+ // --stale-days <n> overrides the 14-day staleness window.
9
+
10
+ import { readFileSync } from 'node:fs'
11
+
12
+ const staleIdx = process.argv.indexOf('--stale-days')
13
+ const STALE_DAYS = staleIdx !== -1 ? Number(process.argv[staleIdx + 1]) : 14
14
+ const now = Date.now()
15
+ const staleCutoff = now - STALE_DAYS * 24 * 3_600_000
16
+
17
+ const raw = readFileSync(0, 'utf-8')
18
+ let tasks = JSON.parse(raw)
19
+ if (!Array.isArray(tasks)) tasks = tasks.tasks ?? [tasks]
20
+
21
+ const summarize = (t) => ({
22
+ id: t.id,
23
+ name: t.name,
24
+ status: typeof t.status === 'object' ? t.status?.status : t.status,
25
+ assignees: (t.assignees ?? []).map((a) => a.username ?? a.id),
26
+ due_date: t.due_date ? new Date(Number(t.due_date)).toISOString().slice(0, 10) : null,
27
+ list: t.list?.name ?? null,
28
+ })
29
+
30
+ const buckets = { overdue: [], unassigned: [], noDueDate: [], stale: [] }
31
+ const load = {}
32
+ const isClosed = (t) => {
33
+ const type = typeof t.status === 'object' ? t.status?.type : undefined
34
+ const s = (typeof t.status === 'object' ? t.status?.status : t.status ?? '').toLowerCase()
35
+ return type === 'closed' || type === 'done' || ['closed', 'complete', 'done'].includes(s)
36
+ }
37
+
38
+ let active = 0
39
+ for (const t of tasks) {
40
+ if (isClosed(t)) continue
41
+ active++
42
+ const s = summarize(t)
43
+ for (const a of s.assignees) load[a] = (load[a] ?? 0) + 1
44
+
45
+ if (s.assignees.length === 0) buckets.unassigned.push(s)
46
+ if (!t.due_date) buckets.noDueDate.push(s)
47
+ else if (Number(t.due_date) < now) buckets.overdue.push(s)
48
+
49
+ const statusType = typeof t.status === 'object' ? t.status?.type : undefined
50
+ const updated = Number(t.date_updated)
51
+ if (statusType === 'custom' || /progress|review|doing/.test((s.status ?? '').toLowerCase())) {
52
+ if (updated && updated < staleCutoff) buckets.stale.push({ ...s, last_updated: new Date(updated).toISOString().slice(0, 10) })
53
+ }
54
+ }
55
+
56
+ buckets.overdue.sort((a, b) => (a.due_date ?? '').localeCompare(b.due_date ?? ''))
57
+ const flagged = new Set([...buckets.overdue, ...buckets.unassigned, ...buckets.noDueDate, ...buckets.stale].map((t) => t.id))
58
+
59
+ process.stdout.write(
60
+ JSON.stringify(
61
+ {
62
+ activeTasks: active,
63
+ flaggedTasks: flagged.size,
64
+ staleDays: STALE_DAYS,
65
+ counts: Object.fromEntries(Object.entries(buckets).map(([k, v]) => [k, v.length])),
66
+ load: Object.fromEntries(Object.entries(load).sort((a, b) => b[1] - a[1])),
67
+ ...buckets,
68
+ },
69
+ null,
70
+ 2,
71
+ ) + '\n',
72
+ )