{"id":49960157,"url":"https://github.com/ecro/harness-maker","last_synced_at":"2026-05-24T01:05:17.369Z","repository":{"id":358466504,"uuid":"1228139549","full_name":"Ecro/harness-maker","owner":"Ecro","description":"A harness that knows your project — and stays that way. Interview-shaped, grade-gated, self-evolving AI coding harness for Claude Code · Cursor · Codex. Project profiler + 10-dim interview, auto-fix grade-gated review, block-merge edit preservation, anti-rot crawlers, worktree isolation.","archived":false,"fork":false,"pushed_at":"2026-05-17T15:02:37.000Z","size":2692,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-17T15:54:52.957Z","etag":null,"topics":["ai-coding","claude-code","code-review","codex","cursor","developer-tools","llm-harness","multi-ide","personalization","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/harness-maker/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ecro.png","metadata":{"files":{"readme":"README.ko.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T16:41:06.000Z","updated_at":"2026-05-17T15:02:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Ecro/harness-maker","commit_stats":null,"previous_names":["ecro/harness-maker"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/Ecro/harness-maker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ecro%2Fharness-maker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ecro%2Fharness-maker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ecro%2Fharness-maker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ecro%2Fharness-maker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ecro","download_url":"https://codeload.github.com/Ecro/harness-maker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ecro%2Fharness-maker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33162446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"online","status_checked_at":"2026-05-18T02:00:06.436Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-coding","claude-code","code-review","codex","cursor","developer-tools","llm-harness","multi-ide","personalization","python"],"created_at":"2026-05-18T02:01:48.870Z","updated_at":"2026-05-24T01:05:17.358Z","avatar_url":"https://github.com/Ecro.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Ecro/harness-maker/main/docs/assets/brand-block.png\" alt=\"harness-maker\" width=\"720\"\u003e\n\u003c/p\u003e\n\n# harness-maker\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org)\n[![Claude Code plugin](https://img.shields.io/badge/Claude_Code-plugin-orange)](https://code.claude.com)\n[![Cursor 2.4+ (3.2+ rec)](https://img.shields.io/badge/Cursor-2.4%2B_(3.2%2B_rec)-black)](https://cursor.com)\n[![Built with uv](https://img.shields.io/badge/built_with-uv-261230.svg)](https://docs.astral.sh/uv/)\n\n[English](https://github.com/Ecro/harness-maker/blob/main/README.md) · **한국어**\n\n\u003e **프로젝트마다 다른 하네스 — 당신 프로젝트로부터 빚어지고, 절대 generic 하지 않습니다.**\n\n**프로젝트별 개인화** · 등급 게이트 · 자가 진화 · 멀티 IDE\n\n[왜?](#왜-harness-maker) ·\n[어떻게 맞춰지나](#어떻게-내-프로젝트에-맞춰지나) ·\n[빠른 시작](#빠른-시작) ·\n[특장점](#특장점) ·\n[Comparison](README.md#how-it-compares) ·\n[Configuration](README.md#configuration) ·\n[Targets](README.md#targets) ·\n[FAQ](README.md#faq) ·\n[Roadmap](README.md#roadmap) ·\n[Deep dive](docs/HOW-IT-WORKS.md)\n\n---\n\n## 30초 만에 시도하기\n\nClaude Code · Cursor · Codex CLI 중 하나의 AI 에이전트에 아래 프롬프트를 붙여넣으세요. **프로파일러가 12개 이상의 스택 신호를 읽고 10차원 인터뷰가 당신 프로젝트 전용 하네스를 합성합니다** — generic 템플릿이 아닙니다. IDE를 자동 감지하고, harness-maker 를 Bash로 설치한 뒤, 인터뷰를 진행하고 personalization tier 리포트까지 출력합니다.\n\n```\nInstall harness-maker for this project and bootstrap the harness end-to-end.\n\nYou are an AI agent running inside Claude Code, Cursor, or Codex CLI.\nDetect which one (silently — don't ask me), install harness-maker via\nBash (NOT slash commands typed by me), then invoke harness-maker:make and\nhm:health via the Skill tool. Conduct the conversation in the language of\nmy first reply.\n\nInstall path per IDE:\n  Claude Code:  Bash  claude plugin marketplace add Ecro/harness-maker\n                Bash  claude plugin install harness-maker@harness-maker\n                Then tell me: \"Type /reload-plugins, then send any short message (e.g. `go`) to re-trigger me.\"\n  Cursor:       Bash  git clone --depth 1 https://github.com/Ecro/harness-maker.git ~/.cursor/plugins/local/harness-maker\n                Then tell me: \"Reload the Cursor window (Ctrl+Shift+P → Reload Window).\"\n  Codex CLI:    Codex has no native marketplace install for this plugin.\n                Use one of these two install paths via Bash:\n                A. If `claude` CLI is on PATH (Codex coexisting with Claude Code):\n                     Bash  claude plugin marketplace add Ecro/harness-maker\n                     Bash  claude plugin install harness-maker@harness-maker\n                B. Otherwise install via PyPI:\n                     Bash  uv tool install harness-maker\n                After install, the Skill tool not yet populated with\n                harness-maker:make on Codex first-run — `.agents/skills/`\n                are generated BY the make step itself. Run the FIRST make\n                via Bash directly:\n                     Bash  harness-maker make\n                Subsequent invocations (and hm:health) become available\n                to the Skill tool after this initial Bash-run populates\n                `.agents/skills/`.\n\nAfter install, run harness-maker:make (drive the interview — accept defaults\nunless I object), then hm:health (read out the personalization tier and top\naction items).\n```\n\n긴 형식 (IDE별 사용자 액션 수, Bash 권한 주의사항, 수동 설치 fallback)은 영문 [Quickstart](README.md#quickstart) 참조.\n\n---\n\n## 왜 harness-maker?\n\n대부분의 AI 코딩 도구는 범용 템플릿에서 시작합니다 — 모든 프로젝트에 같은 reviewer, 모든 스택에 같은 프롬프트, 아무도 다시 손보지 않는 default. harness-maker는 정반대로 갑니다: **하네스가 당신의 프로젝트에 의해 빚어지고, 프로젝트가 변해도 그 모양을 유지합니다.**\n\n| | 원칙 | 실제 의미 |\n|--|---|---|\n| 🎯 | **개인화 (Personalized)** | 프로파일러가 12개 이상의 스택/프레임워크/CI 신호를 읽음. 인터뷰가 10개 이상의 차원을 lock. `Side` 실험과 `Production` 서비스는 **구조적으로 다른** 하네스를 받음 — 다른 reviewer 셋, 다른 워크플로 stage, 다른 보안 게이트. 범용 default가 조용히 깔리는 일 없음. |\n| 🛡️ | **신뢰 (Trusted)** | 모든 `/hm:execute`는 fresh worktree + TDD 루프. `/hm:review`는 보고만 하지 않음 — consensus-passed fix를 적용하고 등급 ≥ A까지 재리뷰. Mechanical check (lint/test)가 LLM reviewer가 토큰 쓰기 전에 게이트. |\n| 🌱 | **자기진화 (Self-evolving)** | agent, skill, CLAUDE.md 어디든 손편집 — block-merge 마커가 `--update` 너머에서도 보존. 메모리가 프로젝트 고유 패턴을 축적; 반복되는 실패는 새 가드레일을 자동 제안. |\n| 🌀 | **무방부패 (Anti-rot)** | 4개 소스 주간 크롤 (Anthropic, GitHub releases, arXiv, OSV CVE). 사용자 accept/reject 이력으로 적응형 relevance filter. 항상 수동 확인 — silent auto-apply 경로는 존재하지 않음. |\n| 🎛️ | **다중 IDE (Multi-IDE)** | Claude Code + Cursor + Codex. 한 개의 `harness.yaml`, 세 개의 target-native 렌더. 기존 Cursor rules / Aider 설정 / Copilot instructions는 첫 실행에서 흡수 — 수동 포팅 0. |\n\n---\n\n## 어떻게 내 프로젝트에 맞춰지나\n\n```\n감지 (SENSE)  →  결정 (DECIDE)  →  렌더 (RENDER)  →  진화 (EVOLVE)\n```\n\n네 단계. 각 단계가 harness-maker가 당신을 위해 답하는 질문입니다 — 한 번, 그리고 계속.\n\n### 1. 감지 (SENSE) — *이건 어떤 프로젝트인가?*\n\n프로파일러가 묻기 전에 먼저 구체적 신호를 스캔합니다. 각 감지는 **confidence** (HIGH / MEDIUM / LOW)로 태깅되어, default가 silent 적용될지, 프롬프트로 물어볼지, 건너뛸지 결정합니다.\n\n| 신호 | 감지 출처 |\n|---|---|\n| **Stack** (12개 이상) | `pyproject.toml`, `package.json`, `Cargo.toml`, `go.mod`, `pubspec.yaml`, … + 확장자 개수 |\n| **Scale** | 소스 파일 총 개수, 모노레포 depth, `apps/` 또는 `packages/` 존재 |\n| **Lifecycle** | Git commit velocity, branch protection 규칙, CI 워크플로 존재 |\n| **Frameworks** | React / Vue / FastAPI / Django / Tauri / Zephyr / Next.js / Tailwind / Pydantic … (의존성 파싱, 키워드 추측 아님) |\n| **Package manager** | uv · poetry · pnpm · yarn · cargo · go mod · gradle · maven |\n| **CI provider** | GitHub Actions · GitLab CI · CircleCI · Bitbucket Pipelines |\n| **외부 AI 설정** | 기존 `.cursor/rules/`, `AGENTS.md`, `CLAUDE.md`, `.continue/`, `.aider.conf.yml`, `.github/copilot-instructions.md` |\n\n\u003e **결과:** 24시간 캐시된 `ProjectProfile`. 인터뷰 전에 `harness-maker profile . --json`으로 확인 가능.\n\n---\n\n### 2. 결정 (DECIDE) — *이 프로젝트엔 어떤 하네스가 필요한가?*\n\n짧은 인터뷰가 모든 하류 렌더에 영향을 주는 차원들을 lock합니다. 재실행 시 이전 답변을 silent 재사용; 명시적 `--reinterview`로 재질문.\n\n| 차원 | 선택지 | 영향 |\n|---|---|---|\n| **Preset** | `Side` · `Production` | Reviewer 개수 (1 vs 5), 워크플로 stage 수, 보안 게이트 깊이, verify-required 플래그 |\n| **Dev mode** | `task-driven` · `spec-driven` | SPEC stage가 필수인지 여부; plan stage가 execute로 chain 되는지 |\n| **Targets** | `claude-code` · `cursor` · `codex` (다중 선택) | 어떤 IDE-native 자산 트리가 렌더되나 |\n| **Locale** | `en` · `ko` · 임의 태그 | 인터뷰 텍스트 + 사용자 대면 에러 메시지 |\n| **Workflows** | Atomic stage의 fused 시퀀스 | 어떤 `/hm:\u003cname\u003e` 슬래시 명령이 나타나나 |\n| **Reviewers / skills** | Preset default + 오버라이드 | 어떤 agent와 skill이 설치되나 |\n| **Ref folders** | 경로 + glob 쌍 | `refdocs-search` skill로 검색 가능한 외부 문서 |\n| **Sibling repos** | 상대 경로 | 같은 하네스 세션을 공유할 인접 repo |\n| **Second Brain** | Obsidian vault 경로 + project_id | 세션 간 메모리가 쓰여지는 곳 |\n| **Recommended model** | 기본 `claude-opus-4-7` | 생성된 모든 agent의 model frontmatter |\n\n\u003e **결과:** `.claude/harness.yaml` — 업그레이드를 견디는 single source of truth.\n\n---\n\n### 3. 렌더 (RENDER) — *이게 어떻게 작동하는 하네스가 되나?*\n\n하나의 source tree, 세 개의 IDE-native 렌더, 모두 단일 `harness.yaml`에서:\n\n```\n.claude/                 ← 단일 source: agents, skills, commands/hm/, hooks, memory, observability\n├── .cursor/             ← + Cursor-native rules, hooks, mcp.json    (cursor target일 때)\n├── .codex/              ← + Codex-native config.toml, agent TOML들   (codex target일 때)\n├── AGENTS.md            ← + Codex root instructions                  (codex target일 때)\n└── .agents/skills/      ← + Codex skill 경로                          (codex target일 때)\n```\n\n기본 렌더 위에 레이어링:\n\n- **Domain packs** — `--add-domain python` (또는 `node`, `rust`)이 스택별 표준, agent, skill을 하네스에 그래프트. 커스텀 domain은 스텁으로 생성.\n- **외부 설정 흡수** — 기존 Cursor rules, Aider 설정, Copilot instructions를 LLM이 `harness.yaml` 축으로 번역. `@hm:harness:*` inverted 마커가 재렌더 시에도 동기화 유지.\n- **Sibling repos** — frontend + backend + library가 `harness.yaml`의 상대 경로 바인딩으로 한 세션을 공유. 머신 간 portable.\n- **Ref folders + Second Brain** — 등록된 프로젝트 문서 + Obsidian vault 노트가 어떤 stage에서든 검색 가능.\n\n\u003e **결과:** 사용하는 모든 IDE가 같은 agent, 같은 skill, 같은 워크플로를 native로 봄. 수동 포팅 0.\n\n---\n\n### 4. 진화 (EVOLVE) — *어떻게 계속 유용하게 남나?*\n\n세 개의 독립 피드백 루프가 프로젝트가 성장해도 하네스가 프로젝트에 정렬된 상태를 유지합니다.\n\n**A. 내 편집이 업그레이드를 견딘다.**\n`agents/code-reviewer.md`를 손편집하세요. 커스텀 skill을 추가하세요. CLAUDE.md 섹션을 고치세요. 모두 `harness-maker make --update`를 견딥니다 — 파일별 content hash + `@hm:user:*` block-merge 마커가 사용자 편집과 템플릿 소유 영역을 구분하기 때문. `@hm:harness:*` inverted 마커는 반대 (외부 설정용: 바깥은 보존, 안쪽은 교체).\n\n**B. 하네스가 프로젝트를 학습한다.**\n- `.claude/memory/wiki.md` — 패턴, 규약, 함정. 매 `/hm:wrapup`에서 새 항목 추가.\n- `.claude/memory/failures.md` — 반복되는 실수, slug + count로 dedup.\n- `.claude/memory/session/\u003cdate\u003e.md` — 작업일별 non-obvious 결정사항.\n- 어떤 failure slug라도 **count ≥ 3**에 도달하면, wrapup이 `pending-proposals.md`에 제안을 작성 — 그 재발을 막을 수 있었을 새 skill / rule / hook. 사용자가 검토하고 ingest 여부 결정.\n\n**C. Default가 내 오버라이드에 적응한다.**\n오버라이드 텔레메트리 (100% 로컬)가 default 변경마다 추적. `/hm:health`가 세 레이어 — 감지→권장 전환율, 오버라이드 안정성, 감사 주기 — 를 점수화하여 **Bronze → Silver → Gold → Platinum** tier를 산출, 순위가 매겨진 action item을 함께 surface. 하네스가 실제 사용 패턴에서 너무 벗어나면 audit이 어떤 default가 잘못됐는지 정확히 알려줍니다.\n\n\u003e **결과:** 하네스가 프로젝트와 함께 개선됨, 프로젝트에 거슬리지 않음. 이미 결정한 사항이 silent 재논의되는 일 없음.\n\n각 단계의 메커니즘 — 전체 절차, 결정 경로, 내부 invariant — 는 [**docs/HOW-IT-WORKS.md**](docs/HOW-IT-WORKS.md) 참조.\n\n---\n\n## 빠른 시작\n\n### Universal Bootstrap Prompt\n\n\u003e **AI 에이전트에 paste 하세요 — 현재 IDE (Claude Code / Cursor / Codex)를 감지해서\n\u003e 해당 IDE의 plugin install 을 Bash로 실행하고 (사용자가 슬래시 명령을 칠 필요 없음)\n\u003e 하네스까지 부트스트랩합니다.** 한 번의 paste, 모든 지원 IDE 대응.\n\n**IDE 별 사용자 액션 수** (나머지는 AI 가 처리):\n\n| IDE | Paste | 타이핑할 슬래시 | GUI / restart 액션 | 총 액션 |\n|---|---|---|---|---|\n| **Claude Code** | 1 | 1 (`/reload-plugins`) | 짧은 메시지 1개 (예: `go`) — Claude re-trigger 용 | **3** |\n| **Cursor** | 1 | 0 | 1 (`Ctrl+Shift+P → Reload Window`) | **2-3** |\n| **Codex CLI** | 1 | 0 | 0 (Codex reload 불필요 — `.codex/` 자산은 `make` 가 생성, plugin 이 아님) | **2** |\n\n\u003e **Codex CLI install path.** harness-maker 는 현재 native Codex marketplace 등록이 없습니다. 이 repo 를 Codex marketplace 로 등록하면 marketplace root 는 받아들이지만, 후속 `codex plugin add` 는 \"plugin not found\" 로 실패합니다. AI 는 Claude Code marketplace (`claude` CLI 가 PATH 에 있을 때) 또는 PyPI (`uv tool install harness-maker`) 로 설치해야 함 — 두 경로 모두 디스크에 동일한 `.codex/` 산출물을 생성합니다.\n\n\u003e **첫 사용 시 Bash 승인 가이드.** Claude Code / Cursor / Codex CLI 가 아래 prompt 의 install 명령에 대해 Bash 권한을 요청. prompt 에 명시된 **정확한 명령만** 승인 (`claude plugin install harness-maker@harness-maker`, `git clone --depth 1 https://github.com/Ecro/harness-maker.git ~/.cursor/plugins/local/harness-maker`, 또는 `uv tool install harness-maker`). **`Bash(*)` 전체 허용은 거부** — AI 가 다른 명령을 요청하면 중지하고 검토 (특히 `codex plugin …` 변형은 현재 작동하지 않음). Cursor clone 은 public repo 의 현재 `main` 브랜치를 받고 이후 `git pull` 업데이트는 무결성 검증되지 않음 — threat model 에 따라 release tag 수동 pin 권장.\n\n```\nInstall harness-maker for this project and bootstrap the harness end-to-end.\n\nYou are an AI agent running inside one of: Claude Code, Cursor, or Codex CLI.\nDetect which one (silently — do NOT ask me), run the matching plugin install\nvia Bash (NOT slash commands typed by me), then invoke harness-maker:make\nand hm:health via the Skill tool.\n\nStep 1 — Detect the host IDE (silent):\n  - Claude Code  → $CLAUDE_CODE is set, or ~/.claude/ exists, or you have\n                   the Bash tool with access to the `claude` CLI\n  - Cursor       → $CURSOR_SESSION is set, or ~/.cursor/ exists, or you have\n                   Cursor's plugin manager available\n  - Codex CLI    → $CODEX_SESSION is set, or ~/.codex/ exists, or the\n                   `codex` command is on PATH\n\nStep 2 — Install harness-maker as a plugin via Bash (skip when the\nharness-maker:make skill is already available):\n\n  IF Claude Code:\n    Bash: claude plugin marketplace add Ecro/harness-maker\n    Bash: claude plugin install harness-maker@harness-maker\n    Then tell me verbatim: \"Type /reload-plugins, then send any short message (e.g. `go`) to re-trigger me.\"\n\n  IF Cursor:\n    Bash: git clone --depth 1 https://github.com/Ecro/harness-maker.git ~/.cursor/plugins/local/harness-maker\n    Then tell me verbatim: \"Reload the Cursor window now (Ctrl+Shift+P → Reload Window).\"\n\n  IF Codex CLI:\n    Codex has no native marketplace install for this plugin\n    (registering this repo as a Codex marketplace accepts the\n    marketplace root, but the subsequent `codex plugin add` fails\n    with \"plugin not found\"). Pick whichever install path works\n    on this machine:\n    A. If `claude` CLI is on PATH (Codex coexists with Claude Code):\n       Bash: claude plugin marketplace add Ecro/harness-maker\n       Bash: claude plugin install harness-maker@harness-maker\n    B. Otherwise install via PyPI:\n       Bash: uv tool install harness-maker\n    After install, the Skill tool not yet populated with\n    harness-maker:make on Codex first-run — `.agents/skills/` are\n    generated BY the make step itself. Run the FIRST make via Bash:\n       Bash: harness-maker make\n    Subsequent invocations (and hm:health) become Skill-tool-available\n    once `.agents/skills/` exists.\n\n  IF you can't tell which IDE (or none of the above), STOP and ask me which\n  IDE you're in.\n\nStep 3 — After I confirm the reload (Claude Code / Cursor only — Codex\nneeds no reload; for Codex, proceed immediately after install), invoke\nharness-maker:make via the Skill tool (do NOT ask me to type any slash\ncommand) and drive the interview:\n  • Confirm preset (Side / Production), dev mode, target IDEs, and locale.\n  • Accept the recommended defaults unless I object.\n\nStep 4 — After harness-maker:make finishes, invoke hm:health via the Skill tool\n(again, do NOT ask me to type it):\n  Produces a 3-section dashboard at .claude/observability/dashboard.md\n  (structural / external-risks / personalization). Tell me the personalization\n  tier and any high-priority action items.\n\nConduct the conversation in the language of my first reply; default to English\nif you cannot tell.\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e수동 설치 — IDE에 맞는 한 가지 선택\u003c/strong\u003e\u003c/summary\u003e\n\n#### Claude Code (plugin marketplace)\n\n```\n/plugin marketplace add Ecro/harness-maker\n/plugin install harness-maker@harness-maker\n```\n\n이 repo가 marketplace metadata와 plugin 본체를 모두 담고 있어서 두 줄로 끝. Claude Code 재시작 후 `/harness-maker:make` 활성화.\n\n#### Codex CLI (native marketplace 미지원 — Claude Code 또는 PyPI 사용)\n\n**Codex CLI 는 현재 harness-maker 의 native 설치를 지원하지 않습니다.** 이 repo 를 Codex marketplace 로 등록 (`codex plugin marketplace add ...`) 하면 marketplace root 는 받아들이지만, 후속 `codex plugin add harness-maker@harness-maker` 는 `plugin 'harness-maker' was not found in marketplace 'harness-maker'` 로 실패합니다 (repo 가 Codex `marketplace.json` 을 ship 하지 않음). `.codex-plugin/plugin.json` 의 plugin manifest 는 future native install 을 위한 stub 입니다 — **현재는 의존하지 마세요**.\n\nCodex CLI 사용자에게 가능한 두 가지 install path:\n\n**A. Claude Code marketplace (Claude Code 가 로컬에 설치되어 있다면):**\n\n```bash\nclaude plugin marketplace add Ecro/harness-maker\nclaude plugin install harness-maker@harness-maker\n```\n\nPython 소스가 `~/.claude/plugins/cache/harness-maker-local/` 에 install 됨. `harness-maker make` 가 사용 가능해지고, 그 install 을 참조하는 `.codex/` 산출물을 렌더합니다. 이게 canonical install path — Claude Code 와 Cursor 사용자와 동일한 source-of-truth.\n\n**B. PyPI (Codex-only, Claude Code 구독 불필요):**\n\n```bash\nuv tool install harness-maker\n```\n\n`uv` 로 `harness-maker` CLI 가 설치되고, `harness-maker make` 가 `.codex/` 산출물을 렌더합니다. Claude Code 없이 Codex CLI 만 쓰는 사용자에게 적합한 path.\n\n설치 후, 두 경로 모두 `harness-maker make` 가 entry point — Codex plugin reload 단계 없음.\n\n#### Cursor (Team marketplace 임포트 또는 local symlink)\n\nCursor의 공식 plugin marketplace는 큐레이션 방식 ([cursor.com/marketplace/publish](https://cursor.com/marketplace/publish), submit-and-review)이고 GitHub 직접 install은 Cursor 2.5+ 로드맵상 미지원. 현재 동작하는 두 경로:\n\n**A. Team marketplace (Team / Enterprise plan):**\nDashboard → Settings → Plugins → Team Marketplaces → Import → `https://github.com/Ecro/harness-maker` 붙여넣기 → 팀원에게 푸시.\n\n**B. Local 개발 install (커뮤니티 패턴):**\n\n```bash\ngit clone https://github.com/Ecro/harness-maker.git ~/.cursor/plugins/local/harness-maker\n```\n\nCursor 재시작 (Ctrl+Shift+P → \"Reload Window\")으로 plugin 인식.\n\n#### PyPI (IDE plugin 미사용 — CI / headless / 스크립트)\n\nIDE plugin 경로가 맞지 않을 때 (CI 스크립트, headless 서버, 자동화, 또는 Python CLI 도구 선호):\n\n```bash\nuv tool install harness-maker          # POSIX / macOS / WSL\n# Native Windows / PowerShell:\nirm https://astral.sh/uv/install.ps1 | iex\nuv tool install harness-maker\n```\n\n이후:\n\n```bash\ncd your-project\nharness-maker profile . --json\nharness-maker make . --preset Production --locale ko --targets claude-code,cursor\n```\n\n일회성 렌더는 가능하지만, IDE 내 슬래시 명령 (`/hm:health`, `/hm:plan`, `/hm:execute` 등)은 IDE plugin이 로드해야 나타납니다.\n\n\u003c/details\u003e\n\n하네스 렌더 이후 플래그로 진화:\n\n```bash\nharness-maker make . --audit           # 기존 .claude/ 를 rubric 으로 채점\nharness-maker make . --add NAME        # 단일 skill/agent/command 추가\nharness-maker make . --remove NAME     # 외과적 컴포넌트 제거\nharness-maker make . --promote NAME    # ad-hoc 자산을 하네스로 승격\n```\n\n---\n\n## 특장점\n\n무엇이 컴포넌트인지가 아니라, 그것이 **당신의 프로젝트에 무엇을 해주는지**로 그룹화.\n\n### 🎯 개인화 — *프로젝트에 맞춰진다*\n\n- **프로젝트로 빚어진 하네스.** 프로파일러 + 10차원 인터뷰가 Side 실험과 Production 서비스에 **구조적으로 다른** 하네스를 생성. Reviewer 개수, 워크플로 stage, 보안 게이트 깊이, mechanical-check 강제 — 모두 답변에서 파생.\n- **12+ 스택 감지.** Python · Node · Rust · Java · Kotlin · Swift · Dart · Ruby · PHP · C# · Elixir · Scala · C/C++ · Zig · Haskell. Framework + package-manager + CI provider는 manifest에서 파싱 (키워드 추측 X). manifest mtime 기반 24시간 캐시.\n- **Confidence 기반 default.** 모든 감지가 HIGH/MEDIUM/LOW confidence 선언. HIGH → `# detected:` provenance와 함께 silent default. MEDIUM → 명시적 인터뷰 프롬프트. LOW → 건너뜀 (당신이 결정). Regression 테스트가 minor 버전 간 surprise silent default 변화를 방지.\n- **적응형 개인화 tier.** `/hm:health`가 세 레이어 (감지→권장 전환율, 오버라이드 안정성, 감사 주기)를 점수화하여 Bronze → Silver → Gold → Platinum tier 보고. 한 axis가 5+ 회 오버라이드되면 default 변경 자동 제안. 100% 로컬 텔레메트리 — 프로젝트 밖으로 나가는 데이터 없음.\n- **Domain packs.** `--add-domain python` (또는 `node`, `rust`)이 스택별 표준, agent, skill을 그래프트. 커스텀 domain은 스텁으로 — 팀이 자기 것을 추가하는데 harness-maker fork 불필요.\n- **단일 명령, subcommand 폭증 없음.** `/harness-maker:make`가 유일한 진입점. 나머지는 모두 플래그 (`--audit`, `--add`, `--remove`, `--promote`, `--add-domain`, `--reinterview`, `--update`).\n\n### 🛡️ 신뢰 — *등급 게이트된 작업*\n\n- **등급 기반 auto-fix 루프.** `/hm:review`는 보고만 하지 않음. Consensus-passed fix 적용 → 재리뷰 (selective, 스코프 닿은 reviewer만 재spawn) → 재채점, 등급 ≥ threshold (기본 A) 또는 `max_review_rounds` 소진까지. Weak-consensus와 manual-only는 절대 auto-apply 안 됨.\n- **LLM 토큰 전에 mechanical pre-check.** Lint clean + tests green이 reviewer가 spawn 되기 **전에** 강제. 첫 non-zero exit이 `## MECHANICAL_BLOCK: \u003ccmd\u003e exit=\u003cN\u003e`을 emit하고 halt. `--no-auto-fix`가 이 게이트를 우회하지 않음.\n- **Conditional reviewer routing.** `.env` 변경 → security-reviewer. `/perf/` → performance-reviewer. `.tsx` → ux-reviewer. async/locking → concurrency-reviewer. 모든 diff에 모든 reviewer fan-out 보다 10× 저렴.\n- **2-pass redaction (+47pp 정밀도).** Pass 1이 PR 메타데이터를 제거하여 finding이 author/title에 anchor되지 못하게. Pass 2가 전체 컨텍스트 복원 — reviewer가 각 Pass 1 finding을 validate 또는 drop. Anchoring 취약 diff에 대한 ablation 측정된 정밀도 증가.\n- **7개 보안 게이트.** `secrets` · `permissions` (settings.json over-grant) · `hook-injection` (`rm -rf`, `curl|sh`, `eval`에 대한 AST 스캔) · `CVEs` (OSV.dev) · `hallucination` (존재하지 않는 import에 대한 AST 스캔) · `prod-name guard` · `prompt-injection`. Finding은 `.claude/observability/security/`에 로컬로만.\n- **Privilege separation.** Reviewer agent는 `Write` / `Edit` / interpreter `Bash` 호출 deny. Executor agent는 `.worktrees/**` 쓰기만 allow + 시스템 경로에 대한 Edit/Write 페어 deny. Defense-in-depth가 prompt injection, agent compromise, tool_input poisoning을 모두 견딤.\n- **Per-run worktree 격리.** 모든 execute가 fresh `git worktree`에서 실행. 실패한 run은 증거 보존; 성공한 run은 prefix-match로 auto-cleanup (Cursor 자체 worktree는 절대 건드리지 않음).\n\n### 🌱 자기진화 — *프로젝트와 함께 성장한다*\n\n- **Block-merge 보존.** 어떤 agent, skill, CLAUDE.md 섹션이든 손편집. `--update`를 견딤 — 파일별 content hash + `@hm:user:*` 마커가 사용자 편집과 템플릿 소유 영역을 분리하기 때문. `@hm:harness:*` inverted 마커는 외부 설정 흡수용으로 반대 동작.\n- **3-tier 메모리 축적.** `wiki.md` (패턴) · `failures.md` (slug 기반 dedup된 반복 실수) · `session/\u003cdate\u003e.md` (non-obvious 결정). Wrapup이 자동으로 쓰고, 모든 stage가 자동으로 읽음.\n- **자기개선 failure 제안.** `[fail:*]` slug가 세션 간 3× 재발하면, wrapup이 `pending-proposals.md`에 제안 작성 — 그 재발을 막을 수 있었을 새 skill / rule / hook. 검토 후 ingest 결정.\n- **ADR 시스템 = execute의 binding 제약.** `/hm:plan` 동안 promote 된 ADR은 `/hm:execute`의 hard 제약. 충돌은 blocker로 surface, silent proceed 절대 없음. 미래 세션이 이미 결정된 사항을 재논의하지 않음.\n- **Refdocs search.** 아키텍처 문서, API spec, design 문서를 `harness.yaml`에 등록. `refdocs-search` skill이 무손실 full-text search 제공 — 청킹 없음, RAG 인덱스 없음.\n- **선택적 Second Brain.** Obsidian vault 통합. Note 타입별 (decision · preference · failure · project · reference · journal) allowlist 된 쓰기 폴더. 플러그인 재설치나 머신 이동에도 세션 간 메모리 생존.\n- **Brownfield-safe 업그레이드.** `Reconciler`가 기존 `.claude/`를 hash하고 충돌별 keep/replace/both 제공. 적용은 timestamped backup과 함께 ADD-only. 사용자 편집이 silent 덮어쓰여지지 않음.\n\n### 🌀 무방부패 — *생태계 변화를 견딘다*\n\n- **4-소스 주간 크롤.** Anthropic 블로그/changelog · `anthropics/claude-code` GitHub releases · arxiv cs.SE/CL/CR · OSV.dev CVE. `/hm:health`에서 `pending` 항목으로 manifest됨.\n- **적응형 relevance filter.** Threshold 0.7로 시작, 소스별 accept/reject 이력 기반 ±0.05 조정. 항상 수동 확인 — `--auto-apply` 경로는 존재하지 않음.\n- **통합 health 감사.** `/hm:health`가 세 개의 orthogonal 레이어 — Structural (70% 결정적 + 25% LLM rubric + 5% 캐시 진단), External Risks (anti-rot pending 큐), Personalization (Bronze→Platinum tier) — 를 합성. `.claude/observability/dashboard.md`에 3-섹션 대시보드. Auto-apply 절대 없음 (ADR-001).\n- **SessionStart drift 알림.** 매 세션 오픈 시 hook이 실행되어, 실행 중인 플러그인 버전이 하네스를 렌더한 버전과 다르면 경고 — `/plugin update` 후 재렌더가 필요하다는 신호. 감지기가 최신 캐시된 플러그인 버전과 비교 (import된 `__version__`만이 아님).\n- **Cache-miss 분류.** Prompt-cache 진단이 `min_threshold` · `invalidation` · `ttl` · `first` (cold start) 보고. AI-readiness의 5% 가중치가 cold-start 미스 (양성)와 구조적 미스 (actionable)을 구분.\n\n### 🎛️ 다중 IDE — *하나의 source, 모든 IDE*\n\n- **하나의 하네스, 세 개의 target.** Claude Code + Cursor (2.4+, 3.0+ 권장) + Codex CLI. 단일 `.claude/` source tree; Cursor가 native로 읽고 자신의 `.cursor/`로 hook과 rule 받음; Codex는 `.codex/`, `AGENTS.md`, `.agents/skills/`. 모두 하나의 `harness.yaml`에서 렌더.\n- **외부 AI 설정 마이그레이션.** 6개의 알려진 외부 설정 감지 (`.cursor/rules/`, `AGENTS.md`, `CLAUDE.md`, `.continue/config.json`, `.aider.conf.yml`, `.github/copilot-instructions.md`). LLM이 harness.yaml 축으로 번역. `@hm:harness:*` inverted 마커가 재렌더 너머에서도 동기화 유지.\n- **Sibling repos.** Frontend + backend + library가 harness.yaml의 상대 경로로 한 세션에 바인딩. 머신 간 portable (상대 경로가 `git clone`을 견딤).\n\n### 🔁 워크플로 프리미티브 — *나머지 툴체인*\n\n- **구현 전 깊은 인터뷰.** `/hm:spec`이 6-카테고리 인터뷰 (Intent → Outcomes → In-Scope Scenarios → Non-Goals → Constraints → Verification)를 완전성 점수화하여 실행. `/hm:plan`이 9-카테고리 인터뷰 (scope → architecture → contract → risk → testing → phasing → dependencies → failure handling → observability)를 impact 순서로 실행. 모든 settled 결정이 binding ADR로 promote.\n- **적응형 인터뷰 + 4-게이트 수렴 autoloop.** `/hm:loop`이 time-and-iteration-bounded 루프 실행. `autoloop-driver`가 goal을 읽고 누락된 것만 질문, loop intensity + exit checklist lock, 그 후 mechanical check + LLM judgment + regression 비교 + 2-iter convergence streak가 완료 수락 전 모두 필요.\n- **3-tier 컨텍스트 로딩 + compaction 복구.** Hot tier (오늘 session) · Warm tier (failures + wiki 첫 60/40줄) · Cold tier (git log / PLAN on demand). `PreCompact` hook이 context compaction 전에 session flush; 다음 turn이 마커를 감지하고 마지막 in-progress phase에서 resume.\n- **Cross-process 메모리 안전성.** `.claude/memory/` 쓰기는 re-entrant POSIX flock으로 serialize. Telemetry hook이 `O_APPEND`에 raw `os.write()`로 원자적 append (single-syscall, ≤PIPE_BUF) — concurrent Claude Code + Cursor 세션이 JSONL 라인을 interleave 불가.\n\n각 기능의 완전한 메커니즘 — 모든 절차, 결정 경로, 내부 invariant — 는 [**docs/HOW-IT-WORKS.md**](docs/HOW-IT-WORKS.md) 참조.\n\n---\n\n## 안정성\n\nharness-maker는 `0.x` 단계이며 1.0 약속이 정직해질 만큼의 의존 프로젝트가 누적되기 전까지는 이 상태를 유지합니다 ([ADR-001 in `work-docs/PLAN-oss-readiness-audit.md`](work-docs/PLAN-oss-readiness-audit.md) 참조).\n\n**고정 표면(Frozen surfaces)** — deprecation cycle 없이는 어떤 0.x.minor에서도 깨지지 않습니다:\n\n- **슬래시 명령 이름**: `/hm:make`, `/hm:research`, `/hm:plan`, `/hm:execute`, `/hm:review`, `/hm:wrapup`, `/hm:verify`, `/hm:health`, `/hm:loop`, `/hm:configure`, `/hm:personalization-audit`, `/harness-maker:make`.\n- **`harness.yaml` 최상위 키**: `targets`, `preset`, `dev_mode`, `locale`, `reviewers`, `skills`, `agents`, `worktree`, `anti_rot`, `observability`, `ref_folders`, `second_brain`, `recommended_model`.\n- **Plugin manifest 스키마**: `.claude-plugin/plugin.json`, `.cursor-plugin/plugin.json`, `.codex-plugin/plugin.json` — 각 marketplace 공식 spec에 포함된 필드들.\n- **로컬 전용 telemetry 보장** — [`PRIVACY.md`](PRIVACY.md) 참조. 문서-vs-실제 불일치는 P0 버그로 취급합니다.\n\n**그 외 모든 것은 어떤 0.x.minor 에서든 바뀔 수 있습니다.** 내부 Python API, `.claude/observability/` 파일 포맷, 템플릿 내용, ADR 번호 부여, reviewer 프롬프트 표현, 인터뷰 문구. 1.0 전 reproducibility가 중요하다면 특정 릴리스로 핀 (`uvx --from harness-maker==0.17.0 ...`) 사용을 권장합니다.\n\n**실제로 \"깨진다\"는 게 어떤 모양인지** — [`CHANGELOG.md`](CHANGELOG.md) 참조. 같은 minor 안의 patch (예: 0.15.0 → 0.15.3) 들은 deprecation 없이 직전 patch의 수정을 다시 손본 적이 있습니다. 0.x 단계의 의도된 속도입니다.\n\n---\n\n## 더 읽기\n\n기술적 상세 (Requirements · How it works · Slash commands · Comparison · Configuration · Targets · Reconcile rules · Observability · Marketplace · FAQ · Roadmap · Development · Contributing) 는 영문 [README.md](README.md) 참조.\n\n## 라이선스\n\nMIT — [LICENSE](LICENSE) 참조.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecro%2Fharness-maker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fecro%2Fharness-maker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fecro%2Fharness-maker/lists"}