Set up project
Scaffold and audit the per-repo configuration the skills assume:
- Rules file: , which every harness reads. is either the single line or a symlink to . Claude Code skips a project's when a exists, and both of those forms give it the same text.
- Issue tracker: where issues live (GitHub by default; local markdown is also supported out of the box)
- Triage labels: the strings used for the five canonical triage roles
- Domain docs: where and ADRs live, and the consumer rules for reading them
- Folder standard: the lines of orchestrating/folder-standard.md
- Allow-only project permissions: the global rules are the machine's safety rails, and a project's own harness files only add convenience. The audit flags every project file that weakens a global rule.
You explore, present what you found, confirm with the user, then write. Running it again is the audit.
Process
1. Check the machine
Run
set-up-machine's verify script,
python3 <set-up-machine skill>/scripts/verify.py
(the skill is installed beside this one). A pass is exit code 0. That means the
line says
and no
line says
. A
line that says
,
,
, or
is not a failure.
is what the script prints for a row Codex can't express, and it still exits 0 with
. When the exit code is not 0, run the
set-up-machine skill first, then come back. Done when verify exits 0.
2. Explore
Look at the current repo to understand its starting state. Read whatever exists; don't assume:
- and : is this a GitHub repo? Which one?
- and at the repo root: does either exist? Is there already an or section in either?
- and at the repo root, and any or in the repo: the domain docs' old names, which the skills no longer read
- and any directories
- : does this skill's prior output already exist?
- : a sign that a local-markdown issue tracker is already in use
- : the folder standard's old image folder
- Is the skill installed? (a skill folder alongside this one, or in your available skills.) This decides whether Section B runs at all.
- Monorepo signals: a , a field in , or a populated with its own . These are present only in a genuinely large multi-package repo; their absence means single-context, which is almost every repo.
- A tool the project's own docs require for a role skills name (a worktree tool in a , a session host its scripts assume). This decides whether Section D runs.
3. Present findings and ask
Summarise what's present and what's missing. Then take the sections in order. One section, one answer, then the next.
Lead each section with the recommended answer so the user can accept it in a word. Give a one-line explainer only when the choice genuinely branches; skip the section entirely when exploration already settled it (Section B when
isn't installed, Section C when there's no monorepo and no old
or
, Section D when the project names no tool for a role).
Section A: Issue tracker.
Explainer: The "issue tracker" is where issues live for this repo. Skills like
,
, and
read from and write to it. They need to know whether to call
, write a markdown file under
, or follow some other workflow you describe. Pick the place you actually track work for this repo.
Default posture: these skills were designed for GitHub. If a
points at GitHub, propose that. If a
points at GitLab (
or a self-hosted host), propose GitLab. Otherwise (or if the user prefers), offer:
- GitHub: issues live in the repo's GitHub Issues (uses the CLI)
- GitLab: issues live in the repo's GitLab Issues (uses the CLI)
- Local markdown: issues live as files under in this repo (good for solo projects or repos without a remote)
- Other (Jira, Linear, etc.): ask the user to describe the workflow in one paragraph; the skill will record it as freeform prose
Record the choice in
docs/agents/issue-tracker.md
. The GitHub and GitLab templates carry a "PRs as a request surface" flag, defaulted
off. Leave it off and don't raise it: a user who wants external PRs in the triage queue can flip the flag in the file later.
Section B: Triage label vocabulary. Skip this section entirely if the
skill isn't installed (exploration told you), since an uninstalled skill needs no labels.
If it is installed, ask exactly one question:
Do you want to keep the default triage labels? (recommended: yes)
The defaults are the five canonical roles, each label string equal to its name:
,
,
,
,
. On
yes, write them as-is. Only if the user says no, usually because their tracker already uses other names (e.g.
for
), collect the overrides so
applies existing labels instead of creating duplicates.
Section C: Domain docs. Default to
single-context (one
+
at the repo root). This fits almost every repo; write it without asking.
Offer
multi-context (a root
pointing to per-context
files) only when exploration found monorepo signals. Then confirm which layout they want.
When exploration found an old
or
, propose renaming each with
, so its history follows it:
git mv CONTEXT.md GLOSSARY.md
,
git mv CONTEXT-MAP.md GLOSSARY-MAP.md
, and the same for each per-context
. Where the new name already exists,
refuses: propose merging the old file into the new one instead, and ask which wins where they disagree. Also propose updating the map's links and any other file that names the old files; the drafts of
and
already use the new names.
When exploration found a
folder, propose moving each topic with
, as the folder standard's
Migration from older layouts says: images the project ships or shows to
, screenshots to
assets/screenshots/<topic>/
, and each relative link to them updated.
Section D: Project environment defaults. Recommend
none. Ask only when exploration found a tool the project requires for a role: then propose an
row for it, which overrides the user's global row for this project.
agents-md.md,
Environment defaults, says what may go there.
4. Confirm and write
Show the user a draft of:
- : new from agents-md.md, or the existing one with the block and any rows added, and each line of an existing moved into it
- : the single line , or an existing symlink to left as it is. Claude Code skips a project's when a exists, and both forms give it the same text.
- : and , each only where it's missing
- The contents of
docs/agents/issue-tracker.md
, , and docs/agents/triage-labels.md
(the last only when is installed)
- Each rename or merge of an old or , and the edits to the files that name them, when Section C proposed them
- Each move out of , and the links it updates, when proposed
Let them edit, then take one approval for all of it. Then write:
-
Edit
, never
. If an
block already exists, update its contents in place rather than appending a duplicate, and keep the user's edits around it. Include the
sub-block only when
is installed and Section B ran.
-
Leave
holding
alone (a
that is a symlink to
is fine as it is), and add the missing
lines.
-
Write the docs files using the seed templates in this skill folder as a starting point:
- issue-tracker-github.md: GitHub issue tracker
- issue-tracker-gitlab.md: GitLab issue tracker
- issue-tracker-local.md: local-markdown issue tracker
- triage-labels.md: label mapping (only if is installed)
- domain.md: domain doc consumer rules + layout
For "other" issue trackers, write
docs/agents/issue-tracker.md
from scratch using the user's description.
Give every
docs/agents/issue-tracker.md
the templates'
section, so each skill that creates an issue titles it the same way. Seed its semantic list from the areas the project's open issue titles already name, one line each with what the area covers.
-
Run each approved rename or merge of an old
or
, then update the files that named it.
-
Run each approved move out of
, then update the links to it.
Done when every approved change is made.
5. Audit
Read every harness file the project holds, from the root down, against
set-up-machine's
, whether or not that harness is set up on this machine:
and
,
,
and
,
.
references/project-files.md says what each harness lets a project file do to a global rule, and how to judge an entry. Report each finding as:
- : a global rule no longer holds as the machine sets it, in some harness. Explain which and why, and propose the fix: remove the entry, or narrow it to the project's own commands. The file is the project's, so change it only on the user's approval.
- : an allow that covers a rule's command while the rule still holds. Propose narrowing it.
- (a project deny or ask) and (what you can't judge): name each.
Also report each old
or
still in the repo, with the rename Section C proposes for it. Report a
docs/agents/issue-tracker.md
that has no
section, and propose the section step 3 writes.
The audit passes with no
. Done when it passes, or the user has chosen to keep a
entry: then it stays failed, and the report names that entry.
6. Done
Tell the user the setup is complete, what the audit found, and which skills will now read from these files. Mention they can edit
and
directly later; re-running this skill audits the project again, and switches issue trackers when they want to. Leave the commit to the user or the skill that called this one.