setup
Skill81 starsChanged 4 months agoApache-2.0View on GitHub
Configure Tyran for this repository. Scans the stack, the validation commands and the git history, writes .tyran/config.yaml with provenance for every inferred value, installs the bare /tyran shortcut, and asks you only about what it genuinely could not establish. Run once per repo.
- Commits and pushes
191 other projects use a version of this.
Adopted by
Most recently taken up by
- hydra-db/hydradb-claude-codetheir own version, first seen Nov 8, 2026
- WALKERKILLER/Look-Tongji-Notestheir own version, first seen Nov 8, 2026
- steerlabs/opensteertheir own version, first seen Nov 8, 2026
- ansvisor/ansvisortheir own version, first seen Nov 8, 2026
- dsifry/metaswarmtheir own version, first seen Nov 8, 2026
- anombyte93/prd-taskmastertheir own version, first seen Nov 8, 2026
Used with
Projects with it also use add-voice-transcription, add-discord and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
juancruzmunozalbeloSkilladd-voice-transcription
Add voice message transcription to NanoClaw using OpenAI's Whisper API. Automatically transcribes WhatsApp voice notes so the agent can read and respond to them.
Also in 5 projects that use this
MicrosoftSkilladd-discord
Add Discord bot channel integration via Chat SDK.
Also in 11 projects that use this
MicrosoftSkilladd-slack
Add Slack channel integration via Chat SDK.
Also in 11 projects that use this
juancruzmunozalbeloSkilladd-telegram-swarm
Add Agent Swarm (Teams) support to Telegram. Each subagent gets its own bot identity in the group. Requires Telegram channel to be set up first (use /add-telegram). Triggers on "agent swarm", "agent teams telegram", "telegram swarm", "bot pool".
Also in 7 projects that use this
- +8 more from microsoft
Other versions191 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 191
- anthropics/knowledge-work-plugins★ 35ksame name
- garrytan/gbrain★ 32ksame name
- gavrielc/nanoclaw★ 31ksame name
- nanocoai/nanoclaw★ 31ksame name
- qwibitai/nanoclaw★ 31ksame name
- Q00/ouroboros★ 6.3ksame name
- pytorch/executorch★ 5.2ksame name
- agenticnotetaking/arscontexta★ 3.5ksame name
- aws/agent-toolkit-for-aws★ 3.4ksame name
- spotify/portal-ai-plugins★ 2.8ksame name
181 more not listed
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 repository15 other files it gives its agents.
- docs/agents.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- browser-checkSkill
- code-reviewSkill
- deslopSkill
- doctorSkill
- fidelity-gateSkill
- helloSkill
- pr-feedbackSkill
- prompt-tuningSkill
- retroSkill
- root-causeSkill
- runSkill
- skill-writingSkill
- statusSkill
The file
We split this skill into the rules it gives an agent
6 rules. 0 are common, 3 are distinctive, and 3 are very specific to this project.
0
Common
Most of the 170 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 44
If you find a repository already in the broken state — .tyran/ present, no policy — this repairs it without touching anything else:
- Very specific: line 51
It never infers
P3: No arrangement of files is evidence that a person meant to let an agent merge to main and deploy to production. - Distinctive: line 64
Verify what it reports before you write it down.
- Distinctive: line 88
Use it whenever the operator has given you any sign they are not an engineer, and when you are unsure.
- Very specific: line 93
Read plain.question, plain.because, then the options with plain.recommended marked.
- Distinctive: line 153
If there are pre-existing findings, explain the choice in the operator's words, and do not make it for them:
“Common” is measured: kept by at least 6 in 10 of the 170 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Setup
Configure Tyran for the repository you are in. One pass, then a short list of questions — never an interrogation.
1. Scan what can be established without asking
node "${CLAUDE_PLUGIN_ROOT}/scripts/scan-repo.mjs" --dir . \
--write .tyran/config.yamlThis is deterministic on purpose. It reports the package manager, the validation commands the repo actually declares, the languages by weight, and an autonomy class inferred from how the repository is really worked. Every value carries the fact that produced it and a confidence, so months later "why does this repo think it is P2" has an answer in the file itself.
It writes two files, and the second one is why this command is not
optional. Before the config, it installs .tyran/policies/autonomy.yaml
from the shipped template. The policy gate is silent in a repository with no
.tyran/ directory and refuses every write in a repository that has one
without a policy under it — so creating the config alone moves the repo from
"unmanaged" to "refuses everything", including the write that would have
fixed it. Setup did exactly that once, and the session ended with a mkdir
and a cp handed to the operator.
Installing it is bootstrap, not an agent granting itself permission: it only
ever creates, never overwrites, and what it writes is the strictest template
Tyran ships. Editing that file afterwards is human-only and stays so — the
gate refuses Write, Edit, and any shell command that names the path.
It also seeds MISTAKES.md at the repository root: the durable record of what
has gone wrong here, which /tyran:retro appends to at close and reads before
it proposes anything. Create-only like the policy — and deleting it is the
whole opt-out, so a repository that does not want one simply removes it. Say
in your report that it appeared; a file landing in someone's working tree
unannounced is a bad way to meet a tool.
If you find a repository already in the broken state — .tyran/ present, no
policy — this repairs it without touching anything else:
node "${CLAUDE_PLUGIN_ROOT}/scripts/scan-repo.mjs" --dir . --ensure-policyIt never infers P3. No arrangement of files is evidence that a person
meant to let an agent merge to main and deploy to production. That is a
decision someone makes in words, and if the operator wants it they will say
so — write it down with the date and their sentence.
2. Read what the humans wrote down
Send tyran:scout over README, CLAUDE.md, AGENTS.md, CONTRIBUTING
and the CI config, looking for what the scanner cannot see: commit
conventions, review expectations, deployment rituals, files that must never
be edited by hand, known-flaky tests. Fold the findings into the config's
shared_zones and into a short note for the operator.
Verify what it reports before you write it down. A convention stated in a README that the last fifty commits ignore is not this repo's convention; say which one you found in the code and which one the document claims.
3. Ask only about what is flagged
The scan returns a questions array. Those — and only those — go to the
operator, in ONE message, each with the evidence behind it and your
recommendation. Anything not flagged you decide yourself.
Bad: "What is your autonomy class?"
Good: "Only 2 of the last 50 commits on main arrived as merges, and there
is a staging branch with CI. That looks like P2 — I release to staging on
my own, production stays yours. Confirm, or say P1 and I only ever touch
branches."
If they are not an engineer, ask the ONE question instead
Sales and marketing people run this now. questions is written for someone
who knows what an autonomy class is, and four entries shaped field: source
is where a non-expert stops. The same scan carries a plain object built for
them — one question, its evidence in ordinary words, two options at most,
and a derived list of what Tyran settled for itself.
Use it whenever the operator has given you any sign they are not an engineer,
and when you are unsure. It costs a fluent reader nothing: everything in
questions is still in the config with its provenance, and plain.evidence
keeps the raw git sentence for anyone who wants the numbers.
Read plain.question, plain.because, then the options with
plain.recommended marked. Then read the derived lines out as decisions,
not as questions — those are the things the repository already answered, and
re-asking them is what makes setup feel like an interrogation. Close with
plain.note, which says how the one class Tyran will never infer is actually
reached, and that the dashboard can change all of it later.
The three questions you are NOT asking them are deliberate: the package
manager is a fact, the validation commands are a fact or an honest gap, and
the CLAUDE.md line is a paste they can see. A question someone cannot
answer is not a safeguard; it is a place to give up.
One flagged question is the CLAUDE.md pointer, and it is a question rather
than an edit on purpose. Tyran writes CLAUDE.md only inside its own
tyran:rules fence, and only through mistakes.mjs promote --law, which
demands five recorded occurrences of one signature; this line lives outside
that fence, so it is theirs to paste:
Log mistakes in MISTAKES.md (what happened, root cause, prevention).That single line is what makes ordinary sessions — the ones Tyran does not conduct at all — contribute evidence. Do not write it yourself.
4. Install the bare /tyran shortcut
Plugin skills are namespaced, so the conductor is /tyran:run. Most people
would rather type /tyran. Offer to write the shim:
mkdir -p .claude/skills/tyran
cp "${CLAUDE_PLUGIN_ROOT}/templates/project-command/SKILL.md" \
.claude/skills/tyran/SKILL.mdIt is a few lines that hand straight over to tyran:run, so the playbook
still lives in the plugin and updates keep reaching it. Mention that it lands
in their repo and will show up in their next commit — a file appearing in
someone's working tree unannounced is a bad way to meet a tool.
4b. Make the secrets gate satisfiable, and say what it found
The gate refuses every commit and push until gitleaks exists. Install it
before anything needs it, rather than letting the first commit fail with a
prerequisite the operator may not be able to meet:
node "${CLAUDE_PLUGIN_ROOT}/scripts/ensure-gitleaks.mjs"Pinned and checksummed, into ~/.tyran/bin/; it is a no-op when the machine
already has one, and PATH still wins.
Then look, before they hit it. A repository whose history already contains a secret is common and the gate handles it badly by surprise: nothing is scanned until someone EDITS the file that holds it, and then every commit touching that file is refused, permanently, with no hint that the cause is years old. Run a scan and say plainly what is there.
If there are pre-existing findings, explain the choice in the operator's words, and do not make it for them:
- a tracked
.gitleaks-baseline.jsontells the gate "these exact findings are known" — new secrets are still caught, and because it is tracked the suppression appears in a diff instead of being an invisible local file; - but a baseline makes the tool quiet, it does not make the key safe. If the repository is public, that key is already burned and the real fix is rotating it. Say this once, here, rather than letting them discover it after they have relied on the baseline.
4c. Turn the dashboard on
Setup is not finished until they have SEEN something. Everything above is files on disk; the board is where any of it becomes legible, and it was the one thing installation never actually reached.
node "${CLAUDE_PLUGIN_ROOT}/scripts/board.mjs" --dir .tyran --detach --write --open--detach, never --serve. They are the same server; --serve holds the
terminal until Ctrl-C, which is right for a human who typed it and fatal here
— an agent that runs it sits on the call until the platform's timeout, and
every step below this one silently never happens. That is what this step used
to do. --detach waits only until the board answers, prints the URL, and
returns; --stop ends it.
--open launches their browser; --write is what makes the Settings tab
able to edit config.yaml and the autonomy policy from the page. Tell them
that tab exists and what it covers — profile, autonomy class, tiers,
validation commands, shared zones, overnight limits — because for someone who
would rather not hand-edit YAML in their own repository, that tab is the
entire configuration story and they will not guess it is there.
Say that they do not have to run this again: the scan wrote a board: block
with autostart: true, so every later session starts the board if it is not
already up, and prints the URL in its opening summary. Several repositories at
once each get their own — the port walks forward from 4173 when one is taken.
node scripts/board.mjs --dir .tyran --status says where it is; --stop ends
it; autostart: false in the config turns the whole thing off.
5. Validate and report
node "${CLAUDE_PLUGIN_ROOT}/scripts/schema.mjs" validate config .tyran/config.yaml
node "${CLAUDE_PLUGIN_ROOT}/scripts/tiers.mjs" --config .tyran/config.yaml
node "${CLAUDE_PLUGIN_ROOT}/scripts/doctor.mjs" --hooks
node "${CLAUDE_PLUGIN_ROOT}/scripts/doctor.mjs" --state --dir .tyranThe --state run is the one that answers "is this repo actually usable now",
and it is also how you validate the policy. Do not reach for
schema.mjs validate policy .tyran/policies/autonomy.yaml: the gate refuses
any shell command that names a path under .tyran/policies/**, including
that one. doctor --state validates the same file and names only .tyran.
A policy-missing finding there is an error, not a note — it means every
write in the repo is being refused.
Report in six lines: what was detected, what was inferred and from what, what
you asked about, that both .tyran/ files are in place and validate, whether
the shortcut was installed, and what to run next. Paste the raw output of the
commands above — the evidence contract binds you exactly as it binds every
agent you will spawn.
6. Tell the operator to commit .tyran/, and say why
End by asking for one commit of .tyran/. This is not tidiness, and the
reason is the one failure mode of this whole setup that is silent:
git add .tyran
git add MISTAKES.md 2>/dev/null || true # absent if they took the opt-out
git commit -m "chore: adopt Tyran"Two git add calls, not one: git add is atomic on an unmatched pathspec, so
naming a deleted MISTAKES.md alongside .tyran aborts the whole staging and
&& then eats the commit — the silent failure this step exists to prevent.
The scan also seeded .tyran/.gitignore (excluding state/*/locks/), so this
git add stays clean: lease files record who holds a resource RIGHT NOW, and a
committed lease conflicts on every parallel merge. Commit the .gitignore
with the rest.
git worktree add does not carry untracked files. Tyran's parallel model is
worktrees, so an uncommitted .tyran/ means every worktree the conductor
creates has no config and no policy — and a repo with no .tyran/ is a repo
the policy gate deliberately says nothing about. The agents running in those
worktrees then have no autonomy class and no path classes at all. Nothing
fails; the boundary is simply not there, in exactly the place the most agents
run. Measured on a real install: four worktrees, four ungated implementers.
Until it is committed there is a second hazard worth naming in your report: an
agent that runs git add -A on a story branch sweeps the untracked .tyran/
into that branch, and a four-way parallel run ends with four conflicting
copies of the config. Stage explicit paths until this commit exists.
6b. Say that boundaries: exists, once, and do not sell it
The scan writes the block at its strict setting. Tell the operator, in one or
two sentences, that .tyran/config.yaml has a boundaries: block and that
preset: open relaxes all five at once — files outside the repo, credential
files, their own path rules, the deployment class on git push, and the
permission prompt. The Settings tab edits it, and every move toward the loose
value asks for a confirmation.
Say the floor in the same breath, because it is what makes the offer safe to
make: secret scanning at commit and push, the enforcement hooks,
.claude/settings.json and .tyran/STOP are unreachable from it at any
setting.
Do not recommend a value, and do not ask which they want. Strict is already written and already correct; this is a pointer for the operator who comes back later having hit a refusal they did not want, not a decision to extract during setup. An agent that talks somebody into opening a boundary during onboarding is the failure this step exists to avoid.
7. Offer overnight mode — and say plainly what the operator must do
Overnight mode (https://jjanczur.github.io/tyran/overnight/) pauses autonomous work near the
subscription usage limit and resumes after the window resets. It is OFF by
default, and turning it on is now one edit to .tyran/config.yaml — the
Settings tab will do it — because the gate reads the platform's own usage
cache in ~/.claude.json when no statusline is installed.
That fallback is why this step is short. Until it existed, the telemetry came
only from a statusline the plugin cannot install (.claude/settings.json in
user scope is the operator's file, and the gate refuses agents writing the
in-repo one), so overnight mode's real prerequisite was a paste — and on an
install that skipped it the pause failed open and said nothing.
Show the limits: block to enable (mode: 'pause' — quoted, since bare
off/on are YAML booleans), and say that doctor --state reports
limit-telemetry-missing only when NO telemetry is reachable at all, which
usually means signed out rather than misconfigured.
A statusline is still worth offering to anyone who wants the sharpest possible pause: it is session-scoped and refreshed every few seconds, where the platform's cache is refreshed on its own schedule and has been measured over an hour old. Print the snippet with the plugin path RESOLVED and let the human paste it — never attempt the settings write yourself, the refusal is the boundary working:
{ "statusLine": { "type": "command",
"command": "node <resolved-plugin-root>/scripts/statusline.mjs" } }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.

