From cornerman
One-time conversational setup that detects the project stack, discovers GitHub Issue Types and project boards, writes `.claude/project.yaml`, and drops in starter CLAUDE.md, CONTRIBUTING.md, docs/, jtbd/, scripts/, AGENT_COMMS.log. Use once per new repo when installing cornerman. Idempotent — safe to re-run; existing files prompt before overwrite.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cornerman:bootstrap-projectThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The on-ramp. Drops a new Bout Labs repo into the cornerman pattern in ~3
The on-ramp. Drops a new Bout Labs repo into the cornerman pattern in ~3 minutes. Run this once per repo, then never again (re-running asks before touching anything).
This skill is shipped from the cornerman plugin. Its templates live at
<plugin-root>/templates/ — typically .claude/plugins/cornerman/templates/
in the project that's installing. If templates can't be found, surface
clearly — the plugin install is incomplete.
git remote -v to find origin; confirm with the usergit branch -l to find branches; ask which is the default (default
guess: develop if it exists else main)master for App Store-tagged releases on iOS)Scan the working tree for tells:
*.xcodeproj or *.xcworkspace → ios-xcodenext.config.{js,ts,mjs,cjs} → nextjspyproject.toml with a [tool.poetry] section → python-poetry
pyproject.toml could be Hatch, PDM, Rye, or Flit — grep
for the section before selecting this presetpackage.json without Next → nodejs-generic (TODO)go.mod → go-modules (TODO)Print the detection result, ask to confirm or override. If the right preset
isn't shipped yet, surface and offer the custom block in the manifest so
commands can be filled in manually.
If the org uses native Issue Types (BoutLabs does), query GraphQL to fetch the type node IDs:
query {
organization(login: "<org>") {
issueTypes(first: 10) { nodes { id name } }
}
}
Map them: Feature → feature, Task → task, Bug → bug.
If the org doesn't have Issue Types configured, leave the manifest fields empty and call out in the bootstrap report that issues will be filed without type metadata — flagged as a manual follow-up.
Ask: "Is there a GitHub Projects v2 board for this repo? Paste the URL or say no." If yes:
github.project_boardRead open milestones from GET /repos/<owner>/<repo>/milestones?state=open.
Show the list, ask which to allowlist (default: all open ones).
Ask: "Which env var holds the GitHub token for agent writes? (default:
GITHUB_PERSONAL_ACCESS_TOKEN)" Write the chosen name into the manifest
under github.token_env_var.
Optionally ask: "Is there a script that mints/refreshes that token? (path
or empty)" If given, write it into github.token_mint_script. The skill
does not install or copy the mint script itself — that's a one-time
per-machine setup, not part of bootstrap.
Ask: "Which tracker manages this project's issue state?"
Options:
github-projects-v2 (default when a Projects board exists)text-files (no external tracker; writes project-management/STATUS.md)linear — if chosen, follow up with:
ENG)" → tracker.linear.team_keyLINEAR_API_KEY)" → tracker.linear.token_env_vartracker.linear.workflow_state_map when the project uses custom workflow state namesWrite the chosen backend into tracker.backend in the manifest. Leave empty to let state.sh auto-detect at runtime (github-projects-v2 if a board is configured, text-files otherwise).
From <plugin-root>/templates/, render each .tmpl against the answers and
write into the project. Note: as of plugin v0.3, all four project
directories are lowercase: docs/, jtbd/, scripts/, and the standard
.claude/. Projects bootstrapped with earlier versions that used Docs/,
JTBD/, or Scripts/ should rename with a two-step git mv to work
around case-insensitive macOS filesystems:
git mv Docs _docs_tmp && git mv _docs_tmp docs
git mv JTBD _jtbd_tmp && git mv _jtbd_tmp jtbd
git mv Scripts _scripts_tmp && git mv _scripts_tmp scripts
.claude/project.yaml ← the manifestCLAUDE.md ← managed-section markers + project gapsCONTRIBUTING.md ← Bout Labs template, filled inAGENT_COMMS.log ← emptydocs/ARCHITECTURE.md ← skeleton; the architect agent owns thisdocs/WORKFLOW.md ← skeletondocs/GLOSSARY.md ← empty (project-owned)docs/DECISION_LOG.md ← empty (project-owned)docs/LESSONS.md ← empty + header explaining purposejtbd/README.md ← how to write JTBD entriesscripts/README.md ← scripts/ purpose.gitignore additions ← append AGENT_COMMS.log + .claude/worktrees/ if not presentEach existing file gets a diff preview + confirm-before-overwrite prompt; the manifest writer is the only non-prompted overwrite (assumed: re-running bootstrap means refreshing the manifest).
git add . && git commit -m "chore: bootstrap cornerman".claude/project.yaml already exists, ask whether to refresh it or
keep the existing values + just refresh template files<!-- cornerman:agent-pipeline:start -->)/cornerman migrate) planned for thatios-xcode, nextjs, python-poetry. Others
(nodejs-generic, go-modules, etc.) fall back to custom..claude/plugins/cornerman/install.json
pointer file — for now the install is "clone the plugin into
.claude/plugins/cornerman/"github.token_env_var (falling back to
$GITHUB_PERSONAL_ACCESS_TOKEN if unset); if neither is present, the
discovery steps gracefully degrade to "ask the user to paste the IDs"Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub boutlabs/claude-plugins --plugin cornerman