Skip to content

dancinlab/harness

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

102 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

harness

ํ”„๋กœ์ ํŠธ ๋ฌด๊ด€(project-agnostic) AI ์ฝ”๋”ฉ ํ•˜๋„ค์Šค โ€” ์–ด๋А repo ์—๋“  ๋“œ๋กญ์ธ. ์‹คํ–‰ยทํŒŒ์ผยทํ”„๋กฌํ”„ํŠธ ๋‹จ๊ณ„์— ๋ผ์–ด๋“ค์–ด ๊ทœ์น™์„ ๊ฐ•์ œํ•˜๊ณ , ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ append-only JSONL ๋กœ ๋‚จ๊ธด๋‹ค.

๐Ÿ”ง ํ•˜๋„ค์Šค = "AI ์ฝ”๋”ฉ ๋ณด์•ˆ๊ฒ€์ƒ‰๋Œ€" โ€” AI ์—์ด์ „ํŠธ(Claude Code / Codex ๋“ฑ)๊ฐ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ๊ณ ์น˜๊ธฐ ์ง์ „ยท์งํ›„์— ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต๊ณผ์‹œ์ผœ, ์œ„ํ—˜ํ•œ ๋™์ž‘์€ ๋ง‰๊ณ (block) ์ž ๊ธˆ ํŒŒ์ผ ์ˆ˜์ •์€ ๊ฒฝ๊ณ (warn)ํ•˜๋ฉฐ ๊ฒ€์ฆยท์ธ๊ณ„๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค. ESLint ๊ฐ€ "์ฝ”๋“œ ๋ฌธ๋ฒ•"๋งŒ ๋ณธ๋‹ค๋ฉด, ํ•˜๋„ค์Šค๋Š” ๋ช…๋ น ์‹คํ–‰ยทํŒŒ์ผ ์ž ๊ธˆยท๊ฒ€์ฆยท์„ธ์…˜ ์ธ๊ณ„๊นŒ์ง€ ์ž‘์—… ํ๋ฆ„ ์ „์ฒด๋ฅผ ๋‹จ์†ํ•œ๋‹ค.

์ด ์ €์žฅ์†Œ๋Š” dancinlab ์˜ ๋ชจ๋“  repo(edge ยท anima ยท โ€ฆ)๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์—”์ง„์ด๋‹ค. ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ harness.config.json + .harness/*.json(๊ทœ์น™ ๋ฐ์ดํ„ฐ)๋ฟ์ด๊ณ , .ts ์—”์ง„ ์ฝ”๋“œ๋Š” ์ „๋ถ€ ๊ณต์œ ํ•œ๋‹ค.

๐ŸŒ ์–ธ์–ด ๋ฌด๊ด€: ์›น๋ฟ ์•„๋‹ˆ๋ผ Python ยท Rust ยท C/C++ ยท Go ยท Swift ยท hexa ๋กœ์ปฌ/๋ชจ๋ฐ”์ผ ์•ฑ์—๋„ ์“ด๋‹ค. init ์ด ์Šคํƒ์„ ๊ฐ์ง€ํ•ด ๊ฒ€์ฆ ๋ช…๋ น(cargo/pytest/swift build/โ€ฆ)๊ณผ ๋‹ค๊ตญ์–ด ์šฐํšŒํŒจํ„ด(# type: ignoreยท#[allow]ยทswiftlint:disableโ€ฆ)์„ ์ž๋™ ์ ์šฉ. ์—”์ง„ ์‹คํ–‰์— ๊ฐœ๋ฐœ๋จธ์‹  Node 1๊ฐœ๋งŒ ํ•„์š”(ํƒ€๊นƒ ๋นŒ๋“œ์™€ ๋ฌด๊ด€). โ†’ docs/languages.md

[ edge repo ]โ”€โ”€โ”
[ anima repo ]โ”€โ”ผโ”€โ”€โ–ถ ๊ฐ™์€ .ts ์—”์ง„ (์ด repo)
[ ๋‹ค๋ฅธ repo  ]โ”€โ”€โ”˜        โ–ฒ
                         โ”‚ ๊ฐ์ž harness.config.json + .harness/*.json ์œผ๋กœ
                         โ””โ”€ ๊ทœ์น™๋งŒ ๋‹ค๋ฅด๊ฒŒ ์ฃผ์ž…

์„ค๊ณ„ ์›์น™ (H1โ€“H5)

# ์›์น™ ์˜๋ฏธ
H1 ์„ฑ๊ณต์€ ์กฐ์šฉ, ์‹คํŒจ๋Š” ์‹œ๋„๋Ÿฝ๊ฒŒ ํ†ต๊ณผ ์‹œ stdout ์นจ๋ฌต, ์‹คํŒจ๋งŒ stderr (JSON)
H2 ์ž๋™ ์ˆ˜์ • ์•ˆ ํ•จ ์ œ์•ˆยท์ฐจ๋‹จยท๊ฒฝ๊ณ ๋งŒ. ๊ณ ์น˜๋Š” ๊ฑด ์‚ฌ๋žŒ/์—์ด์ „ํŠธ
H3 bitter-gate ์ƒˆ ๊ทœ์น™ ์ถ”๊ฐ€ ์ „, ์•ˆ ์“ฐ๋Š”(dormant) ๊ทœ์น™ ๋จผ์ € ํ๊ธฐ
H4 config ์ฃผ๋„ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ์ƒ‰์ฑ„๋Š” ๋ฐ์ดํ„ฐ(JSON)๋กœ. ์—”์ง„ ์ฝ”๋“œ๋Š” ๋ถˆ๋ณ€
H5 AI-native ๋ชจ๋“  ์‚ฐ์ถœ๋ฌผ JSONL append-only (.harness/logs/*.jsonl)

๊ตฌ์กฐ

harness/
โ”œโ”€โ”€ bin/harness          ์‹คํ–‰ ์ž…๊ตฌ (bash โ€” tsx ๋Ÿฐํƒ€์ž„ ์ž๋™ํƒ์ƒ‰)
โ”œโ”€โ”€ cli/index.ts         ๋””์ŠคํŒจ์ฒ˜ (harness lint โ†’ lint.ts)
โ”œโ”€โ”€ lib/                 ๊ณต์šฉ ๋ถ€ํ’ˆ
โ”‚   โ”œโ”€โ”€ paths.ts         repo-root ์ž๋™ํƒ์ƒ‰ (harness.config.json / .git ์ƒํ–ฅ ํƒ์ƒ‰)
โ”‚   โ”œโ”€โ”€ config.ts        harness.config.json ๋กœ๋“œ + ๊ธฐ๋ณธ๊ฐ’ ๋จธ์ง€
โ”‚   โ”œโ”€โ”€ lockdown.ts      L0(์ž ๊ธˆ) ํŒŒ์ผ ๋ชฉ๋ก (config + ๐Ÿ”ด ๋งˆํฌ๋‹ค์šด ๋ธ”๋ก ํŒŒ์‹ฑ)
โ”‚   โ”œโ”€โ”€ log.ts json.ts exec.ts
โ”œโ”€โ”€ modules/             ๊ธฐ๋Šฅ 12์ข… (์•„๋ž˜ ํ‘œ)
โ”œโ”€โ”€ config/              ๋ฒˆ๋“ค ๊ธฐ๋ณธ ๊ทœ์น™ (๋„๋ฉ”์ธ-๋ฌด๊ด€)
โ”‚   โ”œโ”€โ”€ enforcement.json   ์‹คํ–‰/์“ฐ๊ธฐ ์ฐจ๋‹จ ๊ทœ์น™ + ํ”„๋กฌํ”„ํŠธ ํžŒํŠธ
โ”‚   โ”œโ”€โ”€ keywords.json      ํ”„๋กฌํ”„ํŠธ ํ‚ค์›Œ๋“œ ํŠธ๋ฆฌ๊ฑฐ
โ”‚   โ””โ”€โ”€ severity-map.json  ์˜ค๋ฅ˜ severity ๋ถ„๋ฅ˜
โ””โ”€โ”€ harness.config.example.json

๋ช…๋ น (modules)

๋ช…๋ น ์—ญํ•  hook ๋‹จ๊ณ„
pre bash / pre write enforcement ๊ทœ์น™ ๋งค์นญ โ†’ block/warn PreToolUse
post bash <exit> / post edit <file> ๊ฒฐ๊ณผ ๊ธฐ๋ก, 0โ‰ exit ๋ผ์šฐํŒ…, L0 ํŽธ์ง‘ ๊ฒฝ๊ณ  PostToolUse
prompt <text> ํ‚ค์›Œ๋“œ ํŠธ๋ฆฌ๊ฑฐ + ํ”„๋กฌํ”„ํŠธ ํžŒํŠธ ์ฃผ์ž… UserPromptSubmit
architecture {inject|show} repo-root ARCHITECTURE.json(์šฐ์„ )/.md ๋ฅผ ์ปจํ…์ŠคํŠธ๋กœ ์ฃผ์ž… โ€” CLAUDE.md ์ฒ˜๋Ÿผ ์ฒซ ํ„ด๋ถ€ํ„ฐ ์„ค๊ณ„ SSOT ์ƒ์ฃผ (80KB ์ดˆ๊ณผ ์‹œ ์ ˆ๋‹จ, ๋ถ€์žฌ ์‹œ ๋ฌด์Œ) SessionStart
lint [all|fast] staged-L0 + ์‹ ์„ ๋„ + CHANGELOG ๋ˆ„๋ฝ + ์ˆ˜๋ ด ๋ˆ„๋ฝ ์ฒดํฌ commit ์ „ (git pre-commit hook)
verify [all|fast|list] config ์˜ ๊ฒ€์ฆ ๋ช…๋ น ๋ณ‘๋ ฌ ์‹คํ–‰ (์‹คํŒจ 1๊ฐœ๋ผ๋„ โ†’ exit 1) commit/push ์ „
errors {route|list|drain_check|mark_fixed} ์˜ค๋ฅ˜ severity ๋ถ„๋ฅ˜ + ํ ์ƒ์‹œ
ledger {register|complete|list|gc|dup_check} ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—์ด์ „ํŠธ ์ž‘์—… ๋“ฑ๋ก(์ค‘๋ณต ๋ฐฉ์ง€) Agent ์ „/ํ›„
bitter-gate audit [window] ๊ทœ์น™ ํžˆํŠธ ๋นˆ๋„ โ†’ dormant ๊ทœ์น™ ํ๊ธฐ ๊ฒ€ํ†  ๊ทœ์น™ ์ถ”๊ฐ€ ์ „
audit [full|summary|json] 6์ถ• ์ž๊ฐ€ ์Šค์ฝ”์–ด์นด๋“œ (/60) ์ฃผ๊ธฐ์ 
gc [scan|drift] ๊ฐ€์ด๋“œ ๋งˆํฌ๋‹ค์šด์˜ ๊นจ์ง„ ๋งํฌ ํƒ์ง€ ์ฃผ๊ธฐ์ 
folders [scan|scaffold <dir>] ์„œ๋ธŒํด๋”๋ณ„ CLAUDE.md ๋ˆ„๋ฝ ํƒ์ง€ + ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ (ํŽธ์ง‘ ์‹œ ์ž๋™ ๋„›์ง€) ์ฃผ๊ธฐ์ /์ž‘์—… ์ค‘
handoff [reason] ์„ธ์…˜ ์Šค๋ƒ…์ƒท โ†’ .harness/handoff/ ์„ธ์…˜ ์ข…๋ฃŒ
convergence {status|recompute|by-category} (์„ ํƒ) incident ์ˆ˜๋ ด ์ถ”์  ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„
sync {run|diff} (์„ ํƒ) repo ์ž์ฒด ๊ณต์œ ํŒŒ์ผ sync ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๊ณต์œ ํŒŒ์ผ ๋ณ€๊ฒฝ ํ›„
pool {list|add|rm|on <h> <cmd>|status|specs [h]} ํ˜ธ์ŠคํŠธ ๋กœ์Šคํ„ฐ + ์›๊ฒฉ ์‹คํ–‰. shared:false ํ˜ธ์ŠคํŠธ๋Š” ์ œํ•œ ํ˜ธ์ŠคํŠธ โ€” allow ํ”„๋กœ์ ํŠธ ์ปจํ…์ŠคํŠธ ๋ฐ–์—์„  on ์ฐจ๋‹จ(๊ณต์šฉ ์ปดํ“จํŠธ๋กœ ๋ชป ์”€). on ์€ ssh ๋ฅผ ์ง์ ‘ spawn(argv)ํ•ด cmd ์˜ $/$(...) ๊ฐ€ ๋กœ์ปฌ์ด ์•„๋‹ˆ๋ผ ์›๊ฒฉ ์…ธ์—์„œ ์ „๊ฐœ๋จ. specs ๋Š” ํ˜ธ์ŠคํŠธ๋ณ„ ์ฝ”์–ด/๋ฉ”๋ชจ๋ฆฌ/GPU ๋ฅผ ssh ํ”„๋กœ๋ธŒํ•ด ๋กœ์Šคํ„ฐ์— ์บ์‹œ(listยทstatus ์— ใ€ˆ12c ยท 30G ยท GPU:โ€ฆใ€‰ ์ธ๋ผ์ธ ํ‘œ๊ธฐ) โ€” ์ œํ•œ ํ˜ธ์ŠคํŠธ๋Š” ํ”„๋กœ๋ธŒํ•˜์ง€ ์•Š์Œ ์›๊ฒฉ ์‹คํ–‰ ยท ์ž์› ํ™•์ธ ์‹œ

๋น ๋ฅธ ์‹œ์ž‘

1. ํ•˜๋„ค์Šค๋ฅผ repo ์— ๋‘”๋‹ค (submodule ๊ถŒ์žฅ)

cd your-repo
git submodule add https://github.com/dancinlab/harness .harness-engine
# ๋˜๋Š” ๊ทธ๋ƒฅ clone / vendor ํ•ด๋„ ๋จ

2. ์Šค์บํด๋”ฉ (ํ•œ ๋ฐฉ)

bash .harness-engine/bin/harness init --hooks

์ด ํ•œ ์ค„์ด ๋งŒ๋“ ๋‹ค (๊ธฐ์กด ํŒŒ์ผ์€ ๋ณด์กด, --force ๋งŒ ์˜ˆ์™ธ ยท --dry-run ์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ):

โœ“ harness.config.json          ํ”„๋กœ์ ํŠธ๋ช… ์ž๋™๊ฐ์ง€
โœ“ .harness/enforcement.json    ๋ฒˆ๋“ค ๊ธฐ๋ณธ ๊ทœ์น™ ๋ณต์‚ฌ (repo ๊ฐ€ ์ˆ˜์ •)
โœ“ .harness/keywords.json
โœ“ .harness/severity-map.json
โœ“ .gitignore                   ๋กœ๊ทธ/handoff ๋ฌด์‹œ ์ถ”๊ฐ€
โœ“ scripts/harness              ์–‡์€ ๋ž˜ํผ
โœ“ .claude/settings.json        hook ๋ฐฐ์„  (--hooks ์ผ ๋•Œ)

์ƒ์„ฑ ํ›„ harness.config.json ์˜ verify.checks ยท lockdown.files ๋งŒ repo ์— ๋งž๊ฒŒ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.

์ˆ˜๋™ ์„ค์ •๋„ ๊ฐ€๋Šฅ: .harness/*.json ์„ ๋‘์ง€ ์•Š์œผ๋ฉด ๋ฒˆ๋“ค ๊ธฐ๋ณธ ๊ทœ์น™(config/*.json)์ด ์ž๋™ ์ ์šฉ๋œ๋‹ค.

์ œ๊ฑฐ: harness uninstall (์ฃผ์ž…๋ฌผ๋งŒ ์ œ๊ฑฐ, ์‚ฌ์šฉ์ž ์ฝ˜ํ…์ธ  ๋ณด์กด ยท --dry-run ๋ฏธ๋ฆฌ๋ณด๊ธฐ). ์ƒ์„ธ docs/install.md.

3. ๋™์ž‘ ํ™•์ธ

bash .harness-engine/bin/harness audit
bash .harness-engine/bin/harness ci list

4. ์—์ด์ „ํŠธ hook ๋ฐฐ์„  (Claude Code ์˜ˆ์‹œ)

.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      { "matcher": "Bash",       "hooks": [{ "type": "command", "command": "CLAUDE_TOOL_INPUT=\"$CLAUDE_TOOL_INPUT\" bash .harness-engine/bin/harness pre bash" }] },
      { "matcher": "Write|Edit", "hooks": [{ "type": "command", "command": "CLAUDE_TOOL_INPUT=\"$CLAUDE_TOOL_INPUT\" bash .harness-engine/bin/harness pre write" }] }
    ],
    "PostToolUse": [
      { "matcher": "Write|Edit", "hooks": [{ "type": "command", "command": "bash .harness-engine/bin/harness post edit \"$CLAUDE_FILE_PATH\"" }] }
    ],
    "UserPromptSubmit": [
      { "hooks": [{ "type": "command", "command": "bash .harness-engine/bin/harness prompt \"$CLAUDE_USER_PROMPT\"" }] }
    ]
  }
}

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ด๋ฆ„(CLAUDE_TOOL_INPUT ๋“ฑ)์€ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋„ค์Šค๋Š” CLAUDE_TOOL_INPUT ์™€ CODEX_TOOL_INPUT ๋‘˜ ๋‹ค ์ฝ๋Š”๋‹ค. JSON ํ˜•์‹: {"command":"...","file_path":"...","content":"..."}.

๐Ÿ’ก harness install-hooks [--global|--repo] ๋Š” hook ๋ฐฐ์„ ๊ณผ ํ•จ๊ป˜ settings.json ์˜ env ์— CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 ๋„ ์„ธํŒ…ํ•œ๋‹ค โ€” ๋ฐฑ๊ทธ๋ผ์šด๋“œ subagent ์— SendMessage(agent-teams)๋ฅผ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”. ์ด๋ฏธ ๊ทธ ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž ๊ฐ’์„ ๋ณด์กดํ•œ๋‹ค(๋ฎ์–ด์“ฐ์ง€ ์•Š์Œ). ๋„๋ ค๋ฉด ๊ทธ ํ‚ค๋ฅผ "0" ์œผ๋กœ ๋‘๋ฉด ๋œ๋‹ค.


๋™์ž‘ ํ๋ฆ„

์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ โ”€โ–ถ [prompt]  ํ‚ค์›Œ๋“œ ํŠธ๋ฆฌ๊ฑฐ + ํžŒํŠธ ์ฃผ์ž…
์—์ด์ „ํŠธ Bash   โ”€โ–ถ [pre bash]  โ”€ ๋งค์นญ? โ”€โ–ถ block(stdout JSON) / warn(stderr) / ํ†ต๊ณผ(์นจ๋ฌต)
                      โ”‚
                      โ–ผ (์‹คํ–‰ ํ›„)
                  [post bash <exit>] โ”€ 0โ‰ exit โ”€โ–ถ errors ํ ๋ผ์šฐํŒ…
์—์ด์ „ํŠธ Edit   โ”€โ–ถ [pre write] โ”€ ๊ฒฝ๋กœ/๋‚ด์šฉ ๊ทœ์น™ โ”€โ–ถ block/warn
                  [post edit <file>] โ”€ L0? โ”€โ–ถ ๊ฒฝ๊ณ 
์ปค๋ฐ‹ ์ „          โ”€โ–ถ [lint] + [verify]
์„ธ์…˜ ์ข…๋ฃŒ        โ”€โ–ถ [handoff]

๋ชจ๋“  ๋‹จ๊ณ„๋Š” .harness/logs/*.jsonl ์— ํ•œ ์ค„์”ฉ ์Œ“์ธ๋‹ค โ†’ audit ์ด ์ด๋ฅผ ์ฝ์–ด ๊ฑด๊ฐ•๋„๋ฅผ ์ ์ˆ˜ํ™”ํ•œ๋‹ค.


๋” ์ฝ๊ธฐ

  • docs/languages.md โ€” ์–ธ์–ด/ํ”Œ๋žซํผ ๋ฒ”์šฉ์„ฑ (PythonยทRustยทCยทGoยทSwiftยทhexa ํ”„๋ฆฌ์…‹ + Node ๋Ÿฐํƒ€์ž„ ์š”๊ตฌ)
  • ARCHITECTURE.json โ€” ํ•˜๋„ค์Šค ์•„ํ‚คํ…์ฒ˜ ํŠธ๋ฆฌ SSOT (์ปฌ๋Ÿผํ˜• ๋…ธ๋“œ: ์ด๋ฆ„ยท์—ญํ• ยท๊ตฌ๋ถ„ยท์ƒ์„ธ). ์‚ฌ๋žŒ์šฉ ๋ทฐ์–ด๋Š” ARCHITECTURE.html โ€” ๋กœ์ปฌ์€ python3 serve.py(์„œ๋ฒ„ + ๋ธŒ๋ผ์šฐ์ € ์ž๋™ ์˜คํ”ˆ), ์›๊ฒฉ์€ raw.githack.com / GitHub Pages
  • docs/install.md โ€” repo ํ†ตํ•ฉ ์ƒ์„ธ (submodule / vendor / ๋ฉ€ํ‹ฐ repo)
  • docs/extending.md โ€” ๊ทœ์น™ ์ถ”๊ฐ€, ๋„๋ฉ”์ธ ๋ชจ๋“ˆ ํ™•์žฅ ํŒจํ„ด

self-hosted

์ด repo ์ž์ฒด๊ฐ€ ํ•˜๋„ค์Šค๋ฅผ ์“ด๋‹ค(dogfooding) โ€” harness.config.json(profile:default) + .claude/settings.json self hooks + pre-commit bin/harness lint. ์ฝ”์–ด(.ts) ๋ณ€๊ฒฝ ์‹œ CHANGELOG ๋™์‹œ ๊ฐฑ์‹ ์ด ๊ฐ•์ œ๋˜๊ณ , ๋ฒˆ๋“ค enforcement(root-causeยทsecretยทforce-push)๊ฐ€ ์ž๊ธฐ ์ฝ”๋“œ์—๋„ ์ ์šฉ๋œ๋‹ค. hardcore ์ž๊ธฐ๋ชจ์ˆœ(main ๋ณดํ˜ธยทno-verify ์ฐจ๋‹จ)๋งŒ ๋นผ์„œ ๊ฐœ๋ฐœ ํ๋ฆ„์€ ๋ง‰์ง€ ์•Š๋Š”๋‹ค.

๋งค ์‚ฌ์ดํด(harness pr-cycle)์˜ doc-gate ๋Š” ์˜๋ฏธ์žˆ๋Š” ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด CHANGELOG.md(append) + (์กด์žฌ ์‹œ) ARCHITECTURE.mdยทREADME.md ํ˜„ํ–‰ํ™”๋ฅผ ์š”๊ตฌํ•œ๋‹ค โ€” ์…‹ ์ค‘ ๋ฏธ๊ฐฑ์‹ ์ด ์žˆ์œผ๋ฉด ๋จธ์ง€๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค(--no-doc ๋Š” ์ง„์งœ ๋ฌธ์„œ ๋ถˆํ•„์š”ํ•  ๋•Œ๋งŒ). ์ด README ๋„ ๊ทธ ๋Œ€์ƒ์ด๋ฏ€๋กœ ๋งค ์‚ฌ์ดํด ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค. (commons c14)

๊ฐ™์€ doc-gate ๊ฐ€ pre-commit harness lint ์—์„œ๋„ ๋ฐœํ™”ํ•œ๋‹ค โ€” pr-cycle ์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ์ž‘์—…์ด๋ผ๋„, ์˜๋ฏธ์žˆ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด staged ์ธ๋ฐ CHANGELOG / (์กด์žฌ ์‹œ) ARCHITECTUREยทREADME ๊ฐ€ ๊ฐ™์ด staged ์•ˆ ๋์œผ๋ฉด commit ์„ ์ฐจ๋‹จํ•œ๋‹ค(CHANGELOG-MISSINGยทARCHITECTURE-MISSINGยทREADME-MISSING, ๋ชจ๋‘ block). ์ฆ‰ "๋ชจ๋“  ์ž‘์—… ์ดํ›„" ๋ฌธ์„œ ํ˜„ํ–‰ํ™”๊ฐ€ ๊ฐ•์ œ๋œ๋‹ค. ์ง„์งœ ๋ฌธ์„œ ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ๋งŒ git commit --no-verify.

๋ผ์ด์„ ์Šค

MIT

About

๐Ÿ”ง Project-agnostic AI coding harness โ€” enforcement hooks ยท L0 lockdown ยท lint/verify gates ยท error & work ledgers, all config-driven. Drop into any repo.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages