team-scan
Skill3 starsChanged 7 days agoMITView on GitHub
Use before the first team-debate, team-plan, team-kickoff, team-refactor or team-review run in a project, when `.council/project-profile.md` is missing, or when the stack, conventions, installed skills or agents have changed since the profile was written.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- plasminds/team-skillsword for word, first seen Oct 20, 2026
Other versions1 project uses a version of this.
Word for word · 1
- plasminds/team-skills★ 3100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository7 other files it gives its agents.
- team-debateSkill
- team-kickoffSkill
- team-planSkill
- team-protocolSkill
- team-refactorSkill
- team-reviewSkill
- team-viewSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 3 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 20
Leave out what fits no domain (document formats, config helpers).
- Distinctive: line 49
When the clause names a tool not found or failing, a second line cites the source of each, from step 11, in the clause's order:
- Distinctive: line 119
Keep the profile to facts, one line each: it is injected into every agent's context.
- Distinctive: line 120
If a domain has no specialist, write "none".
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
team-scan
Produces the project profile that every team-* skill reads. Run it once per project, again when the stack, conventions or skills change. Re-running overwrites .council/project-profile.md, except its ## Constraints, ## Known flakes, ## Environment limits, ## Run preferences and a user-corrected ## Expected load, which it keeps (see Procedure); git tracks history.
What to detect
- Tech stack — languages, frameworks, package manager, build tools, test runner. Read
package.json/pyproject.toml/Cargo.toml/go.modetc., lockfiles, and config files (vite.config,tsconfig,vitest.config, CI files). Also dead-code and dependency-graph tools (knip,ts-prune,madge,dependency-cruiser,vulture,deptry) in the dependencies or config, with the command that runs each. Also security tools (npm audit,osv-scanner,semgrep,gitleaks,bandit) in the dependencies, config or CI, with the command that runs each. - Conventions —
CLAUDE.md,AGENTS.md, lint/format config (eslint, prettier, biome, ruff), architecture patterns, directory layout, naming conventions. Also the launch command, in this order, the first found wins: apackage.jsonscriptdev,startorserve; a Makefile or justfile targetrun,devorserve; a compose file; the README's run block. Record the command with its sourcefile:line; nothing found →Launch: none found. A hand-edited launch line is overwritten on rescan. The command is only written down: team-scan launches nothing, and nothing runs it. Available specialists by domain — take the skills, agent types and MCP servers your session lists (that covers personal, project and plugin installs alike), and map each to a team-role domain by what its description says it does:
- UX domain: interface design, visual critique or audit, accessibility, UX copy, motion
- Technical domain: testing, debugging, code search and exploration, language or framework best practices, plus the project's lint/typecheck/test commands
- Process domain: brainstorming, planning, executing plans, reviews
- Project-specific: agents, MCP servers and skills that only make sense for this project (a database MCP, a deploy skill)
Leave out what fits no domain (document formats, config helpers). The
team-*skills and agents are not specialists.- Other models —
codexandgeminion PATH (command -v), with--version. Detect only: never send them a prompt here. The debate's off-model seat (team-protocol) uses what you find. - Project phase — git history depth, existing plans (signal 9), maturity signals.
- Decision records — an existing folder of architecture decisions (
docs/adr/,docs/decisions/,doc/architecture/decisions/, or the path in.adr-dir): its format (MADR, Nygard, adr-tools), numbering and headings. Debate decisions under.council/decisions/. - Team preferences — memory files, feedback patterns, design docs, and a standing answer on the off-model seat if the user gave one.
- Standing constraints — the
techrules later work must not break (team-protocol§ Bridge): dependency directions and import rules, public contracts, folder conventions, stated inCLAUDE.mdorAGENTS.md, or recorded in the decision records (a debate record's## Constraints, the project's ADRs). Only rules that pass "what happens if we break it?"; a style preference is not one. - Run preferences —
Commit records: nowhengit check-ignore -q .council/decisions/xsucceeds (source: the.gitignoreline it prints with-v).Plan location: a folder that already holds plans (docs/plans/,docs/superpowers/plans/, or oneCLAUDE.mdnames; source: that folder), else.council/plans/(source:default), so a plan never opens a new folder beside a gitignored.council/. The other lines come from the user's answers during runs, never from a guess. - Expected load — who runs the code and how many at once: one person running a script or CLI, one server process, or several instances or workers sharing a store, with data sizes where stated. Read the README, the deploy config (Dockerfile, compose, Kubernetes replicas, Procfile, serverless config, queue workers, cron) and the CI. The reviewers judge races and scale against it. Nothing states it → your best read, marked
assumed. - Machine tools —
crapper,dryer,ast-grep,gitleaksandosv-scanner, each bycommand -vand a probe that must succeed:ast-grep,gitleaksandosv-scannerby--version;crapperanddryerhave no version command, so by--helpexiting 0, and are named without a version. Nothing else runs; team-scan records only. A tool that is not on PATH isnot found; one on PATH whose probe fails isfailing. A failing tool still counts as absent for use, and is named apart from one never installed only in the summary line, never in the profile. The profile line lists found tools only, as a hint; each seat re-checks. The run recipes sit inmachine-tools.md, not here. Sources, cited in the summary for a tool not found or failing:- crapper — github.com/unclebob/crapper (Uncle Bob's; no release, its README says how to install)
- dryer — github.com/unclebob/dryer (Uncle Bob's; no release, its README says how to install)
- ast-grep — github.com/ast-grep/ast-grep
- gitleaks — github.com/gitleaks/gitleaks
- osv-scanner — github.com/google/osv-scanner
Procedure
- Confirm the target directory (default: cwd). In a git worktree, look at its siblings first (§ Sibling worktrees).
- Gather the signals above with read-only tools. Prefer batched, non-interactive commands; do not modify project files other than the profile.
- Write
.council/project-profile.mdusing the output format below. Create.council/if absent. If a profile exists, keep its## Constraintslines as they are (ids, status,lifted bymarks) and add the new ones with the next freeKS<n>id (a rule already listed,lifted byones included, is not new): a standing constraint is never renumbered or deleted. Keep its## Known flakes,## Environment limitsand## Run preferenceslines as they are too, and its## Expected loadline when its source isthe user. Report a one-line summary and the profile path. The summary gains one machine-tools clause, the found tools first, then
; not found: <tools>and; failing: <tools>, each empty clause left out;none foundtakes the place of the found tools when no tool answered its probe;all fivemay stand for the five names when a clause holds all of them. One line per state:- all found:
machine tools: all five found - some not found:
machine tools: gitleaks, ast-grep; not found: crapper, dryer, osv-scanner - some failing:
machine tools: gitleaks, ast-grep, dryer, osv-scanner; failing: crapper - mixed:
machine tools: gitleaks, ast-grep; not found: dryer, osv-scanner; failing: crapper - none found, none failing:
machine tools: none found; not found: all five - none found, all failing:
machine tools: none found; failing: all five - none found, some failing:
machine tools: none found; not found: dryer, osv-scanner; failing: crapper
When the clause names a tool not found or failing, a second line cites the source of each, from step 11, in the clause's order:
sources: dryer — github.com/unclebob/dryer (Uncle Bob's); osv-scanner — github.com/google/osv-scanner; crapper — github.com/unclebob/crapper (Uncle Bob's). Never an install command.- all found:
Output: .council/project-profile.md
# Project Profile — {project name}
_Generated by team-scan on {date}_
## Stack
- Language(s), framework(s), package manager, build, test runner
## Conventions
- Quality gates (lint/typecheck commands), architecture patterns, naming, key CLAUDE.md rules
- Launch: <command that starts the app locally> — <source: file:line>, or `Launch: none found`
- Dead-code and dependency-graph tools present in the project (e.g. `knip`, `ts-prune`, `madge`, `dependency-cruiser`, `vulture`, `deptry`), each with the command that runs it
- Security tools present in the project (e.g. `npm audit`, `osv-scanner`, `semgrep`, `gitleaks`, `bandit`), each with the command that runs it
- Machine tools (machine, a hint; each seat re-checks): <tool> <version>, … (a tool without a version command: `<tool> (no version)`; or `none found`)
## Available Specialists (by domain)
One line each: `<name> — what it is for` (e.g. "writes plans", "executes plans", "TDD", "code exploration"), so a caller can pick the one it needs.
- UX: <mapped skills/agents>
- Technical: <mapped skills/agents + lint/typecheck commands>
- Process: <mapped skills/agents>
- Project-specific: <custom agents, MCP tools>
## Other Models
- `<cli> <version>` per CLI found, or "none"
## Project Phase
- Maturity, git depth, existing plans/decisions
## Expected load
One line; reviewers judge races and scale against it:
- <who runs it, how many at once, data sizes> — <source: file:line | assumed | the user>
## Decision Records
- The project's own: location, format, numbering (e.g. "docs/adr/, MADR, NNNN-title.md"), or "none"
- Debate decisions: count and latest under .council/decisions/
## Team Preferences
- Memory/feedback/design-doc signals worth carrying into debates
- Off-model seat: yes | no | ask (default: ask)
## Constraints
Standing `tech` constraints (`team-protocol` § *Bridge*), one line each, ids stable across runs:
- KS1 — <the rule> — <source: a decision record or plan path, or a CLAUDE.md line> — confirmed | lifted by <record path>
## Known flakes
Tests that fail, then pass on a rerun, one line each; an executor counts a red one as green only when its brief lists it (`team-protocol` § *Execution*):
- <test name or file:line> — <what makes it flaky, e.g. wall-clock timing under load> — <first seen: record path>
## Environment limits
What this machine or sandbox cannot run (sandbox limits, missing tools), one line each; a gate that needs one is `Ungated`:
- <limit> — <the gate it blocks>
## Run preferences
Standing answers to questions a run would otherwise ask every time; a run follows the line instead of asking. A missing line means ask, then record the answer here:
- Commit records: yes | no — <source: .gitignore:<line> | the user, <date>>
- Plan location: <folder> — <source: the folder found | default | the user, <date>>
- Oversized scope: all zones | ask — <source>
- Squash after execution: branch | run | none — <source>
- Next step: launch | paste — <source>
- Dependency scan (osv-scanner, sends the package list to api.osv.dev): yes | no — the user, <date>Sibling worktrees
A project checked out as one worktree per branch, with .council/ gitignored, holds a profile in some worktrees and none in the others. Before scanning a worktree without one, list the others (git -C <worktree> worktree list --porcelain) and copy the newest .council/project-profile.md among them (ls -t <each path>/.council/project-profile.md), with its .council/role-overrides/ if present, in one Bash call. Say so in one line (profile copied from <worktree>). It stands as this worktree's profile: scan only when no sibling has one, or the user asks.
Notes
- Keep the profile to facts, one line each: it is injected into every agent's context.
- If a domain has no specialist, write "none"; the debate still runs.
## Constraintsalso grows at plan approval (team-planappends the newtechconstraints), and is read by every debate framing, the plan reviewers and the gate writers. A constraint lifted at a gate is markedlifted by <record path>, never deleted.## Known flakesgrows at each team-review or team-refactor gate: the record writer appends the flakes its Recon saw. Remove a line only when its test is fixed.## Run preferencesgrows when a run asks one of its questions: the orchestrator writes the user's answer as the line, sourcethe user, <date>. A line changes only when the user says otherwise. team-scan never writes theDependency scanline itself: the orchestrator asks and records it before Recon, bymachine-tools.md, and the line is changed by editing it.- The
Machine toolsline lists the found tools with versions (crapper (no version)for one without a version command, e.g.gitleaks 8.30.1, ast-grep 0.51.1, crapper (no version)), ornone foundwhen no tool answered its probe; it never names a tool not found or failing (that split is the summary line's only), and never says how to get a tool. ## Expected loadis corrected at a team-review gate when the human's note corrects it: the record writer replaces the line, sourcethe user.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

