From Strategy Skills
The team workflow and co-working control center. An application, operated by talking to Claude in this project, that manages the team's tasks, runs the right skill to get each one done, AND routes requests between people, asking someone to review a document, review a session or decision, give input you are missing, validate your thinking, or sign something off. Use to add items, ask what you or someone else has, see what is due or what is next, work the next task by running its skill, remind people, and to ask a colleague for review, input, validation or approval and record what comes back. Trigger phrases include "tasks", "what do I have to do", "what is due", "what is next", "what does <person> have", "work the next task", "add a task", "mark done", "remind", "action items", "workflow", "register", "who owns this", "ask <person> to review", "review this document", "review this decision", "get <person>'s input", "I need input on", "validate my thinking", "approve", "sign off", "what have I been asked to do", "my inbox", "what am I waiting on". The register lives in the configured tasks folder as register.json, the source of truth. It does not need GitHub. It is designed to be read or driven by an external rules engine for reminders.
How this skill is triggered — by the user, by Claude, or both
Slash command
/strategy-skills:tasksThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This is the **control center** for the team's work. It is an application you operate by **talking to Claude in this project** (Cowork or the CLI). It reads the configured `paths.outputs.tasks` folder from `${CLAUDE_PROJECT_DIR}/.strategy-skills/config.json`; if that config does not exist, stop and run the `setup` skill first. Three jobs:
This is the control center for the team's work. It is an application you operate by talking to Claude in this project (Cowork or the CLI). It reads the configured paths.outputs.tasks folder from ${CLAUDE_PROJECT_DIR}/.strategy-skills/config.json; if that config does not exist, stop and run the setup skill first. Three jobs:
It needs no GitHub and no other tool. Everyone on the team uses it the same way, by asking Claude. Some team members are not on GitHub, and that is fine.
The helper is code and ships in the plugin; the register and people files are data and live in the project. The data folder is the configured paths.outputs.tasks (written <tasks> below), seeded by the setup skill.
${PLUGIN_ROOT}/scripts/tasks.py (list, due, mine, next, add, set, render, remind, gh-create). ${PLUGIN_ROOT} is ${CLAUDE_PLUGIN_ROOT} when set, else ${CLAUDE_PROJECT_DIR}/<paths.pluginRoot>. It locates the data folder from the config automatically; pass --data-dir only to override.${CLAUDE_PROJECT_DIR}/<tasks>/register.json.${CLAUDE_PROJECT_DIR}/<tasks>/people.json (names, optional GitHub handles).~/.claude/strategy-skills/identity.json (honouring CLAUDE_CONFIG_DIR), keyed by project, holding the operator's own people key. It is the one piece that is NOT shared, because the register is — and it lives in the user's home so it survives both git and folder-sync sharing (Dropbox/OneDrive sync the whole folder and ignore .gitignore).${CLAUDE_PROJECT_DIR}/<tasks>/register.md plus brand-styled register.html.Run the helper from the project root, e.g. python "${PLUGIN_ROOT}/scripts/tasks.py" next. If .strategy-skills/config.json does not exist, stop and run the setup skill first.
The register is shared by the whole team, but who is using it right now is local to this checkout. Know who the operator is before you raise a request on their behalf or answer "what do I have", because the requester is part of the permanent record and must never be guessed. Resolve it at the start of any session that will create requests or answer mine / inbox / awaiting:
tasks.py whoami. If it returns an identity, use it.people.json.people.json if new, then persist with tasks.py whoami --set <key>.Identity is stored per-user, outside the project, in ~/.claude/strategy-skills/identity.json (keyed by project; honours CLAUDE_CONFIG_DIR), never in register.json. The home location matters: a project shared by Dropbox or OneDrive syncs the whole folder and ignores .gitignore, so a project-local file would leak one person's identity to everyone. STRATEGY_TASKS_ME is the per-shell override. A project-local .strategy-skills/identity.local.json is still read for back-compat but is unsafe inside a shared folder, so the helper warns whenever it finds one — if you see that warning, run whoami --set and delete the project copy. With identity set, request defaults --by to the operator, and mine / inbox / awaiting default to them. Do not hardcode a name: a different teammate on a different machine is a different operator.
Every item carries the work fields: id, title, detail, owner (a key in people.json; for a request this is the person asked to act), skill (north-star | brainstorm | pain-point | wwwh | empty), created, due (YYYY-MM-DD or null), status (open | in-progress | blocked | done | cancelled), blocked_on, source (where it came from), output (the artefact the skill produced), priority.
A request to another person adds the co-working fields:
kind — task (a plain work item, the default) or one of the request kinds: review-document, review-session, review-decision, input, validate, approve.requested_by — the person asking (a people key). owner is the person asked. This is what makes it co-working, not just an assignment.target — what is under review: a document path, a session or decision reference, or an item id. Distinct from output (which is what this item produces).response — what the asked person returned: the feedback, the input, or the verdict. Free text or a path.outcome — pending until they respond, then answered (for input) or approved | changes-requested | rejected (for the review/validate/approve kinds).feeds — the item id a returned answer flows back into (e.g. the brainstorm a piece of input unblocks). Creating the request parks that item as blocked; a positive response unblocks it.Below, tasks.py is shorthand for python "${PLUGIN_ROOT}/scripts/tasks.py", run from the project root.
tasks.py mine (defaults to the operator; pass a key for someone else). "What is due" runs tasks.py due. "What is next" runs tasks.py next. "What have I been asked to do" runs tasks.py inbox. "What am I waiting on" runs tasks.py awaiting. The bare forms rely on the operator identity being set.tasks.py add --title ... --owner ... --skill ... --due .... Ask for the owner and the due date, do not guess them. Tag the skill that will assist it.tasks.py request --kind ... --to ... --by ... --target ... --due .... Record what comes back with tasks.py respond <id> --outcome ... --response .... See "The co-working loop" below.in-progress (tasks.py set <id> --status in-progress), then invoke that skill (the Skill tool) with the item's context. When the skill locks its output, set the item done and record the artefact (tasks.py set <id> --status done --output <path>).tasks.py set <id> --status ... --due ... --blocked_on ....tasks.py render, then render the brand HTML with the strategy-skills renderer.This is the heart of working with the team. The loop is ask → it lands with them → they respond → it returns to you, and the register holds every step so nothing is lost and the rules engine can chase it.
Ask. When the user wants someone else to look at something, give input, validate, or sign off, raise a request. Confirm who is asked, what they are reviewing, and the due date — do not guess them. Who is asking defaults to the operator identity (see "Who is operating" above), so resolve that first; pass --by only to override it. --to and --by are people keys; if a named colleague is not yet in people.json, add them there first (a <key>: {"name": "<Name>"} entry, with an optional github handle) so they read back as a name everywhere. Then:
tasks.py request --kind <kind> --to <asked> --by <asker> --target "<what>" --due <YYYY-MM-DD> [--feeds <id>]
Pick the --kind from the intent:
--target is the document path.--target names the session or decision.--target is the question.--target is the reasoning under test.--target is the decision. See the approval gate below.If the request unblocks a piece of work you are mid-way through, pass --feeds <that item id>. The helper parks that item as blocked until the answer returns. This is the mechanism behind a mid-session bring-in (e.g. a brainstorm pausing on a colleague's input).
See what is asked of whom.
tasks.py inbox <key> — requests awaiting that person's response ("what has been asked of me").tasks.py awaiting <key> — requests that person raised that are still pending ("what am I waiting on from others").Respond. When the asked person comes back, record it from the source of truth:
tasks.py respond <id> --outcome <answered | approved | changes-requested | rejected> --response "<what they said, or a path>"
This marks the request done, stores the verdict in outcome, and — if the request had --feeds — unblocks the fed item on a positive outcome (answered/approved) so you can fold the answer in and resume, or leaves it blocked on changes-requested/rejected so it gets revised and re-asked. When the returned content is a fact that flows into a strategy artefact, carry it in attributed and tagged: <their input> [User-asserted: <Name>]. It is their assertion, not yours, and the renderer highlights the attribution.
The approval gate (hard). An approve request is a real gate. Before a decision or artefact that requires sign-off is locked as Trusted or carried into a downstream skill, check:
tasks.py list --kind approve --target "<the decision>" --pending
If that returns anything, the sign-off is still outstanding: do not lock, and do not carry it downstream. Only once the approver has recorded --outcome approved is the gate open. changes-requested and rejected do not open it.
In-project reminders only reach someone who is in the project. To reach a team member when they are not, the mechanism is an external production rules engine (if the team has one), which reads register.json and sends reminders or escalates overdue items. A pending request is exactly what the engine routes: it knows who was asked, by whom, for what, and by when. register.json is structured for exactly this. Wiring it needs the engine's API (endpoints, auth, the fields it expects). Until then, tasks.py remind <owner> shows what is due, tasks.py inbox <owner> shows what they have been asked to do, and GitHub Issues (gh-create, remind --post) is an optional extra for whoever is on GitHub.
whoami); if it is not set or evident, ask, then persist it with whoami --set. Identity is per-user and stored in the home dir, never in the shared register or the project folder, so folder-sync tools cannot leak it.respond so outcome reflects reality and any fed thread unblocks.[User-asserted: <Name>]), never silently absorbed as your own.pending approve request stands against it.approve request is still pending, changes-requested or rejected.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub base2services/strategy-skills --plugin strategy-skills