con un clic
harness-setup
Initialize oh-my-harness in the current project (plugin mode)
Instalar con Codex o Claude Copia este prompt, pรฉgalo en Codex, Claude u otro asistente, y deja que revise la pรกgina de la skill y la instale por ti.
Menรบ
Initialize oh-my-harness in the current project (plugin mode)
Instalar con Codex o Claude Copia este prompt, pรฉgalo en Codex, Claude u otro asistente, y deja que revise la pรกgina de la skill y la instale por ti.
Basado en la clasificaciรณn ocupacional SOC
Run an autonomous, spec-driven, tiered self/cross-verifying loop โ the harness forces continuation until the goal is objectively met or a guardrail fires
Author a durable, machine-checkable SPEC.md (the anchor for an autonomous loop) with EARS-style acceptance criteria mapped to verify commands
Tier 3 ์์ ์๋ฃ ์ N-๋ผ์ด๋ ๋ ๋ฆฝ๊ฒ์ฆยท์์ ๋ฃจํ. git diff๋ฅผ ๋ชจ๋ธ ๋กํ ์ด์ (Claude/GPT/Gemini)์ผ๋ก ๋ผ์ด๋๋ง๋ค ๋ ๋ฆฝ ๊ฒ์ฆํ๊ณ ์์ ํ๋ค.
Configure oh-my-harness settings (features, thresholds, model routing, multi-agent)
Create a native Claude Code team with configured teammates and task assignments
Check status of the active native Claude Code team (teammates, tasks, progress)
| name | harness-setup |
| description | Initialize oh-my-harness in the current project (plugin mode) |
| level | 2 |
Initialize oh-my-harness for the current project. This is the plugin equivalent of oh-my-harness init.
When this skill is invoked, immediately execute the workflow below.
In plugin mode, hooks and CLAUDE.md are already provided by the plugin system automatically. This setup only creates the project-level configuration file.
Check if .claude/.omh/harness.config.json exists.
Run the duck ASCII art to greet the user:
bash "$CLAUDE_PLUGIN_ROOT/lib/duck.sh" 2>/dev/null || bash "$(dirname "$(realpath "$0")")/../../lib/duck.sh" 2>/dev/null || true
Output the following message (adapt naturally, keep it concise and friendly):
Welcome to oh-my-harness!
Smart defaults for Claude Code โ test enforcement, guard rails,
convention detection, and model routing, all in one harness.
Let's set up your project in a few quick steps.
Ask the user the following questions using AskUserQuestion (ask all at once):
Question 1 โ Installation Scope
"์ค์น ๋ฒ์๋ฅผ ์ ํํด์ฃผ์ธ์."
.claude/settings.local.json โ ์ด ํ๋ก์ ํธ์๋ง ์ ์ฉ~/.claude/settings.json โ ๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ฉQuestion 2 โ Project Detection
"ํ๋ก์ ํธ ์ปจ๋ฒค์ ์ ์๋ ๊ฐ์งํ ๊น์?"
Question 3 โ Feature Profile
"์ด๋ค ๊ธฐ๋ฅ ํ๋กํ์ ์ฌ์ฉํ ๊น์?"
Question 4 โ Commit Convention
"์ปค๋ฐ ๋ฉ์์ง ์ปจ๋ฒค์ ์?"
type(scope): description๐จ descriptionQuestion 5 โ Weight Routing & ๊ฒ์ฆ (๋ฌด๊ฒ ๋น๋ก ํ๋ค์ค)
"์์ ๋ฌด๊ฒ(Tier)์ ๋ฐ๋ผ ๊ฒ์ฆ ๊ฐ๋๋ฅผ ์๋ ์กฐ์ ํ ๊น์? Tier 3(๋ฌด๊ฑฐ์ด ์์ )์ ์๋ฃ ์
/omh-verifyN-๋ผ์ด๋ ๋ ๋ฆฝ๊ฒ์ฆ์ ๊ฐ์ ํฉ๋๋ค."
/omh-verify๋ Claude ์ธ์ GPT(codex)ยทGemini๋ฅผ ๋
๋ฆฝ ๊ฒ์ฆ์๋ก ๋กํ
์ด์
ํ ์ ์์ต๋๋ค. ์ค์น ์ฌ๋ถ๋ฅผ ๊ฐ์ง:
which codex >/dev/null 2>&1 && echo "codex: โ" || echo "codex: โ"
which gemini >/dev/null 2>&1 && echo "gemini: โ" || echo "gemini: โ"
๊ฐ์ง๋ CLI๊ฐ ์์ผ๋ฉด AskUserQuestion์ผ๋ก ์ ์:
"GPT/Gemini๋ ๋ ๋ฆฝ ๊ฒ์ฆ์ ๋ฃ์๊น์? (๊ฐ์ง๋จ: {codex, gemini ์ค ์ค์น๋ ๊ฒ})"
์ ํ์ ๋ฐ๋ผ verify.lenses ๋ฐฐ์ด์ ๊ตฌ์ฑํ๋ค(๋ฏธ์ค์น ๋ชจ๋ธ์ ์ ์ธ). ๋ ๋ค ์์ผ๋ฉด ์ด ์ง๋ฌธ์ ๊ฑด๋๋ฐ๊ณ Claude ๋จ๋
์ผ๋ก ๋์ํ๋ค(graceful degrade).
Based on the user's answers:
Project scope selected โ Config and hooks target .claude/settings.local.json (this project only)
User scope selected โ Config stays in .claude/.omh/ but hooks are registered in ~/.claude/settings.json (applies to all projects)
Auto-detect selected โ Run convention detection (scan project root for package.json, pyproject.toml, go.mod, Cargo.toml, build.gradle, pom.xml) and save to .claude/.omh/conventions.json
Manual selected โ Ask for language, test framework, linter, formatter, build tool
Full profile โ Use all default features as-is
Minimal profile โ Set all features to false except: testEnforcement, dangerousGuard, commitConvention, autoGitignore
Custom profile โ Ask the user which features to enable using AskUserQuestion with multiSelect
Commit convention โ Set commitConvention.style to the chosen value (auto, conventional, gitmoji)
mkdir -p .claude/.omh
Write the config to .claude/.omh/harness.config.json with the user's choices merged into the following default template.
IMPORTANT: Feature keys MUST match exactly โ hooks read these exact names.
{
"version": 1,
"features": {
"conventionSetup": true,
"testEnforcement": true,
"contextOptimization": true,
"autoPlanMode": true,
"ambiguityDetection": true,
"dangerousGuard": true,
"contextSnapshot": true,
"commitConvention": true,
"scopeGuard": false,
"usageTracking": true,
"autoGitignore": true,
"weightRouting": true
},
"testEnforcement": { "minCases": 2, "promptOnMissing": true },
"modelRouting": { "quick": "haiku", "standard": "sonnet", "complex": "opus" },
"autoPlan": { "threshold": 3 },
"ambiguityDetection": { "threshold": 2, "language": "auto" },
"commitConvention": { "style": "auto" },
"scopeGuard": { "allowedPaths": [] },
"multiAgent": { "maxAgents": 4, "useWorktree": true, "tmuxSession": "omh-agents" },
"tier3": { "taskThreshold": 5, "fileThreshold": 5, "domainKeywords": [] },
"verify": {
"rounds": 3,
"stopWhenClean": true,
"autoFix": false,
"lenses": [
{ "model": "claude", "via": "native-subagent", "focus": "correctness" },
{ "model": "gpt", "via": "codex", "cmd": "codex exec", "focus": "convention" },
{ "model": "gemini", "via": "gemini", "cmd": "gemini -p --approval-mode plan", "focus": "regression" }
]
}
}
weightRouting์ ํ์ ๋ฐ๋ผfeatures.weightRouting๋ฅผ ํ ๊ธํ๊ณ , Question 5 / ๋ชจ๋ธ ๊ฐ์ง ๊ฒฐ๊ณผ๋กverify.rounds,verify.autoFix,verify.lenses๋ฅผ ๊ตฌ์ฑํ๋ค. Tier3์domainKeywords์ ํ๋ก์ ํธ ํต์ฌ ๋๋ฉ์ธ(์: ๊ฒฐ์ ยท๋งค์ถ ๊ด๋ จ ์ฉ์ด)์ ๋ฃ์ผ๋ฉด ํด๋น ์์ ์ด ์๋์ผ๋ก Tier 3๋ก ๋ถ๋ฅ๋๋ค.
false except: testEnforcement, dangerousGuard, commitConvention, autoGitignoreif ! grep -q '.claude/.omh/' .gitignore 2>/dev/null; then
echo -e "\n# oh-my-harness\n.claude/.omh/" >> .gitignore
fi
Register the oh-my-harness HUD in the user's Claude Code settings.
IMPORTANT: $CLAUDE_PLUGIN_ROOT is NOT available in statusLine context (it's a global setting, not a plugin hook). Use a dynamic path lookup instead.
Write the statusLine config to ~/.claude/settings.json:
{
"statusLine": {
"type": "command",
"command": "bash -c 'node \"$(ls ~/.claude/plugins/cache/oh-my-harness/*/*/hud/omh-hud.mjs 2>/dev/null | head -1)\"'"
}
}
If statusLine is already set to a non-harness value, ask the user before overwriting.
Show the duck one more time, then output:
oh-my-harness is ready!
Scope : {Project|User (Global)}
Project : {language} | test: {testFramework} | lint: {linter} | fmt: {formatter}
Config : .claude/.omh/harness.config.json
Features : {N} active ({disabled features list})
Commit : {commitStyle}
Weight : {weightRouting on/off} | verify {rounds}๋ผ์ด๋, autoFix {on/off}
Verifiers: {claude (+gpt) (+gemini) โ ๊ฐ์งยท์ ํ๋ ๋ชจ๋ธ}
HUD : enabled (restart Claude Code to see status line)
Hooks are provided automatically by the plugin.
Use /set-harness to change settings anytime.
If .claude/.omh/harness.config.json already exists:
If "Reset to defaults" is chosen, delete the existing config and run the First-Time Welcome flow above.
settings.local.json โ hooks come from hooks/hooks.jsonCLAUDE.md โ the root CLAUDE.md is injected by the plugin system