Projekt workload
Deterministic per-member workload & capacity report for a Projekt organization (projekt.3xa.es), read-only via the user's PAT. Pulls /workload, /workload/capacity, /capacity and /capacity/threshold, then renders a Markdown (or CSV) table of assigned / in-progress / done / hours-logged + utilization %, flagging over- and under-allocated members. The script does all the math — zero model tokens. Use when the user wants to balance the team, see who's overloaded, or report capacity for a week/range. Soporta español: cargas de trabajo, capacidad, utilización, sobreasignación, quién está saturado, informe del equipo.From its SKILL.md
npx -y skills add valfiguer/Projekt-Skills --skill projekt-workloadAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.4 KB, as published. Nobody here has run it
Projekt — workload & capacity report (read-only)
⚠ NOT YET PORTED to /api/v1. The base URL is fixed (shares
projekt_api.py, now onhttps://projekt.3xa.es/api/v1), but the endpoint PATHS inworkload_report.pyare still the legacy flat aggregates (/workload,/workload/capacity,/capacity,/capacity/threshold) and will 404 on the rewrite. To port: rediscover the equivalents under the org-scoped surface (likely/organizations/{org}/…) withbash ../projekt/scripts/spec_lookup.sh --search workloadand--search capacity, then re-key rows onuser_id. Working today: theprojektconnect (auth/context) +projekt-issuestask create/list.
One job: a deterministic team workload report. The script fetches the four server-side aggregates and computes every number itself — the model spends no tokens on arithmetic and writes nothing.
SK_CORE="${CLAUDE_SKILL_DIR}/../projekt/scripts" · SK="${CLAUDE_SKILL_DIR}/scripts".
Prerequisite — connect once
Run the projekt skill's setup first so the token is resolved and member names are cached
(.projekt-run/context.json); this script reads that cache for name resolution and never re-queries the roster:
bash "$SK_CORE/auth_check.sh" # resolves user + org, writes context
bash "$SK_CORE/context_sync.sh" # caches projects + members
Run it
# Current ISO week (Mon→Sun), Markdown table to stdout:
python3 "$SK/scripts/workload_report.py"
# Explicit window:
python3 "$SK/scripts/workload_report.py" --from 2026-06-01 --to 2026-06-07
# CSV for a spreadsheet:
python3 "$SK/scripts/workload_report.py" --csv > workload.csv
# Tune the bands (otherwise over = org /capacity/threshold or 100%, under = 50%):
python3 "$SK/scripts/workload_report.py" --over 90 --under 40
# Machine-readable summary:
python3 "$SK/scripts/workload_report.py" --json
It reads GET /workload?date_from=&date_to=, GET /workload/capacity, GET /capacity and
GET /capacity/threshold (see references/endpoints.md → Workload & capacity), merges them per
user_id, and prints one row per member: assigned · in-progress · done · hours-logged · est. hours ·
capacity · utilization % · flag. Members above the over-threshold are flagged ⚠️ OVER, below the
under-threshold ↓ under, and those with no capacity target — n/a.
Dry-run / apply
There is nothing to apply — this skill is read-only by construction. It makes only GET calls, takes
no --apply/--admit flag, and is always safe to re-run. (The dry-run-by-default rule is satisfied: it
never mutates.)
Output columns
| Column | Source |
|---|---|
| Assigned / In progress / Done | counts from /workload (open + WIP + completed in the window) |
| Hours logged | logged hours from /workload over [from,to] |
| Est. hours | estimated open load from /capacity (falls back to /workload) |
| Capacity | per-member target hours from /capacity or /workload/capacity |
| Utilization % | the server's value if given, else 100 × est-or-logged ÷ capacity |
| Flag | OVER > over-threshold · under < under-threshold · n/a if no capacity |
Gotchas (this domain)
- Threshold source.
--overwins; else the org's/capacity/threshold; else100%. The header line states which was used (flag/org/default). - Field-name drift. The aggregates use varied keys across orgs/versions; the script normalizes common
aliases (
in_progress/inProgress/wip,hours_logged/logged_hours, …) and toleratesarrayor{data:[…]}/{members:[…]}envelopes — the same defensive shapecontext_sync.shuses. - No capacity set. Members with a
0/missing capacity target show utilization—and flagn/arather than dividing by zero or being silently dropped. - Names. Resolved from
.projekt-run/context.json. If you skippedcontext_sync.sh, rows fall back to user-ids and a warning prints on stderr. - Window default. Current ISO week, Monday→Sunday, computed locally. Dates must be
YYYY-MM-DD;--fromafter--toexits non-zero. - 403 cross-org / 429 / 5xx. A PAT is bound to one org (403 → switch org/token, not a bug); 429 and
5xx are auto-retried with backoff by the shared client. See
references/errors.md.
What it does NOT do
No writes, no rebalancing, no assignment changes, no estimation, no time logging — it only reports. To act
on the findings (assign/move issues, log time, document) route back through the projekt orchestrator to
projekt-issues, projekt-time or projekt-docs. Token resolution + error envelope live in the shared
references/auth-setup.md and references/errors.md.