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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/README.md +5 -5
- package/dist/clickup.js +1 -1
- package/package.json +3 -2
- package/skills/clickup/SKILL.md +11 -0
- package/skills/clickup/references/gotchas.md +57 -0
- package/skills/clickup-blocker-report/SKILL.md +6 -1
- package/skills/clickup-blocker-report/assets/report-template.md +16 -0
- package/skills/clickup-capacity-check/SKILL.md +6 -1
- package/skills/clickup-capacity-check/assets/report-template.md +14 -0
- package/skills/clickup-chat/SKILL.md +1 -0
- package/skills/clickup-comments/SKILL.md +1 -0
- package/skills/clickup-custom-report/SKILL.md +1 -0
- package/skills/clickup-docs/SKILL.md +60 -0
- package/skills/clickup-fields/SKILL.md +2 -1
- package/skills/clickup-goal-progress/SKILL.md +6 -1
- package/skills/clickup-goal-progress/assets/report-template.md +13 -0
- package/skills/clickup-goals/SKILL.md +1 -0
- package/skills/clickup-meeting-notes-to-tasks/SKILL.md +81 -0
- package/skills/clickup-my-day/SKILL.md +65 -0
- package/skills/clickup-my-day/assets/report-template.md +12 -0
- package/skills/clickup-project-setup/SKILL.md +3 -0
- package/skills/clickup-release-notes/SKILL.md +62 -0
- package/skills/clickup-release-notes/assets/report-template.md +12 -0
- package/skills/clickup-rollout/SKILL.md +3 -0
- package/skills/clickup-spaces/SKILL.md +1 -0
- package/skills/clickup-sprint-closeout/SKILL.md +3 -0
- package/skills/clickup-sprint-planning/SKILL.md +3 -0
- package/skills/clickup-standup/SKILL.md +3 -14
- package/skills/clickup-standup/assets/report-template.md +9 -0
- package/skills/clickup-task-triage/SKILL.md +3 -0
- package/skills/clickup-tasks/SKILL.md +1 -0
- package/skills/clickup-team-report/SKILL.md +4 -1
- package/skills/clickup-team-report/assets/report-template.md +24 -0
- package/skills/clickup-templates/SKILL.md +1 -0
- package/skills/clickup-time/SKILL.md +1 -0
- package/skills/clickup-time-audit/SKILL.md +8 -1
- package/skills/clickup-time-audit/assets/report-template.md +19 -0
- package/skills/clickup-timesheet-export/SKILL.md +65 -0
- package/skills/clickup-timesheet-export/assets/report-template.md +9 -0
- package/skills/clickup-timesheet-export/scripts/aggregate.mjs +73 -0
- package/skills/clickup-users/SKILL.md +1 -0
- package/skills/clickup-views/SKILL.md +1 -0
- package/skills/clickup-webhooks/SKILL.md +1 -0
- package/skills/clickup-weekly-review/SKILL.md +4 -1
- package/skills/clickup-weekly-review/assets/report-template.md +26 -0
- package/skills/clickup-workspace-audit/SKILL.md +72 -0
- package/skills/clickup-workspace-audit/assets/report-template.md +21 -0
- 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
|
+
)
|