Skip to content

Ralph Loop - Intelligent Iterative Code Improvement

JikiME-ADK의 지능적 반복 코드 개선 시스템. LSP/AST-grep 피드백 기반의 자동화된 코드 수정 루프.

Overview

Ralph Loop는 Claude Code의 공식 플러그인인 "Ralph Wiggum"에서 영감을 받아 구현되었지만, 단순 반복이 아닌 진단 기반 지능적 반복을 제공합니다.

차별화 포인트

기존 Ralph (단순)JikiME Ralph (지능적)
단순 프롬프트 반복LSP/AST-grep 피드백 기반 반복
에러 0개 = 완료에러 기반 자동 계속 + 다중 조건
상태 없음DiagnosticSnapshot 이력 추적
고정 조건적응형 완료 조건
수동 시작 필수자동 감지 및 계속

Architecture

핵심 컴포넌트

┌─────────────────────────────────────────────────────────────┐
│                    Ralph Loop System                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │ start-loop  │    │  stop-loop  │    │ cancel-loop │     │
│  │   (수동)    │    │   (자동)    │    │   (수동)    │     │
│  └─────────────┘    └─────────────┘    └─────────────┘     │
│         │                  │                  │             │
│         └──────────┬───────┴──────────┬──────┘             │
│                    │                  │                     │
│              ┌─────▼─────┐     ┌──────▼──────┐             │
│              │ LoopState │     │  Diagnostic  │             │
│              │   (.json) │     │  Snapshot    │             │
│              └───────────┘     └─────────────┘             │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              PostToolUse Hooks                       │   │
│  │  ┌────────────┐  ┌─────────────┐  ┌────────────┐   │   │
│  │  │ post-tool- │  │ post-tool-  │  │ post-tool- │   │   │
│  │  │    lsp     │  │  ast-grep   │  │   linter   │   │   │
│  │  └────────────┘  └─────────────┘  └────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

구현 파일 목록

Go Hook 파일

파일설명
cmd/hookscmd/loop_state.goLoopState, DiagnosticSnapshot, CompletionCriteria 구조체
cmd/hookscmd/start_loop.go루프 시작 커맨드 (jikime hooks start-loop)
cmd/hookscmd/stop_loop.go완료 조건 판정 및 자동 계속 로직
cmd/hookscmd/cancel_loop.go루프 취소 커맨드 (jikime hooks cancel-loop)
cmd/hookscmd/post_tool_lsp.goLSP 결과 스냅샷 기록
cmd/hookscmd/post_tool_ast_grep.goAST-grep 결과 스냅샷 기록

Skill/Command 파일

파일설명
templates/.claude/skills/jikime-workflow-loop/SKILL.mdRalph Loop 워크플로우 스킬
templates/.claude/commands/jikime/loop.md/jikime:loop 슬래시 커맨드

설정 파일

파일Hook 등록
templates/.claude/settings.jsonStop Hook, PostToolUse Hooks 등록

Data Structures

LoopState

루프 세션의 전체 상태를 관리합니다.

go
type LoopState struct {
    // Basic info
    Active           bool      `json:"active"`
    SessionID        string    `json:"session_id"`
    StartedAt        time.Time `json:"started_at"`
    UpdatedAt        time.Time `json:"updated_at"`

    // Iteration info
    Iteration        int       `json:"iteration"`
    MaxIterations    int       `json:"max_iterations"`

    // Task info
    TaskDescription  string    `json:"task_description"`
    TargetFiles      []string  `json:"target_files,omitempty"`

    // Completion criteria
    Criteria         CompletionCriteria `json:"completion_criteria"`

    // Diagnostic history
    Snapshots        []DiagnosticSnapshot `json:"snapshots"`

    // Final result
    CompletionReason string    `json:"completion_reason,omitempty"`
    FinalStatus      string    `json:"final_status,omitempty"`
}

DiagnosticSnapshot

각 반복에서의 진단 결과를 캡처합니다.

go
type DiagnosticSnapshot struct {
    Iteration      int       `json:"iteration"`
    Timestamp      time.Time `json:"timestamp"`

    // LSP diagnostics
    ErrorCount     int       `json:"error_count"`
    WarningCount   int       `json:"warning_count"`
    InfoCount      int       `json:"info_count"`

    // AST-grep results
    SecurityIssues int       `json:"security_issues"`

    // Test results
    TestsPassed    bool      `json:"tests_passed"`
    TestsRun       int       `json:"tests_run"`
    TestsFailed    int       `json:"tests_failed"`

    // File details
    FileDetails    []FileDetail `json:"file_details,omitempty"`
}

CompletionCriteria

완료 조건을 정의합니다.

go
type CompletionCriteria struct {
    ZeroErrors      bool `json:"zero_errors"`       // 에러 0개 필수
    ZeroWarnings    bool `json:"zero_warnings"`     // 경고 0개 필수
    ZeroSecurity    bool `json:"zero_security"`     // 보안이슈 0개 필수
    TestsPass       bool `json:"tests_pass"`        // 테스트 통과 필수
    StagnationLimit int  `json:"stagnation_limit"`  // 개선 없는 반복 한계
}

Execution Flow

자동 동작 흐름 (기본)

사용자: "TypeScript 에러 수정해줘"


   Claude가 작업 수행 (Edit/Write)


   PostToolUse Hooks 자동 실행
   - post-tool-lsp → 스냅샷 기록
   - post-tool-ast-grep → 스냅샷 기록


   Claude 응답 완료 시도


   Stop Hook (stop-loop) 자동 실행


   ┌─────────────────────────────────────┐
   │ 1. 완료 마커 감지?                  │
   │    YES → exit 0 (강제 종료)         │
   │                                     │
   │ 2. 진단 수집 (ruff, tsc)            │
   │                                     │
   │ 3. 에러 > 0 또는 보안이슈 > 0?      │
   │    YES → exit 1 (자동 계속)         │
   │    NO  → exit 0 (정상 종료)         │
   └─────────────────────────────────────┘

        ├── exit 0 → Claude 정상 종료

        └── exit 1 → 피드백 재주입 → Claude 계속 작업
                     "Ralph Loop: AUTO-CONTINUE |
                      5 error(s) remaining |
                      Next: Fix the remaining errors"

명시적 루프 흐름 (고급)

bash
# 1. 루프 시작 (옵션 지정 가능)
jikime hooks start-loop --task "Fix all errors" --max-iterations 10

# 2. Claude 작업 수행
# ... (PostToolUse hooks가 스냅샷 수집)

# 3. Stop Hook이 완료 조건 평가
# - ZeroErrors 체크
# - Stagnation 감지
# - MaxIterations 체크

# 4. 완료 또는 계속
# exit 0: 완료 / exit 1: 계속

# 5. 취소 (필요시)
jikime hooks cancel-loop

Auto-Loop Mechanism

핵심 로직 (stop_loop.go)

go
func runStopLoop(cmd *cobra.Command, args []string) error {
    // 1. 완료 마커 체크 (최우선)
    if checkCompletionPromise(conversationText) {
        return nil // exit 0 - 완료
    }

    // 2. 진단 수집
    currentSnapshot := collectCurrentDiagnostics()

    // 3. 루프 상태 확인
    state := LoadEnhancedLoopState()

    // 4. AUTO-LOOP: 루프가 비활성이어도 에러가 있으면 자동 계속
    if !state.Active {
        if currentSnapshot.ErrorCount > 0 || currentSnapshot.SecurityIssues > 0 {
            // 피드백 출력 후 계속
            os.Exit(1) // exit 1 - 계속
        }
        return nil // exit 0 - 에러 없음
    }

    // 5. 명시적 루프 로직 (생략)
    // ...
}

진단 수집 방법

go
func collectCurrentDiagnostics() DiagnosticSnapshot {
    snapshot := DiagnosticSnapshot{}

    // Python: ruff check
    if _, err := exec.LookPath("ruff"); err == nil {
        cmd := exec.Command("ruff", "check", "--output-format=json", ".")
        // E*, F* 코드 → ErrorCount
        // 그 외 → WarningCount
    }

    // TypeScript: tsc --noEmit
    if _, err := exec.LookPath("tsc"); err == nil {
        cmd := exec.Command("tsc", "--noEmit", "--pretty", "false")
        // "error" 포함 라인 → ErrorCount
    }

    // 테스트: pytest / npm test
    snapshot.TestsPassed, _ = checkTests()

    return snapshot
}

Usage

자동 모드 (기본)

특별한 명령어 없이 일반 프롬프트를 사용하면 자동으로 동작합니다.

사용자: TypeScript 에러 모두 수정해줘

Claude: (작업 수행)

Stop Hook: 에러 5개 감지 → 자동 계속

Claude: (계속 작업)

Stop Hook: 에러 0개 → 자동 종료

명시적 커맨드

bash
# 기본 사용
/jikime:loop "Fix all TypeScript errors"

# 옵션 지정
/jikime:loop "Remove security vulnerabilities" --max-iterations 5 --zero-security

# 특정 디렉토리
/jikime:loop @src/services/ "Fix all lint errors" --zero-warnings

# 테스트 통과까지
/jikime:loop "Fix failing tests" --tests-pass --max-iterations 10

# 취소
/jikime:loop --cancel

CLI 직접 실행

bash
# 루프 시작
jikime hooks start-loop \
  --task "Fix all errors" \
  --max-iterations 10 \
  --zero-errors \
  --tests-pass

# 루프 취소
jikime hooks cancel-loop

Completion Markers

Claude가 작업 완료를 선언할 때 사용하는 마커입니다.

<jikime>DONE</jikime>
<jikime>COMPLETE</jikime>
<jikime:done />
<jikime:complete />

이 마커 중 하나가 감지되면 에러 유무와 관계없이 즉시 종료됩니다.

Completion Criteria

옵션

옵션플래그기본값설명
Zero Errors--zero-errorstrue에러 0개 필수
Zero Warnings--zero-warningsfalse경고 0개 필수
Zero Security--zero-securityfalse보안이슈 0개 필수
Tests Pass--tests-passfalse테스트 통과 필수
Max Iterations--max-iterations10최대 반복 횟수
Stagnation Limit--stagnation-limit3개선 없는 반복 한계

종료 조건

  1. 완료 마커 감지: 즉시 종료 (exit 0)
  2. 모든 조건 충족: 에러 0개 등 → 종료 (exit 0)
  3. 최대 반복 도달: MaxIterations 초과 → 종료 (exit 0)
  4. 정체 감지: N회 연속 개선 없음 → 종료 (exit 0)
  5. 에러 없음 (자동 모드): 에러 0개 + 보안이슈 0개 → 종료 (exit 0)

Safety Features

1. 최대 반복 제한

go
if state.Iteration >= state.MaxIterations {
    state.FinalStatus = "STOPPED"
    state.CompletionReason = "Max iterations reached"
    os.Exit(0)
}

2. 정체 감지

go
func (s *LoopState) IsStagnant() bool {
    // 최근 N회 반복에서 개선이 없으면 정체로 판단
    recent := s.Snapshots[len(s.Snapshots)-limit:]
    // 이슈 수가 감소하지 않으면 true
}

3. 비활성화

bash
# 환경변수로 비활성화
export JIKIME_DISABLE_LOOP_CONTROLLER=1

4. 수동 취소

bash
jikime hooks cancel-loop
# 또는
/jikime:loop --cancel

Configuration

settings.json Hook 등록

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "jikime hooks post-tool-ast-grep",
            "timeout": 30000
          },
          {
            "type": "command",
            "command": "jikime hooks post-tool-lsp",
            "timeout": 30000
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "jikime hooks stop-loop",
            "timeout": 10000
          }
        ]
      }
    ]
  }
}

Feedback Messages

AUTO-CONTINUE (자동 계속)

Ralph Loop: AUTO-CONTINUE | Issues detected - continuing automatically |
5 error(s) remaining | 2 security issue(s) remaining |
Next: Fix the remaining errors | Output <jikime:done /> when complete

CONTINUE (명시적 루프)

Ralph Loop: CONTINUE | Iteration: 3/10 |
Current: 5 error(s), 12 warning(s), 0 security issue(s) |
Progress: 45% improvement | Next: Fix 5 remaining error(s)

COMPLETE (완료)

Ralph Loop: COMPLETE - All conditions satisfied |
Session: loop-1705912345 | Iterations: 5 |
Total improvement: 100% | Initial: 12 errors, 28 warnings |
Final: 0 errors, 8 warnings

Integration with DDD

Ralph Loop는 Domain-Driven Development 워크플로우와 통합됩니다.

┌─────────────────────────────────────────────────────────────┐
│                   DDD + Ralph Loop                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ANALYZE: 루프가 진단 데이터 수집                           │
│     ↓                                                       │
│  PRESERVE: 각 반복에서 기존 동작 검증                       │
│     ↓                                                       │
│  IMPROVE: 측정 가능한 진행률로 점진적 수정                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Troubleshooting

루프가 시작되지 않음

bash
# 다른 루프가 활성 상태인지 확인
jikime hooks cancel-loop

# CLI 설치 확인
jikime --version

루프가 멈추지 않음

bash
# 완료 마커 출력
# Claude에게 "<jikime:done />" 출력하도록 요청

# 또는 강제 취소
/jikime:loop --cancel

진단이 수집되지 않음

bash
# 도구 설치 확인
which ruff
which tsc

# 프로젝트 설정 확인
ls tsconfig.json
ls pyproject.toml

Hook이 동작하지 않음

bash
# settings.json 확인
cat .claude/settings.json | jq '.hooks.Stop'

# 수동 테스트
echo '{"messages":[]}' | jikime hooks stop-loop

Version History

VersionDateChanges
1.0.02026-01-22초기 구현 - 에러 기반 자동 계속

References

Released under the MIT License.